Variables Array
-
jepp, hab ich nur angegeben, weil ich so faul war und den Code kopiert hab. Wenn ich das kompiliere dann kommt:
[C++ Fehler] Unit.cpp(23): E2313 Konstantenausdruck erforderlich.
-
GoTo schrieb:
Wie kann ich ein Array in einer Funktion - int abzaehlen(int Anz,int Silb) - deklarieren, das aus Anz Elementen besteht?
Naja, entweder du forderst dynamisch Speicher an:
int abzaehlen(int Anz, int Silb) { int array* = new int[Anz]; delete[] array; }
oder du verwendest einen std::vector:
#include <vector> int abzaehlen(int Anz, int Silb) { std::vector<int> array(Anz); }
gruß,
walker
-
hab ich gemacht:
int abzaehlen(int Anz,int Silb) { bool* person = new bool[Anz+1]; int uebrig; int position; for(int i=0;i < Anz;i++) { *(person+i)= false; }; uebrig = Anz; do { position+= Silb; if(*(person+position)) { *(person+position) = false; uebrig--; } else if(!*(person+position)) { position++; *(person+position) = false; uebrig--; }; }while(uebrig != 0); delete[] person; }
und gez kommt immer ne Zugriffsverletzung!!!
-
Ach ja die Zugriffsverletzung wird von
delete[] person;
ausgelöst!
-
Ohje, eine uninitialisierte Variable
Ich nehme an, du willst
int position = 0; // wichtig!
Außerdem kannst du ruhig wie bei normalen Arrays indizieren, also
person[i] = false; // leserlich
statt
*(person+i) = false; // imho unleserlich
gruß,
walker
-
Sorry! Iss korrekt is mir auch grad aufgefallen!!!
-
gez hab ich eine beim beenden?!!!!
-
Hi,
der Fehler ist, daß Du den Bereich deines Arrays nicht beachtest.
1. Du initialisierst 'position' nicht. dort kann alles möglich drinstehen.
2. Wenn Du Deine Funktion mit
abzaehlen(8,6);
aufrufst.
erster Schleifendurchlauf wenn position durch zufall doch 0 ist:position += Silb;
dann ist position 6 und person[6] gibts.
da ist noch alles im grünen Bereich
zweiter Durchlauf:position += Silb;
danach ist position 12 und das macht bei einem Array mit 8 Elementen:
PPP EEEE N N GGGG P P E NN N G PPP EEE N NN G GG P E N NN G G P EEEE N N GGGG
(mein erstes ASCII-Art, Kritiken sind nicht gefragt
)
grüße Con@n
-
Hinweis am Rande:
*(person+position) = false; uebrig--;
kannste aus dem if-Block nehmen, da es eh in if UND else ausgeführt wird - wäre übersichtlicher IMHO.
-
GoTo schrieb:
Ach ja die Zugriffsverletzung wird von
delete[] person;
ausgelöst!
Wie wird der Speicher korrekt freigegeben ?
'delete person;' löscht ja nur das erste Element des char arrays.
-
die Klammer [] nach delete löscht doch das ganze array!
-
Unter Windows gibt übrigens auch "delete person;" den Speicher des gesamten Arrays frei - was es allerdings nicht richtiger macht.
edit
Ich meinte damit zumindest VC++6 SP5...
-
Stimmt, der VC ist da nicht wirklich konsequent. Habe ich ganz früher auch nicht verstanden, was die eckigen Klammern da sollen wenn es auch ohne geht.