was ist an klassendefinition falsch?
-
uwerothfeld schrieb:
- Wo legt du die Verweise auf die Blätter ab? In car und cdr?
- Wie und wo erzeugst du die Cellen statisch und legst diese ab? Über den Pool?
zu 1) Jein. Scheme ist etwas anders. Z.B. ist (+ 1 2) ein Befehl zur Addition und wird in einer einfachen Liste gespeichert. car hat einen Zeiger auf eine Zelle vom Typ Symbol (+) und cdr enthaelt einen Pointer auf den Rest der Liste. (Ich empfehle dir aber eine Einfuehrung in Lisp/Scheme zu lesen, hier kann ich so schlecht Bildchen malen.) Ein Versuch:
[car|cdr]---[car|cdr]---[car|/] | | | Symbol Number Number name: + value: 1 value: 2Waehrend [/] ein Verweis auf das Nullelement ist und den Abschluss einer Liste kennzeichnet. Mit diesen rudimentaeren Konstrukten koennen alle moeglichen Expressions gebaut werden.
zu 2) Neue Elemente werden mit z.B. cons oder mk_number konstruiert, sie Rufen get_cell auf und fordern vom Pool (beim Start initialisiert) eine freie Zelle an. Dazu Verweise ich aber erstmal auf den (haesslichen) Sourcecode von Minischeme.
-
Hallo zusammen,
ich glaube ich habe verstanden

uwe
-
Hallo nochmal,
ich habe nun meine Klasse ergänzt um:
//define a list to store all expressions static ASTExpression expressionList[DSM_EXPRESSION_CNT_MAX]; //this index points to the next free element in the storage static size_t expressionlistIndex = 0;sowie
/** * Overload the new operator to simulate dynamic memory allocation. */ static void* ASTExpression::operator new (size_t size){ if(expressionlistIndex + size > DSM_EXPRESSION_CNT_MAX){ throw bad_alloc(); }//End if else { expressionListIndex += size; return expressionList + expressionListIndex - size; }//End else }//End operator newAllerdings bekomme ich als Fehler:
In file included from source/tinyDSMMain.cpp:12: source/ast/astexpression.h:118: Fehler: ISO-C++ verbietet Initialisierung des nicht konstanten statischen Elements »expressionlistIndex« in der KlasseAber den Index auf den Speicher muß ich doch global initialisieren, da er ja für alle Objekte gilt. Wo ist mein Denkfehler????
Danke nochmal.
Uwe
-
Die Initialisierung der statischen Elemente muss außerhalb der Klasse (in der cpp) erfolgen. Genau das sagt der Compiler ja auch.
-
static size_t expressionlistIndexProbier' es mit
size_t ASTExpression::expressionlistIndex = 0;in der Cpp-Datei.
-
Hi,
ah, so gehts! Fein. Jetzt habe ich nur noch nen letztes Problem. Ich bekomme in der Zeile:
return expressionList + expressionListIndex - size;folgenden Fehler:
/source/ast/astexpression.cpp:179: undefined reference to `AST::ASTExpression::expressionList'
Was mach ich den falsch (expressionlist habe ich nochmal umbenannt nach expressionList)? Noch nen Tipp??
Uwe
-
ASTExpression::expressionList ist ja ebenfalls static. Du hast es bisher nur deklariert (in der Klassendeklaration). Du brauchst auch hier noch eine Definition in der cpp.
-
Hi zum letzten ;),
nun habe ich in der .h:
//define a list to store all expressions static ASTExpression expressionList[DSM_EXPRESSION_CNT_MAX]; //this index points to the next free element in the storage static size_t expressionListIndex;und in der .cpp:
//init the static counter for the simulated dynamic storage allocation size_t ASTExpression::expressionListIndex = 0; ASTExpression ASTExpression::expressionList[DSM_EXPRESSION_CNT_MAX];Ist das nicht doppeltgemommelt bzgl. der expressionList???
Uwe
-
Nein, wieso denn?
Das Erste ist doch nur eine Deklaration in der Klasse. Da die Variable static ist, gehört sie ja nicht zur Klasse und es wird somit auch kein Speicher dafür mit vereinbart. Das machst du durch die Definition in der cpp selbst.
siehe auch
http://tutorial.schornboeck.net/staticmember.htm
-
Hallo,
ok ok. Habe ich glaube ich verstanden. Dann sage ich mal *close*. Hehe. Vielen Dank für Eure Hilfe.
Uwe