PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Struct initialisieren funktioniert nicht



Geige123
11-07-2008, 12:57
Hallo,

ich versuche gerade ein in C existierendes Konsolenprogramm mit Qt grafisch umzusetzen.

Dabei entsteht folgende Fehlermeldung:

main.cpp:15: error: two or more data types in declaration of `SimpleLightType'
main.cpp:15: error: `SimpleLightType' must be initialized by constructor, not by
`{...}'

Dazu muss ich sagen, dass die Zeilen, in denen das struct initialisiert wird, 1:1 aus dem C-Programm übernommen worden sind.


Gibt es irgendwelche Einstellungen, die ich am Compiler oder im Makefile ändern muss? Oder wie kann ich das struct alternativ initialisieren? (Da die Definition in einer Api-include-Datei ist, kann ich keinen Konstruktor dazu schreiben)

Viele Grüße,
Karl Eichenmüller

BLUESCREEN3D
11-07-2008, 16:28
Oder wie kann ich das struct alternativ initialisieren? (Da die Definition in einer Api-include-Datei ist, kann ich keinen Konstruktor dazu schreiben)

Wenn es wirklich keinen Konstruktor gibt, dann bleibt dir nur die Möglichkeit, jedem Feld einzeln einen Wert zuzuweisen:

SimpleLightType variable;
variable.dies = 1;
variable.das = 2;
...

locus vivendi
11-07-2008, 20:47
Ich versuche gerade ein in C existierendes Konsolenprogramm mit Qt grafisch umzusetzen.

Dabei entsteht folgende Fehlermeldung:

main.cpp:15: error: two or more data types in declaration of `SimpleLightType'
main.cpp:15: error: `SimpleLightType' must be initialized by constructor, not by
`{...}'

Dazu muss ich sagen, dass die Zeilen, in denen das struct initialisiert wird, 1:1 aus dem C-Programm übernommen worden sind.
Kannst du dazu mehr Quelltext posten? Die Umstände der Fehlermeldung kommen mir seltsam vor. Die Strukturen die du in C mit der { ... } Syntax initialisieren kannst, müssten nämlich auch eigentlich in C++ damit initialisierbar sein. Es könnte also sein, dass wo anders noch etwas faul ist - oder das ich irgendeine Regel, die bei deinem Quelltext wichtig ist, nicht kenne.

Geige123
12-07-2008, 20:55
In main.cpp steht folgendes:


#define TRAINING_NS "http://www.schneider-electric.com/DPWS/2006/03/Training"

struct qname SimpleLightType = {TRAINING_NS, "SimpleLight"};


Und in der Include-Datei steht:


struct qname
{
char * ns; /**< Namespace. */
char * lname; /**< Local name. */
};


Und hier nochmals die Fehlermeldung des Compilers:


main.cpp:15: error: two or more data types in declaration of `SimpleLightType'
main.cpp:15: error: `SimpleLightType' must be initialized by constructor, not by
`{...}'


Woran kann es liegen?

locus vivendi
12-07-2008, 21:50
Also der Codeschnipsel unten kompiliert bei mir mit einer ziemlich neuen Gcc Version (4.3.x) und wird auch von Comeau online kompiliert. Ich kenne auch keine Regel in C++ die den Schnipsel verbietet.


struct qname
{
char * ns; /**< Namespace. */
char * lname; /**< Local name. */
};

#define TRAINING_NS "http://www.schneider-electric.com/DPWS/2006/03/Training"

struct qname SimpleLightType = {TRAINING_NS, "SimpleLight"};

panzi
13-07-2008, 12:13
Wenn es Probleme beim Mischen von C und C++ gibt dann gib doch den C part unter extern "C" { ... }.


extern "C" {
struct qname
{
char * ns; /**< Namespace. */
char * lname; /**< Local name. */
};
}

#define TRAINING_NS "http://www.schneider-electric.com/DPWS/2006/03/Training"

extern "C" struct qname SimpleLightType = {TRAINING_NS, "SimpleLight"};

Ist jetzt aber nicht getestet. Hoff die Syntax ist so korrekt.

Wenn du die .c Datein eh mit gcc kompelierst aber die .h Datein in .cpp Source einbindest, dann schreib deine C Header am besten so:


#ifndef MY_HEADER_H__
#define MY_HEADER_H__

#ifdef __cplusplus
extern "C" {
#endif

/* your c stuff goes here... */

#ifdef __cplusplus
}
#endif

#endif /* MY_HEADER_H__ */


Siehe auch: http://wwwhome.math.utwente.nl/~bella/docs/c++-faq/mixing-c-and-cpp.html

Geige123
14-07-2008, 19:22
Danke für die vielen Ratschläge.

Ich habe die Lösung dieses Problems gefunden:

In einer eingebundenen Header-Datei fehlte bei eine Klassendefinition das abschließende Semikolon.



class xyz
{
...
};

Gruß,
Geige123