www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Keil uVision - struct in Codebereich


Autor: Ralf Altmann (warpnine)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich möchte im Code-Bereich ein Struct anlegen. In diesem Struct soll
u.a. ein Text-String stehen. Da für jedes struct ein anderer Text
hinterlegt werden soll, habe ich das struct so deklariert:

struct _Beispiel {
  uchar ucVar1;
  uchar ucTest[];
};

Definiert habe ich das struct dann so:

struct _Beispiel code stBeispiel = {'A',0xFFAA,"ABC"};

Allerdings mault der Compiler:

error C163: 'ucTest': unknown array size

Ist mein Vorhaben so überhaupt möglich?
Oder muss ich etwa für jeden Text ein eigenes struct schreiben?!?

Ralf

Autor: Ralf Altmann (warpnine)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

> struct _Beispiel code stBeispiel = {'A',0xFFAA,"ABC"};

muss natürlich heissen:

struct _Beispiel code stBeispiel = {'A',"ABC"};

Sorry.

Ralf

Autor: RainerSp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ralf!

Wenn sich die Zeichenketten in der Länge nicht so viel nehmen, dann
kannst Du ja als Länge die der längsten Zeichenkette für die Länge des
Feldes nehmen. Dann kann der Compiler auch wieder die Größe des Arrays
feststellen. Bei der Längenberechnung für das Feld aber nicht z.B. die
terminierende Null vergessen, also Länge plus Eins.

Gruß,
Rainer

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorschlag:

struct _Beispiel {
  uchar ucVar1;
  uchar const *ucpTest;  // Zeiger auf einen Konstanten String
};

struct _Beispiel code stBeispiel = {'A',"ABC"};

und warum muß das ganze in CODE ? warum nicht in den dafür vorgesehen
H/F/NCONST ?

Gruss

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum kein Zeiger, oder legt der Compiler dann den String nicht im
Code-Segment an?
struct _Beispiel {
  uchar ucVar1;
  uchar *ucTest;
};

Autor: Ralf Altmann (warpnine)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke für die Antworten.

@RainerSp:

Ich kann zum gegenwärtigen Zeitpunkt noch nicht genau sagen, wie groß
die Texte werden.

@arc:

Ja, das mit den Pointer auf den Text sieht gut aus. Dass ich die Texte
dann nochmal separat definieren muss, kann ich verkraften.

Vielleicht hilft es noch, wenn ich sage wofür ich das struct brauche.
Hätte ich Trottel eigentlich auch früher sagen können. Ich möchte ein
Menü implementieren. Über das struct sollen z.B. der vorhergehende und
der nächste Menüpunkt angegeben werden usw.

Ich vermute, dass ich da früher oder später auch Pointer auf Pointer
brauche. Kann mir jemand sagen, wie ich die anlege?

Vielleicht so:

uchar code ** ucPointer2Pointer;

Ist das so richtig? Ich habe vor, ein Array von Pointern zu verwenden,
die jeweils auf einen anderen Menü-Punkt zeigen. Und da bräuchte ich
das dann (wenn das überhaupt in C geht).

@T.Stütz:
H/F/NCONST kenne ich nicht... Texte werden bei einem 8052 Controller
immer im CODE-Bereich abgelegt, anders kenne ich das nicht, und es gibt
auch keinen Speicher-Bereich ausser CODE, der dafür geeignet wäre.

Ralf

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Texte müssen nicht separat definiert werden, siehe das Beispiel von
T.Stütz.

Zeiger auf Zeiger braucht man auch nicht unbedingt bspw.:
struct Menu {
 uchar key;
 uchar *text;
}
struct Menu Menus[] = { { 'a', "text" }, { 'b' , "text2" } };
oder als (doppelt) verkettete Liste:
struct Menu {
 uchar key;
 uchar *text;
 struct Menu *next, *prev;
}
struct Menu Menus[] = { { 'a', "text", &Menus[1], NULL },
 { 'b' , "text2", &Menus[2], &Menus[0] } };

p.s. ist die ungarische Notation in dem Projekt vorgeschrieben?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@arc:

Okay, danke. Muss das Beispiel erst mal auf mich wirken lassen ;-)

Nein, ungarische Notation ist nicht unbedingt nötig, hab ich mir nur
für die meisten Variablen angeeignet. Wieso? Gibt es ein besseres
System? Oder bringt UN nix?

Ralf

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, ich brauche Pointer auf Pointer doch.
In der struct sollte mittels Pointer auf ein Array von
Funktionspointern verwiesen werden, aber ich bekomm das noch nicht so
ganz hin.

Kennt jemand ne Infoquelle, wo ich das nachlesen kann, wie es gemacht
wird?

Ralf

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktionszeiger sind, wenn man sich an die Syntax gewöhnt hat, auch
nicht komplizierter als gewöhnliche Zeiger.

// Array von Funktionszeiger ohne typedef
char (*array[10])(char);
// mit typedef
typedef char (*callback)(char);
callback array2[10] = { ... };

struct test {
 // ohne typedef
 char (**callbacks)(char);
 // mit typedef
 callback* callbacks2;
};
struct test testVar;

Initialisierung und Aufruf
testVar.callbacks = testVar.callbacks2 = array; // oder array2
char x = testVar.callbacks[1](4);

Zur HN: IMO überflüssig, da zum einen die Typprüfungen vom Compiler
gemacht werden und zum anderen die Lesbarkeit teilweise sehr deutlich
darunter leidet (von unterschiedlichen Auslegungen mal abgesehen).
Besser ist, man beachtet (eigene) Regeln oder hält sich an die Coding
Styles größerer Projekte, zumal die HN ausserhalb der Win32-Welt
eigentlich nirgendwo verwendet wird.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.