Fehler mit dynamischem Bool-array
-
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.
-
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
NKZPundNKZEMakros sind. Mach Funktionen daraus!
-
Nexus schrieb:
Und irgendwie habe ich das Gefühl, dass
NKZPundNKZEMakros 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.
-
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 Problemlosbool *w=new bool[10]; *w={true}; w[1]=true;