Fehler mit dynamischem Bool-array



  • Hi.

    Arbeite gerade an einer Bibliothek, und da stoße ich auf einen (mir scheinbar unlöslichen) Fehler mit folgender Deklaration des Verursachers:

    bool* w= new bool[sizeof(uninteressant - aber auf jeden Fall nicht null!)];
    

    Egal, wie ich versuche, die Werte des Arrays (einzeln, Element für Element) zu ändern, in der Laufzeit eines Testprogramms stürzt dieses immer ab. =>Durch ein bisschen Forschung fand ich heraus, dass
    es immer bei der Initialisierung der Werte passiert.

    Wo könnte da der Fehler liegen...?

    P.S.: Nein, ich habe verschiedene Zuweisungsfehler-Möglichkeiten schon ausgeschlossen, wie

    w[-1]=x;
    

    o.ä



  • Kannst du ein möglichst kleines kompilierbares Beispiel posten?



  • Ähhh...

    Compilierbar? Das geht ja eben nicht(=>Fehler), das wäre nicht im Sinne meines Beitrags.
    Ich kann aber ein Stückchen Quellcode posten, wenns das auch tut (was es hoffentlich sollte)...



  • Hacker schrieb:

    Egal, wie ich versuche, die Werte des Arrays (einzeln, Element für Element) zu ändern, in der Laufzeit eines Testprogramms stürzt dieses immer ab.

    Hacker schrieb:

    Compilierbar? Das geht ja eben nicht(=>Fehler), das wäre nicht im Sinne meines Beitrags.

    Hä?
    Welche Fehlermeldung kommt denn vom Compiler?



  • Ich hab doch gesagt, in der Laufzeit stürzt das Programm ja ab!

    inline void DA(ull a){
    bool* w=new bool[NKZE(a)+1];
    w={false};
    ull f=NKZP(a);
    us e=0;
    a-=NKZP(a);
    
    do{
    f/=2;
    
    if(f<=a){
    
    w[e]=true;/// Hier stürzt das Programm ab
    ...
    ...
    

    So, das wäre der relevante Teil des Quellcodes.

    ull -> unsigned long long
    us -> unsigned short
    (sind typedefs)

    NKZP() gibt die nächstkleinere Zweierpotenz einer als Parameter übergebenen Zahl zurück,
    NKZE() den Exponent dieser Potenz.

    Den Algorithmus hatte ich schon vorher ausprobiert, er funktioniert wunderbar. Nur eben nicht die Erneuerung mit dem Bool-array.


  • Mod

    bool* w=new bool[NKZE(a)+1];
    w={false};
    

    Das sieht tatsächlich falsch aus.



  • Ich probier grad, ob es an einer nicht-möglichen Speicherplatzreservierung liegt...



  • Hacker schrieb:

    Ich hab doch gesagt, in der Laufzeit stürzt das Programm ja ab!

    Was wiederum impliziert, dass es zuerst kompiliert wurde und demnach kompilierbar ist. Du musst zwischen Compiler- und Laufzeitfehler unterscheiden.

    w={false};
    

    Das tut niemals, was du vorhast. Das wäre so nicht einmal erlaubt. Was dein Compiler wahrscheinlich tut, ist das als w=NULL; zu interpretieren.

    Aber warum gehst du nicht mit dem Debugger durch?

    Und irgendwie habe ich das Gefühl, dass NKZP und NKZE Makros sind. Mach Funktionen daraus!



  • Nexus schrieb:

    Und irgendwie habe ich das Gefühl, dass NKZP und NKZE Makros sind. Mach Funktionen daraus!

    Es sind Funktionen, dein Gefühl hat dich belogen.

    Und Danke, du hattest recht. Ich hab das Array jetzt statisch deklariert, und das Programm kompiliert wunderbar.



  • Was erwartest du von Zeile 3?

    Edit:
    Zu spät.



  • Statt

    w={false};
    

    einfach

    std::memset(w, 0, NKZE(a) + 1);
    


  • Hacker schrieb:

    Es sind Funktionen, dein Gefühl hat dich belogen.

    Okay, dann ist die Benennung etwas gewöhnungsbedürftig.

    Aber viel wichtiger, hast du auch den anderen Teil meines Beitrags gesehen?



  • Hacker schrieb:

    Es sind Funktionen, dein Gefühl hat dich belogen.

    Dann solltest du deine Funktionen ordentlich nennen.



  • Gibt's kein calloc() für C++? Na ja gut, es gibt ja auch kein realloc().

    @TE
    Was spricht gegen std::vector?



  • EOutOfResources schrieb:

    Statt

    w={false};
    

    einfach

    std::memset(w, 0, NKZE(a) + 1);
    

    Warum nicht

    bool* w = new bool[NKZE(a)+1]();
    

    oder gleich

    std::vector<bool> w(NKZE(a)+1);
    

    Ist zwar die Template-Spezialisierung, aber sollte im Normalfall okay sein.


  • Mod

    Statt

    std::memset(w, 0, NKZE(a) + 1);
    

    einfach

    bool* w=new bool[NKZE(a)+1]();
    


  • *w={true};
    

    Ist c++0x

    Welchen Compiler verwendet ihr?
    Ich hab gcc 4.6.1 -std=gnu++0x
    Bei mir geht folgendes Problemlos

    bool *w=new bool[10];
        *w={true};
        w[1]=true;
    

Anmelden zum Antworten