Pointer auf Struct und Textausgabe

Gast #613706
Lesenswert?
• ▲
▼
Hallo,
ich benutze den LPC2138 µP und habe folgendes Problem:
Ich möchte einen Text aus der Struktur auslesen und weiß nicht wie:

Ich habe eine Struktur:
typedef struct {
    INT8U ZAHL;
    INT8U NAME[128];
    INT8U DESCRIPTION[128];
    INT8U TYPE[128];
}flash;

einen Pointer auf diese
flash *ptr;
dann noch eine Adresszuweisung der Struktur auf eine Adresse imm 
internen Flash
ptr = (flash*) 0x00070000;

wenn ich aus dem Flash dann lesen möchte:
i= flash->ZAHL; alles OK
ich habe ein Problem damit das array auszuwerten in dem ein Tex´t steht.

Was muß ich beachtet? kann mir da jemand helfen?
#613720
Lesenswert?
• ▲
▼
Was sind denn das für Probleme? Nimmt der Compiler flash.name nicht für 
Zeichenkettenverarbeitende Routinen an? Dann versuch doch statt UINT8 
den Datentyp char zu verwenden! Oder Du mußt
 a) die Zeichenketten als Union definieren
  struct {
    union
    {
     char  s[128];
     UINT8 i[128];
    }name;
  }flash;
 oder b)
 einen Typcast machen:
  (char *) &flash.name[0]

 Beachte auch das die meisten zeichenkettenverarbeitenden Routinen in C 
0-terminierte Zeichenketten erwarten! (D.h. letzter Wert muß 0 sein!)
#613728
Lesenswert?
• ▲
▼
LightCo wrote:

Wie ist das beim LPC2138?
Hat der eine Harvard Architektur?

> wenn ich aus dem Flash dann lesen möchte:
> i= flash->ZAHL; alles OK
> ich habe ein Problem damit das array auszuwerten in dem ein Tex´t steht.
>

Was hast du probiert?

> Was muß ich beachtet? kann mir da jemand helfen?

Vermutung: Ich könnte mir vorstellen, dass ein normales
strcpy() nicht dafür ausgelegt ist, die Zeichen aus dem
Flash Speicher zu holen.
Persönliche Seite #613734
Lesenswert?
• ▲
▼
Der ARM7TDMI im LPC2138 hat eine von-Neumann-Architektur; bei 
Lesezugriffen auf das Flashrom ist exakt genauso zu verfahren wie bei 
Zugriffen auf das RAM.

Mit einem Typecast sollte das Problem lösbar sein:
1
typedef struct {
2
    INT8U ZAHL;
3
    INT8U NAME[128];
4
    INT8U DESCRIPTION[128];
5
    INT8U TYPE[128];
6
} flash;
7

8
flash *ptr;
9

10
ptr = (flash*) 0x00070000;
11

12
printf("%s\n", (char *) (ptr->NAME));

(anstelle von printf ist die gewünschte Stringoperation zu wählen).

> wenn ich aus dem Flash dann lesen möchte:
> i= flash->ZAHL; alles OK

Das ist es unter Garantie nicht,

  i = ptr->ZAHL;

funktioniert. "flash" ist keine Variable, sondern ein Datentyp. Aber ich 
vermute, daß Du Dich eh nur vertippt haben wirst.

[Nachtrag]
An der Adresse 0x70000 liegt auch Flashrom? Mit sinnvollem Inhalt?
#613741
Lesenswert?
• ▲
▼
Rufus t. Firefly wrote:
> Der ARM7TDMI im LPC2138 hat eine von-Neumann-Architektur; bei
> Lesezugriffen auf das Flashrom ist exakt genauso zu verfahren wie bei
> Zugriffen auf das RAM.

Ah. OK.

>
> Mit einem Typecast sollte das Problem lösbar sein:
>
> [c]typedef struct {
>     INT8U ZAHL;
>     INT8U NAME[128];
>     INT8U DESCRIPTION[128];
>     INT8U TYPE[128];
> } flash;

Wobei ich mich sowieso frage, aus welchem Grund ich ein
String-Array als INT8U[] (was immer das auch sein mag)
definieren sollte und nicht einfach als char[].

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.