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


von Ralf A. (warpnine)


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

von Ralf A. (warpnine)


Lesenswert?

Nachtrag:

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

muss natürlich heissen:

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

Sorry.

Ralf

von RainerSp (Gast)


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

von T.Stütz (Gast)


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

von arc (Gast)


Lesenswert?

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

von Ralf A. (warpnine)


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

von arc (Gast)


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?

von Ralf (Gast)


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

von Ralf (Gast)


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

von arc (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.