Pointerprobleme



  • Hi,

    ich habe eine Struktur A, welche intern u.a. einen Pointer auf eine weitere Struktur B besitzt. Einen Pointer auf eine Variable vom Typ A übergebe ich jetzt an eine Funktion set_b(), welche mir innerhalb von A den MEmber B mit einem Wert beschreibt, nach dem Funktionsaufruf hat A->B also einen neuen Wert.

    Das ganze Funktioniert innerhalb eines reinen C-Programmes problemlos.

    Jetzt habe ich den Aufbau aber geändert: set_b() becindet sich immer noch in einem C-File, wird aber zu einer statischen Bibliothek compiliert. In einem Headerfile wird set_b() als "extern "C"" exportiert.

    Das eigentliche Hauptprogramm ist jetzt eine C++-Applikation, welche diese Bibliothek einbindet und set_b() aufruft. Compilieren klappt problemlos, es gibt keine Linkerfehler.

    Allerdings funktioniert set_b() jetzt nicht mehr, auch wenn A->B innerhalb von set_b() einen anderen Wert hat, beim Aufrufer von set_b() ist A->B unverändert! Was geht denn da schief?



  • Da wirst du wohl eine Kopie von A verändern. Mit C++ statt C wird es wohl eher nichts zu tun haben. Aber mit den wenigen Informationen lässt sich kaum mehr sagen.



  • Der Spaß ist: ich nutze den komplett identischen Code, mit Ausnahme der Tatsache, dass der Aufruf einmal aus dem gleichen C-Programm (Dateiendung .c) heraus erfolgt und im anderen Fall der Aufruf aus einem .cpp-File heraus gegen eine Lib erfolgt, welche noch aus .c-Files erzeugt wurde.

    Die Funktion set_b() ist auch entsprechend deklariert:

    set_b(struct A *my_a);

    In set_b() wird dann nichts weiter gemacht als

    my_a->b=0xIRGENDWAS

    gesetzt.

    Die Struktur ist in etwas sowas:

    struct A
    {
    struct B *b;
    };



  • Wie gesagt: ohne mehr Informationen (sprich Code) wird dir wohl niemand helfen können.



  • Ähm was willst du noch sehen? Die kompletten 30 Files kann ich kaum posten und die wesentlichen Elemente findest du in meinem Posting oben!


  • Mod

    Darkrad schrieb:

    Ähm was willst du noch sehen? Die kompletten 30 Files kann ich kaum posten und die wesentlichen Elemente findest du in meinem Posting oben!

    Versuche das auf ein minimales Beispiel zu reduzieren, welches für uns compilierbar ist, den gezeigten Fehler zeigt und den wichtigen Stellen aus deinem Code entspricht.
    Wir können deinen Fehler sonst nicht nochvollziehen, es gibt zu viel, was du falsch gemacht haben könntest. Prinzipiell ist es möglich, C-Funktionen in C++ zu benutzen, also musst du an irgendeiner Stelle einen Fehler gemacht haben.

    Ansonsten bietet sich bei solchen Problemen (oder eigentlich auch allen) die Benutzung eines Debuggers an, mit dem du den Programmablauf verfolgen und vergleichen kannst.


  • Mod

    Wesentlich Elemnte sind derjenige Code, der das Ergebnis potentiell beeinflusst. Niemand hat etwas von 30 Files gesagt.
    Die Definitionen von A, set_b und ggf. B wären ein Anfang.



  • camper schrieb:

    Die Definitionen von A, set_b und ggf. B wären ein Anfang.

    Ähm und was ist mit meinem zweiten Posting? Habe ich da drin eine Blumenwiese beschrieben?



  • Darkrad schrieb:

    Habe ich da drin eine Blumenwiese beschrieben?

    Wenn du so direkt fragst: Ja 😃
    Die Fragmente kann man zu allem möglichen zusammensetzen (von dem "in etwas sowas" und 0xIRGENDWAS will ich gar nicht reden).

    PS: Bist du überhaupt sicher, daß genau diese Funktion aufgerufen wurde?



  • SeppJ schrieb:

    Ansonsten bietet sich bei solchen Problemen (oder eigentlich auch allen) die Benutzung eines Debuggers an, mit dem du den Programmablauf verfolgen und vergleichen kannst.

    Auweia...was glaubst du, wie ich festgestellt habe, dass meine Applikation dieses Verhalten zeigt? Mit einer Wünschelrute??

    Ich habe mit einem Debugger festgestellt, dass innerhalb von set_b() der Member der Struktur gültig ist und sofort nach dem Rücksprung eben nicht mehr. Dazwischen ist schlichtweg kein Code.

    Wenn da irgend eine Zeile wäre, die den Member auf irgend was anderes setzen würde, hätte ich es gesehen und würde wohl kaum hier fragen!?



  • Darkrad schrieb:

    Ähm was willst du noch sehen? Die kompletten 30 Files kann ich kaum posten und die wesentlichen Elemente findest du in meinem Posting oben!

    Wo ist der Aufruf der Funktion? Wie und wo wird eine Variable vom Typ A definiert?



  • CStoll schrieb:

    (von dem "in etwas sowas" und 0xIRGENDWAS will ich gar nicht reden).

    PS: Bist du überhaupt sicher, daß genau diese Funktion aufgerufen wurde?

    Noch mal: Ich sehe es im Debugger! Das 0xIRGENDWAS ist schlichtweg nicht relevant, oder kann jemand per Telepathie auf meinen Rechner sehen und eine Hex-Adresse, die da drin steht decodieren?

    Noch mal ganz langsam:

    Ich gehe in diese Funktion set_b() rein, übergebe die Struktur. In set_b() wird ein Member dieser Struktur (der eben ein Pointer ist) auf enen Wert !=NULL gesetzt (also 0xIRGENDWAS).

    Bis zum Ende von set_b() enthält der Pointer in dieser Struktur die richtige Adresse, sofort nach dem Rücksprung aus set_b() steht da wieder NULL drin.

    Also dürfte der vorherige Inhalt des Pointers dja wohl komplett unwichtig sein, oder?



  • manni66 schrieb:

    Wo ist der Aufruf der Funktion? Wie und wo wird eine Variable vom Typ A definiert?

    In einer anderen Funktion, die Variable vom Typ A wurde per malloc() erzeugt.



  • Darkrad schrieb:

    manni66 schrieb:

    Wo ist der Aufruf der Funktion? Wie und wo wird eine Variable vom Typ A definiert?

    In einer anderen Funktion, die Variable vom Typ A wurde per malloc() erzeugt.

    Ich möchte keine Prosa sondern Code.



  • Darkrad schrieb:

    CStoll schrieb:

    (von dem "in etwas sowas" und 0xIRGENDWAS will ich gar nicht reden).

    PS: Bist du überhaupt sicher, daß genau diese Funktion aufgerufen wurde?

    Noch mal: Ich sehe es im Debugger! Das 0xIRGENDWAS ist schlichtweg nicht relevant, oder kann jemand per Telepathie auf meinen Rechner sehen und eine Hex-Adresse, die da drin steht decodieren?

    Nein, können wir nicht (und der Service hat mir neulich mitgeteilt, daß die Reperatur meiner Kristallkugel sich noch etwas verzögern könnte). Deshalb wärst du mal so freundlich, den Code in einem etwas größeren Zusammenhang zu zeigen.
    (eine Vermutung wäre, daß du in der Funktion den übergebenen Zeiger überschrieben hast und nun mit etwas anderem arbeitest)

    PS: Das folgende ist eigentlich nicht mein Stil, aber es muß wohl sein: Wenn du weitere so nichtssagende Beiträge lieferst, verwende ich meinen Schlüsselbund.



  • Bevor die Gegenfragen hier noch dümmlicher werden und irgend einer nach der Farbe meiner Maus fragt: vergesst es.

    Sorry, aber das ist wohl der inkompetenteste Thread überhaupt. Nur mal was zu Nachdenken: wenn der 100% identische Code in C (also aus Dateien mit Endung .c) korrekt funktioniert und nur durch Umbenennen nach .cpp und Recompilieren kaputt geht - wie kann es da irgend eine falsche Verwendung oder Überschreiben des Pointers sein? Denkt der C-Compiler mit und legt mir heimlich eine neue Variable an?

    EOF.



  • C++ ist eben nicht 100%ig kompatibel zu C. Vielleicht verwendest du etwas, das in C++ eben anders läuft.

    Die Leute hier sind ziemlich kompetent und programmieren seit Jahren, großteils auch beruflich. Du bist hier der inkompetente.



  • Darkrad schrieb:

    Sorry, aber das ist wohl der inkompetenteste Thread überhaupt.

    Tja, daran bist du aber selber schuld - wenn du (auch nach mehrfachen Nachfragen) keinen gescheiten Input lieferst, kannst du auch keine brauchbaren Antworten erwarten.

    Nur mal was zu Nachdenken: wenn der 100% identische Code in C (also aus Dateien mit Endung .c) korrekt funktioniert und nur durch Umbenennen nach .cpp und Recompilieren kaputt geht - wie kann es da irgend eine falsche Verwendung oder Überschreiben des Pointers sein? Denkt der C-Compiler mit und legt mir heimlich eine neue Variable an?

    Da hast du womöglich das weite Feld des undefinierten Verhaltens betreten - da kommt es mitunter auf Kleinigkeiten an, um aus einem scheinbar funktionierenden Code eine mittlere Katastrophe werden zu lassen.

    PS: Die Farbe deiner Maus interessiert hier niemanden 😃 (wir sind hier Programmierer und keine Stil-Berater)


  • Mod

    Darkrad schrieb:

    Nachdenken: wenn der 100% identische Code in C (also aus Dateien mit Endung .c) korrekt funktioniert und nur durch Umbenennen nach .cpp und Recompilieren kaputt geht - wie kann es da irgend eine falsche Verwendung oder Überschreiben des Pointers sein?

    Damit wäre die Frage geklärt. Erfahrungsgemäß haben 99% aller Programmierprobleme etwas mit dem Quelltext zu tun. Wieso ......

    ach was solls, das ist mir zu blöd...
    Wieso stellen Leute, die glauben schon alles zu wissen, überhaupt Fragen?

    Ein Link zu wie-stelle-ich-eine-Frage plus Thread schließen scheint mir hier das vernünftigste zu sein.



  • Ein Beitrag von camper in deutlich genervtem Tonfall. Das ist ganz was neues (zumindest für mich) 🙂

    (@camper: verstehe das als Kompliment! Du bist (sonst) immer so ruhig und sachlich, das ist echt bewundernswert)


Anmelden zum Antworten