Ich habe C schon lange auf Mikrocontrollern benutzt.C++ globale Objektinitialisierung schlägt fehl - warum? und ist es möglich, Objekte im .DATA-Bereich zu platzieren?
Kürzlich (endlich!) Habe ich es geschafft, GCC dazu zu bringen, einen C++ Code für meinen μC zu kompilieren und einen Code zu portieren, der zuvor nur OOP zum echten Deal "simuliert" hat.
Nach langem Debuggen und Kämpfen und Googeln habe ich nur noch ein Problem, aber dieses Rätsel verwirrt mich sehr. Ausführen dieses Codes (GCC/Arm):
class Test {
public:
int val;
Test(int val){
this->val = val;
}
};
Test test1(5);
static void _test() {
Test test2(7);
Debug::printf("-test1: %d-\n", test1.val);
Debug::printf("-test2: %d-\n", test2.val);
}
int main() { _init(); /*Hardware*/ _test(); while(1){} }
ich als Ausgabe:
-test1: 0-
-test2: 7-
Also irgendwie ist test1
nicht initialisiert, wie ich es erwartet hätte zu sein.
Warum ist das so? Und was passiert hier wirklich? (Und warum beklagt sich der Compiler nicht?)
Was ich gerne tun würde: Da dies auf Mikrocontrollern läuft, möchte ich vermeiden, "malloc/new" zu verwenden, sondern dies in .DATA Abschnitte wie ich tun würde mit C:
struct Test {
int val;
}
Test test1 = { 5 };
Ist das überhaupt möglich?
Wenn ich mich nicht irre, sollten Sie den Operator -> nicht verwenden, es sollte nur ein 'Test.val' sein, nicht' Test-> val', da Ihre Testobjektinstanz kein 'Test ist * ' – Funkyguy
Wahrscheinlich ist etwas falsch mit dem Start der Anwendung Ihrer Umgebung, und es läuft nicht der übliche Vorläufer-Code zu' main() ', der statische Daten initialisiert und so weiter –
@MM: Es stellte sich heraus, dass dies der Fall ist. S. die Kommentare unten R Sahus Antwort. – Scheintod