Compiler Error C2036 - unknown size
-
Hallo.
Tut mir leid, ich hatte die Frage schon mal, wurde gelöst... jetzt aber tritt das Problem wieder an einer anderen Stelle in anderer Form auf.
Ich habe ein Struct:
typedef struct{ TNode** NodeThread; unsigned long nNode; struct TBBox* SBox; double XMin, XMax, XAve; double YMin, YMax, YAve; double ZMin, ZMax, ZAve; }TBBox;
NodeThread ist ein Zeiger auf ein Array, welches Knoten mit X, Y und Z Werten enthält. die Variable nNode gibt an, wie viele Knoten dieses Array hat.
Die Werte XMin, XAve und XMax geben die minimale, die mittlere und die maximale X-Koordinate der Punkte an. Analog verhält es sich mit Y und Z.
Nun soll das Programm, wenn die Anzahl der Knoten größer als 50 ist, diese Box in acht kleinere Unterboxen unterteilen, die ebenfalls vom Typ TBBox sind. Anschließend werden die Knoten auf die acht unterboxen aufgeteilt (also in deren NodeThread gelegt) und der Zeiger NodeThread der Mutterbox gleich NULL gesetzt. Das geschieht über die Routine SubdivideOnce, welche ich nicht mit angebe, da der Quellcode sehr lang ist und bereits mehrfach positiv getestet wurde.
SubdivideOnce zerlegt also eine Box. Nun gibt es noch eine Funktion SubdivideAll, welche die Funktion SubdivideOnce auf die unterschiedlichen Boxen so lange ausführt, bis die Maximale Anzahl von Knoten in einer Box 50 nicht überschreitet... dann wäre die Unterteilung abgeschlossen.
int SubdivideAll(TBBox* fB, unsigned long TNN, double MaxEdgeLength, unsigned int Number){ TBBox **ToDo; TBBox *TB, *Dummy; unsigned long i, j, k, l; long nToDo; ToDo = (TBBox**)calloc(fB->nNode, sizeof(TBBox*)); TB = fB; ToDo[0] = fB; Dummy=NULL; i = 0; j = 0; k = 0; l = 0; nToDo = 1; while (nToDo>0){ TB = ToDo[nToDo-- - 1]; TB->SBox=NULL; SubDivideOnce(TB, TNN, MaxEdgeLength, Number); for (i = 0; i < 8; i++){if (TB->SBox[i].nNode>TNN){ToDo[nToDo++] = &TB->SBox[i];}} //C2036 ERROR if(Number==1){nSubDivisions1++;} if(Number==2){nSubDivisions2++;} } return 0; }
Allerdings lässt sich das Programm nicht (mehr) kompilieren, da jetzt ein C2036 Fehler auftritt. Ich hatte exakt diese Function schonmal mit VS2013 kompiliert - und das ganze Programm funktionierte problemlos. Jetzt habe ich diese Functionen für ein anderes Programm übernommen und auf einmal bekomme ich diesen Fehler.
Das Dumme ist, ich weiß sogar, dass nach jeder Unterteilung immer genau 8 neue Boxen entstehen. Ich könnte also
struct TBBox SBox[8]
schreiben - das lässt der Kompiler in der struct Definition (aus welchem Grund auch immer... double x[3] funktioniert ja auch) nicht zu. ich weiß also, dass ein TBBox aus einem Zeiger auf TNode**, einem unsigned long, acht TBBox und 9 double besteht.
Kann mir jemand weiter helfen?
Vielen Dank im Voraus,
CJensPs.: Nachfolgend noch die Definition der übrigen structs TPoint und TNode
typedef struct{ double x[3]; }TPoint; typedef struct{ TPoint P; unsigned long ID; double *Value; }TNode;
Hier noch der Link zum Compiler Error C2036:
http://msdn.microsoft.com/en-us/library/1kay26wa.aspx
-
probiers so:
typedef struct _TBBox{ // kein anonymes struct TNode** NodeThread; unsigned long nNode; struct _TBBox* SBox; // dann weiß der compiler was hier benutzt wird. double XMin, XMax, XAve; double YMin, YMax, YAve; double ZMin, ZMax, ZAve; }TBBox;
-
...vielen Dank. Das hat das Problem gelöst.
Was mache ich mit diesem Unterstrich genau?
-
Geht auch ohne Unterstrich. Der Compiler wusste nur nicht, was für ein Typ (bzw. dessen Größe) dein
SBox[i]
hatte.struct TBBox
ist halt doch was anderes als deinTBBox
.
-
Der Unterstrich ist egal, Hauptsache die Struktur selbst hat einen Namen.
Du kannst auchtypedef struct TBBox { ... struct TBBox* SBox; ... } TBBox;
schreiben (oder XXX oder blabla).
@oenone: sind
VariablennamenIdentifiernamen mit einem Unterstrich am Anfang nicht reserviert (für den Compilerhersteller) - in C++ ist es jedenfalls so?
-
Th69 schrieb:
@oenone: sind Variablennamen mit einem Unterstrich am Anfang nicht reserviert (für den Compilerhersteller) - in C++ ist es jedenfalls so?
Ja, globale Funktionen und Variablennamen mit einem Unterstrich am Anfang sind reserviert. Hier ist es aber keine Variable, sondern ein Typ. Da ist ein Unterstrich erlaubt. Anders ist es bei zwei Unterstrichen - das ist für alle Identifier reserviert.
Edit: Okay, _tbbox wäre in Ordnung gewesen, aber _TBBox gehört auch zu den reservierten Identifiern.
all identifiers regardless of use that begin with either two underscores or an underscore followed by a capital letter are reserved names
-
Dachte ich mir doch, daß das bei C++ von C geerbt ist