Forum: PC-Programmierung Komplexe Array-Struktur initialisieren


von VH (Gast)


Lesenswert?

Hallo,

ich möchte ein Array aus structs definieren in denen verschiedene 
Variablentypen enthalten sind. Das ganze sieht wie folgt aus:
1
typedef struct {
2
    int      function;
3
    char*      nameFunction;
4
    enum types typeParameter[NUMBER_WORDS_MAXIMAL - 1];
5
    } structPrototype;
6
7
structPrototype prototype[][NUMBER_WORDS_MAXIMAL] = { ( add_int_a_b(izahl1, izahl2), "add", { INT, INT, NONE, NONE, NONE, NONE, NONE, NONE, NONE } ), 
8
                                                           ( sub_int_a_b(izahl1, izahl2), "sub", { INT, INT, NONE, NONE, NONE, NONE, NONE, NONE, NONE }; ),
9
                                                           ( mul_int_a_b(izahl1, izahl2), "mul", { INT, INT, NONE, NONE, NONE, NONE, NONE, NONE, NONE }; ) };

Ich bekomme jedoch ständig die Fehlermeldung, in den Zeilen der 
Initialisierung wo es heißt "expected an expression". Hab schon die 
ganze Zeit rumprobiert ich komm aber nicht dahinter wie ich das richtig 
initialisieren kann vor allem wenn ich einen enum-type verwenden möchte.

von Robert L. (lrlr)


Lesenswert?

(was auch immer das für Programmiersprache ist)

add_int_a_b

ist das eine funktion?


dass das dort erlaubt ist, glaub ich eher nicht..

von VH (Gast)


Lesenswert?

@Robert L.: Läuft in C und ist eine Funktion, ja. Sollte auch erlaubt 
sein, da meckert er zumindest nicht, aber ich glaub der Compiler hat ein 
Problem mit meiner enum-Initialisierung.

von Sam P. (Gast)


Lesenswert?

Dein Code scheint fälschlicherweise normale statt geschweifte Klammern 
zu enthalten. Prüf die alle mal. Im Initialisierer müssen structs (also 
die einzelnen Array-Elemente) in geschweiften Klammern stehen.

Weitere mögliche Fehlerquellen: Manche Compiler mögen gar keine 
Struct-Array-Initialisierer, und manche Compiler verlangen Konstanten, 
Funktionsaufrufe sind da nicht möglich.

von Sam P. (Gast)


Lesenswert?

Oh, und du bastelst da auch noch wüst Semikolons mittenrein. Das geht so 
auch nicht. Ein Semikolon gehört nur ganz ans Ende einer Anweisung (und 
die Initialisierung ist syntaktisch wie eine Anweisung).

von AVerr (Gast)


Lesenswert?

Ich nehme an, das soll eine Art Taschenrechner werden.
Allerdings habe ich das Gefühl, dass hier ein paar Fehler im Bezug auf 
die Struktur gemacht worden sind.

-Warum ist das Array mehrdimensional, wenn es nur eindimensional befüllt 
wird ?
-Sollte das Struct-Member function nicht lieber ein Funktionspointer 
sein ? So wie ich das sehe, wird hier eine Callback-Funktion vorbereitet 
( daher wohl auch die Parameter-Typenliste )

Die Runden Klammern in der Initialisierung kommen mir etwas komisch vor. 
Bei GCC zumindest initialisierte man einen Struct array mit geschweiften 
Klammern, also
1
pseudoStruct meinArray[2] = { { member1, member 2 }, { member 1, member 2} };

von VH (Gast)


Lesenswert?

Danke Leute, die eine Dimension zuviel hat gestört und die runden 
Klammern waren unnötig. So gehts:
1
structPrototype prototype[] = { { add_int_a_b(izahl1, izahl2), "add", { INT, INT, NONE, NONE, NONE, NONE, NONE, NONE, NONE } }, 
2
                                { sub_int_a_b(izahl1, izahl2), "sub", { INT, INT, NONE, NONE, NONE, NONE, NONE, NONE, NONE } },
3
                                { mul_int_a_b(izahl1, izahl2), "mul", { INT, INT, NONE, NONE, NONE, NONE, NONE, NONE, NONE } } };

von Vlad T. (vlad_tepesch)


Lesenswert?

man kann funktionsaufrufe in Array-Initialisierer schreiben? Das war mir 
neu.
Oder sind das Macros?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Vlad Tepesch schrieb:
> man kann funktionsaufrufe in Array-Initialisierer schreiben?

Ja, wenn die Variable automatisch oder das Programm in C++ ist.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du willst wahrscheinlich sowas wie:
1
extern int add_int_a_b (int, int);
2
extern int sub_int_a_b (int, int);
3
extern int mul_int_a_b (int, int);
4
5
typedef struct
6
{
7
    int (*function)(int,int);
8
    const char* nameFunction;
9
    enum types typeParameter[NUMBER_WORDS_MAXIMAL - 1];
10
} structPrototype;
11
12
structPrototype prototype[][NUMBER_WORDS_MAXIMAL] =
13
{
14
    { add_int_a_b, "add", { INT, INT, NONE, NONE, NONE, NONE, NONE, NONE, NONE }}, 
15
    { sub_int_a_b, "sub", { INT, INT, NONE, NONE, NONE, NONE, NONE, NONE, NONE }},
16
    { mul_int_a_b, "mul", { INT, INT, NONE, NONE, NONE, NONE, NONE, NONE, NONE }}
17
};

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.