Rekursiver Zugriff auf Verschachtelte Klassen geht schief -> segmentation fault
-
Helzlichen Dank für deine Mühe!
Ich werde es gleich morgen früh in dieser Art ausprobieren.Ja die Strukturen sind umständlich aufgebaut.
Aber wie gesagt, der WebService wurde extern entwickelt.
Und um den Service in einer C++ Applikation verwenden zu können, habe
ich gsoap eingesetzt. Es generiert aus der WebService-Beschreibungsdatei
C++ Code. So kam dieser Aufbau zustande.
-
Ok verstanden. Wie kann ich nun das Problem beheben, also spricht uninitialiesiert von x->y wegbekommen.
Ich kann den von gsoap-erstellte Quellcode schlecht ändern, da
sonst der Webservice nicht mehr funktioniert.Gibt es eine Möglichkeit das Problem zuheben an der Stelle
wo die Zuweisung passiert?a->incomingTests->Tests[0]->testin->id = "asdf";
-
Manuel_XY schrieb:
Ok verstanden. Wie kann ich nun das Problem beheben, also spricht uninitialiesiert von x->y wegbekommen.
Wenn du das was ich geschrieben habe, verstanden hast, dann hast du auch das Problem gelöst. 
Kann es sein, dass du einfach nur erwartest, dass dir jemand dein Programm schreibt? Falls ja: Hier gibt's dafür auch ein Projekteforum.
-
nein ich hab leider nur keinen Plan wie ich x->y initialisieren kann.
Nach meinem Verständnis sollte es die jeweiligen Instanzen nach new geben.
-
erbarme dich doch einfach

und geb mir bitte einen Tipp.
-
Das hat dir doch schon SeppJ geschrieben, also in der Form:
a->incomingTests = new ...; a->incomingTests->Tests = new ...; a->incomingTests->Tests[0] = new ...; a->incomingTests->Tests[0]->testin = new ...; a->incomingTests->Tests[0]->testin->id = "asdf";Jedoch scheint das ein eigenartiger WebService zu sein, wenn man so ein Gefrickel betreiben muß...
-
_ns1__test* a = new _ns1__test; a->incomingTests = new ns1__ArrayOfTests; a->incomingTests->Tests[0] = new ns1__Tests; a->incomingTests->Tests[0]->testin = new ns1__TestIn; a->incomingTests->Tests[0]->testin->uniqueid = "asdf";genau das habe ich heute morgen ausprobiert.
Leider bekomme ich so auch einen segfault!
-
_ns1__test* a = new _ns1__test; a->incomingTests = new ns1__ArrayOfTests; a->incomingTests->Tests = new ns1__Tests; //neu a->incomingTests->Tests[0] = new ns1__Tests; a->incomingTests->Tests[0]->testin = new ns1__TestIn; a->incomingTests->Tests[0]->testin->uniqueid = "asdf";hilft leider auch nicht
-
Eine wichtige Zeile fehlt bei dir aber... (wobei ich zugeben muß, daß ich auch ein Detail vergessen hatte):
a->incomingTests->Tests = new ns1__Tests*[1]; // Arraygröße angeben!!!Edit:
wobeins1__Tests* *Testsganz fies formatiert ist (da es sich hierbei um einen Doppelzeiger (**) handelt)!
-
Scheint zu funktionieren!
P.S. Ich liebe dich

-
Hab noch eine Frage.
Kann ich Objekte explizit auf NULL setzten?... a->incomingTests->Tests[0]->testin = new ns1__TestIn; a->incomingTests->Tests[0]->testin = NULL;Oder sind die automatisch NULL nach dem sie instanziiert wurden,
also nacha->incomingTests->Tests[0]->testin = new ns1__TestIn;
-
Manuel_XY schrieb:
Kann ich Objekte explizit auf NULL setzten?
Ja.
a->incomingTests->Tests[0]->testin = new ns1__TestIn; a->incomingTests->Tests[0]->testin = NULL;Ähm... syntaktisch ist das in Ordnung. Ob es auch sinnvoll ist... schwer zu sagen. Wahrscheinlich nicht. Willst du denn nichts weiter mit dem Objekt machen? Zum Beispiel wieder löschen?
Die Bezeicher mit den doppelten Underscores, die das Frickelwerk von gsoap da ausspuckt, sind nicht nur grauenvoll zu lesen, die sind noch nicht einmal erlaubt in C++. Da kannst du nix dafür, aber den gsoap-Programmierer sollte man dafür steinigen.
-
Herzlichen Dank für die schnelle Antwort.
Ein paar Objekte müssen NULL für die Verarbeitung auf Server-Seite sein, deshalb.
-
Registrierter Troll schrieb:
Die Bezeicher mit den doppelten Underscores, die das Frickelwerk von gsoap da ausspuckt, sind nicht nur grauenvoll zu lesen, die sind noch nicht einmal erlaubt in C++. Da kannst du nix dafür, aber den gsoap-Programmierer sollte man dafür steinigen
Lt. aktuellem Standard ists legal(nur die führenden unterstriche spielen eine rolle) - allerdings steht im working draft von 2005, dass zukünftig alle bezeichner, die nen doppelten Unterstrich enthalten, für die implementierung reserviert sind...
bb
-
unskilled schrieb:
Lt. aktuellem Standard ists legal(nur die führenden unterstriche spielen eine rolle) - allerdings steht im working draft von 2005, dass zukünftig alle bezeichner, die nen doppelten Unterstrich enthalten, für die implementierung reserviert sind...
Welchen Standard meinst du?
ISO/IEC 14882, Second edition (2003-10-15) - 17.4.3.1.2 Global names schrieb:
Each name that contains a double underscore (__) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use.
-
Registrierter Troll schrieb:
unskilled schrieb:
Lt. aktuellem Standard ists legal(nur die führenden unterstriche spielen eine rolle) - allerdings steht im working draft von 2005, dass zukünftig alle bezeichner, die nen doppelten Unterstrich enthalten, für die implementierung reserviert sind...
Welchen Standard meinst du?
ISO/IEC 14882, Second edition (2003-10-15) - 17.4.3.1.2 Global names schrieb:
Each name that contains a double underscore (__) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use.
hmm... verdammt, mein "aktueller" standard ist wohl doch etwas veraltet

gibts den 2003er iwo (kostenlos) zum dl? ^^bb
-
Hier der 2005er Draft, den 2003er findet man bestimmt bei google:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
-
_ns1__test* a = new _ns1__test; a->incomingTests = new ns1__ArrayOfTests; a->incomingTests->Tests = new ns1__Tests*[1]; a->incomingTests->Tests[0] = new ns1__Tests; a->incomingTests->Tests[0]->testin = new ns1__TestIn; a->incomingTests->Tests[0]->testin->id = "asdf";Seid Ihr Euch sicher, dass die Objekte auf diese Weise gefüllt werden?
Denncout << "id: " << a->incomingTests->Tests[0]->testin->id << endl;funktioniert, aber nachdem ich "a" verschickt habe (über einen gsoap-call), kommen auf Server-Seite nur leere Objekte an

-
SeppJ schrieb:
Hier der 2005er Draft, den 2003er findet man bestimmt bei google:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdfden 2005er hatte ich ja selbst^^
den 2003er hat man so gar relativ einfach gefunden *schäm*, ich hab bisher einfach nur immer dumm gesucht xDbb
-
im Bezug auf meinen vorigen Post:
if( gsoap_methode(a, response) == SOAP_OK ) { ... //das Verschicken klappt, aber die Server-Seite sagt, dass Objekt "a" nicht existiert }a müsste doch nach den Initiallisierungen oben die anderen Objekte enthalten???