Array zur Laufzeit initialisieren

Rene42

Erfahrenes Mitglied
Hallo,

C++ macht mich fertig. Ich habe nun schon einiges zu Arrays gelesen bekomme es aber nicht hin dies auf meine Fehlermeldung zu übertragen.

Ich habe eine Klasse die folgendes Array kennt:

Code:
 int Gezogen[];

Eine Größe gebe ich nicht mit, da ich diese noch nicht kenne.

Der Konstruktor der Klasse versucht dann das Array zu initialisieren.
Code:
int Anzahl = 9;
Gezogen = New Int[Anzahl];

Dabei erhalte ich folgenden Fehler:

C:\Users\...\LottoTopf.h|17|error: incompatible types in assignment of 'int*' to 'int [0]'|

Kann mir das jemand erklären?

PS: Gibt es auch eine Codeformatierung mit Syntaxhighlight für C++?
 
Hallo Rene42

Wenn du ein Array deklarierst musst du die Grösse angeben. Wenn du ein Array dynamischer Grösse willst solltest du einen std::vector verwenden. Wenn du alles von Hand mit ganz vielen Fehlerquellen machen willst kannst du das auch selber mit new und delete machen.

C++:
int* dynamicArray = nullptr;
// ....
int anzahl = 9;
dynamicArray = new int[anzahl];
//...
delete [] dynamicArray;
anzahl = 100;
dynamicArray = new int[anzahl];
// ...
delete [] dynamicArray;

Viele Grüsse
Cromon
 
Das mit dem Vektor habe ich auch schon gelesen. Werde dies sicher auch später im "Alltag" einsetzen. Im Moment versuche ich aber noch dahinter zu kommen wie die Dinge funktionieren.

Deine Korrektur mit
Code:
 int* DynamicArray;
funktioniert gut. Allerdings ist mir noch nicht ganz klar warum. Jetzt habe ich doch dort nach meinem Verständnis einen Zeiger definiert und nicht mal einen Zeiger auf einen Integerarray sondern auf einen einzelnen Integerwert.
 
Ja, das ist ein Zeiger. new und delete arbeiten mit Zeigern, das soll so sein. new reserviert Speicher und gibt die Adresse davon zurück, damit man sie in einem Zeiger speicher kann (und delete gibt den Speicher wieder frei). Und ja, der zeigt nur auf ein int, und zwar das Erste in deinem Array. Zeiger auf mehrere Variablen existieren nicht. Alle weiteren int in deinem Array kommen im Speicher ja gleich nach dem ersten, ohne "Abstand" in der Adressgebung.

Wie du sicher weißt, kannst du mit *DynamicArray auf das int zugreifen, auf das DynamicArray zeigt, also das Erste vom Array. Man könnte *(DynamicArray+1) für das nächste int schreiben dass ja direkt danach ist, *(DynamicArray+2) für das Nächste usw. (in der Hinsicht ist das Erste *(DynamicArray+0) weil +0 ja die Adresse nicht ändert). Und DynamicArray[x] ist einfach eine andere Schreibweise für *(DynamicArray+x) ... Kurz, du hast einen Pointer auf das erste Arrayelement, und von dessen Adresse aus werden die Adressen der anderen Elemente ausgerechnet.
 
Dein zweiter Abschnitt wird immer ganz gut durch das illustriert:
C++:
    int* array = new int[2];
    for (int i = 0; i < 2; ++i) {
        i[array] = i;
    }

    if (1[array] == array[1]) {
        std::cout << 1[array] << std::endl;
    }

So etwas ist doch an Schönheit nicht zu überbieten!
 
Zurück