Frage zu struct



  • In folgendem struct befindet sich in einem Programm unter prefix manchmal inhalt manchmal nicht. Ich wollte abrfagen, ob prefix leer ist oder ob da etwas steht. Ausprobiert habe ich bisher

    if (qrpCubes[Laststop].antecedent.clptr->cLiterals->meta.lit != 0) {
    

    und

    if (!qrpCubes[Laststop].antecedent.empty) {
    

    Beies funktioniert nicht. Wie kann ich richtig abfragen ob prefix leer ist oder nicht?
    Was steht unter prefix wenn es leer ist? Eine null steht da ja nicht, sonst würde meine erste Abfrage ja funktionieren. Stehen da dann Zufallswerte oder existiert einfach keine Speicheradresse? Wie kann ich mir das vorstellen?

    struct wdata
    {
        Reason conflicting;
        Literal reslit;
        Reason prefix;
    
        wdata(): conflicting(nullptr), reslit(0), prefix() {}
    
        wdata(const Reason& conflcl, const Literal& lit, const Reason& reason):
            conflicting(conflcl), reslit(lit), prefix(reason) {}
    };
    


  • Diese Fragen kann dir nur derjenige beantworten, der die Klassen die du dort verwendest implementiert hat.
    Du solltest daher die Dokumenation zu dieser Bibliothek bemühen (welche immer das auch sein mag).

    Finnegan

    P.S.: Viel zuwenig Information ("funktioniert nicht" ist keine Fehlerbeschreibung!) und viel zu spezielle Fragen zu irgendeiner Bibliothek
    zu der du noch nicht mal dazu schreibst welche es ist. Auch haben deine Fragen nichts direkt mit C++ zu tun. Solche Fragen sind in einem
    Forum, welches auf die von dir verwendete Bibliothek spezialisiert ist, besser aufgehoben.



  • Finnegan schrieb:

    Diese Fragen kann dir nur derjenige beantworten, der die Klassen die du dort verwendest implementiert hat.
    Du solltest daher die Dokumenation zu dieser Bibliothek bemühen (welche immer das auch sein mag).

    Finnegan

    P.S.: Viel zuwenig Information ("funktioniert nicht" ist keine Fehlerbeschreibung!) und viel zu spezielle Fragen zu irgendeiner Bibliothek
    zu der du noch nicht mal dazu schreibst welche es ist. Auch haben deine Fragen nichts direkt mit C++ zu tun. Solche Fragen sind in einem
    Forum, welches auf die von dir verwendete Bibliothek spezialisiert ist, besser aufgehoben.

    Danke dir,
    Das Programm bezieht sich nicht auf eine Bibliothek, sondern ein sehr umfangreiches Programm von jemand anderem. Die entsprechende Klasse ist folgendermaßen definiert:

    union Reason {
    
      // Constructors
      Reason( Literal l ): varIdx( static_cast<unsigned long>(l.idx()<<1) | 0x1 ) {}
      Reason( Clause* clause ): clptr(clause) {}
      Reason( unsigned long varid ): fake( varid ) {}
      Reason( void ): clptr(nullptr) {}
    

    Nachdem was ich über nullptr gelesen habe, müsste folgende Anfrage funktionieren:

    if (qrpCubes[Laststop].prefix.clptr != nullptr) {
    

    Mit g++ kompiliert das Programm zwar, bei der Ausführung bricht es aber genau an jener Stelle ab. Ich nehme also an, dass irgendetwas nicht definiert ist.



  • DerLernende schrieb:

    Nachdem was ich über nullptr gelesen habe, müsste folgende Anfrage funktionieren:

    if (qrpCubes[Laststop].prefix.clptr != nullptr) {
    

    Mit g++ kompiliert das Programm zwar, bei der Ausführung bricht es aber genau an jener Stelle ab. Ich nehme also an, dass irgendetwas nicht definiert ist.

    Ja, nachdem ich jetzt zumindest mal ein paar Konstruktoren von Reason gesehen habe (besser ganze Klasse posten), und weiss,
    dass es sich um ein union handelt, würde mir mein Bauchgefühl auch sagen dass man so auf "leer" testen kann, wenn Reason nicht
    ohnehin eine is_empty() -Methode oder ähnliches anbietet (trotzdem nur eine Vermutung!).

    Wenn das Programm an dieser Stelle abbricht, solltest du versuchen mit einem Debugger herauszufinden warum das so ist.
    Leider weiss ich nicht was qrpCubes ist, da dein geposteter Code immer noch sehr dürftig ist, ich würde jedoch darauf tippen,
    dass das Programm abbricht, weil qrpCubes kein Element an Index Laststop hat.

    Führ das mal im Debugger aus (Google ist dein Freund wenn du sowas noch nicht gemacht hast). Setze einen Breakpoint an der
    fragwürdigen Zeile und schau dir mal an was da genau passiert (welchen Wert hat Laststop ? gibt es überhaupt ein qrpCubes[Laststop] ?
    Ist prefix.clptr == nullptr überhaupt das was du unter "leer" verstehst und was du testen möchtest? Hast du vielleicht in Wirklichkeit ein ganz anderes Problem?)

    Viel mehr kann ich dir da leider auch nicht helfen. Fremden, undokumentierten Code zu verstehen lernt man durch Erfahrung - wenn du allerdings noch nachlesen musst,
    was nullptr bedeutet (!), dann hast du da noch einiges vor dir. Vielleicht solltest du erstmal daran arbeiten etwas fließender C++ zu sprechen und zu verstehen (?).

    Gruss,
    Finnegan


Anmelden zum Antworten