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
Nachtrag:
> struct _Beispiel code stBeispiel = {'A',0xFFAA,"ABC"};
muss natürlich heissen:
struct _Beispiel code stBeispiel = {'A',"ABC"};
Sorry.
Ralf
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
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
Warum kein Zeiger, oder legt der Compiler dann den String nicht im Code-Segment an? struct _Beispiel { uchar ucVar1; uchar *ucTest; };
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
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?
@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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.