Forum: PC-Programmierung Array mit variabler Feldgröße erzeugen


von Christian Q. (osx)


Lesenswert?

Hallo! Ich habe das Problem, dass ich ein Array mit variabler Feldgröße 
erzeugen möchte. Zum besseren verständnis:
1
 
2
int length = 2;
3
int array[length]; // array[-1]
4
int array2[2]; // funktioniert natürlich
Leider funktioniert das nicht. Im Debugger bekomm ich array mit dem 
Inhalt [-1] angezeigt.
In einschlägigen C-Büchern wird die Größe immer per #define definiert - 
also statisch. Ich kann mir nicht vorstellen, dass so etwas nicht 
funktionieren soll:
1
 
2
int length = zaehl(user); //zaehl gibt einen int zurück
3
int array[length];

Ich hoffe jemand kann helfen und erkären warum das nicht funktioniert.

von Karl H. (kbuchegg)


Lesenswert?

Christian Q. schrieb:


> In einschlägigen C-Büchern wird die Größe immer per #define definiert -
> also statisch.

Dann solltest du weiterlesen, bis du im Kapitel über dynamische 
Speicherallokierung mittels malloc angelangt bist.

> Ich kann mir nicht vorstellen, dass so etwas nicht
> funktionieren soll:
>
1
> int length = zaehl(user); //zaehl gibt einen int zurück
2
> int array[length];
3
>
>

In C99 wurde dieses Feature hinzugefügt.
Mit C Versionen davor musst du selber Hand anlegen und den Speicher 
allokieren.

von jiffies (Gast)


Lesenswert?

Christian Q. schrieb:
> Leider funktioniert das nicht. Im Debugger bekomm ich array mit dem
> Inhalt [-1] angezeigt.
Dein Quellcode füllt das Array ja auch nicht mit Werten, es wird nur 
definiert und nicht deklariert. Vielleicht ist der Debugger so schlau 
und macht das mit '-1' kenntlich oder der Compiler schreibt das rein. 
Gibt es überhaupt eine Fehlermeldung vom Compiler?
Dein Beispiel oben ist auch recht schlecht für Diagnosen geeignet, denn 
für den Compiler ist ersichtlich, dass das Array zwei Felder hat. Außer 
der Quellcode sieht ganz anders aus, als das was da oben steht.

Christian Q. schrieb:
> In einschlägigen C-Büchern wird die Größe immer per #define definiert -
> also statisch. Ich kann mir nicht vorstellen, dass so etwas nicht
> funktionieren soll
Genau das ist aber so. Ausnahme, der Compiler kann den C99-Standard und 
er kompiliert auch danach.

Welcher Compiler wird von dir verwendet?

von Christian Q. (osx)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Christian Q. schrieb:
>
>
>> In einschlägigen C-Büchern wird die Größe immer per #define definiert -
>> also statisch.
>
> Dann solltest du weiterlesen, bis du im Kapitel über dynamische
> Speicherallokierung mittels malloc angelangt bist.

Das Kapitel Dynamische Speicherverwaltung konnte ich sogar finden und 
dort gibt es den Punkt Dynamische Arrays. Das hört sich doch schonmal 
recht passend an.

jiffies schrieb:
> Gibt es überhaupt eine Fehlermeldung vom Compiler?

Leider nein.

jiffies schrieb:
> Welcher Compiler wird von dir verwendet?

Es handelt sich um den XCode C compiler.

von Christian Q. (osx)


Lesenswert?

Okay, das Teil heißt Apple LLVM Compiler 2.0 und basiert auf 
http://llvm.org/ http://llvm.org/demo/

von Christian Q. (osx)


Lesenswert?

Hier die Lösung aus dem ominösen Buch, etwas angepasst.
1
int get_rand() {
2
  srand(time(NULL));
3
  return rand() % 60;
4
}
5
6
void blub() {
7
8
  int *array;
9
  int length = get_rand(); //gibt einen int zurück
10
  array = (int *)malloc(length*sizeof(int));
11
  
12
  int x = 0;
13
  while (x < length) {
14
    array[x] = x;
15
    printf("%d\n", array[x]);
16
    x++;
17
  }
18
  
19
  if(array != NULL) {
20
    printf("%d", array[0]);
21
  }
22
}

von Peter II (Gast)


Lesenswert?

Christian Q. schrieb:
> Hier die Lösung aus dem ominösen Buch, etwas angepasst.

- keine Fehlerbehandlung
- keine Freigabe vom Speicher

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian Q. schrieb:
> Leider funktioniert das nicht. Im Debugger bekomm ich array mit dem
> Inhalt [-1] angezeigt.

Da Du das Array nicht initialisiert hast, steht da natürlich irgendwas 
drin. Und das zeigt Dir Dein Debugger an. Insofern ist Dein Schluss, daß 
das nicht funktionieren würde, nicht korrekt.

von Christian Q. (osx)


Lesenswert?

Peter II schrieb:
> Christian Q. schrieb:
>> Hier die Lösung aus dem ominösen Buch, etwas angepasst.
>
> - keine Fehlerbehandlung
> - keine Freigabe vom Speicher

Es ging mir in dem Moment nur um das anlegen dieses Arrays vom Prinzip 
her. Um diese Punkte werd ich mich noch kümmern müssen.

Rufus Τ. Firefly schrieb:
> Da Du das Array nicht initialisiert hast, steht da natürlich irgendwas
> drin. Und das zeigt Dir Dein Debugger an. Insofern ist Dein Schluss, daß
> das nicht funktionieren würde, nicht korrekt.
1
int dd = 2;
2
int array2[dd];
3
array2[0] = 0;
4
array2[1] = 1;
Aber selbst das funktioniert nicht. Der Inhalt bleibt -1.

von Klaus W. (mfgkw)


Lesenswert?

Welcher Inhalt?

von Christian Q. (osx)


Angehängte Dateien:

Lesenswert?

value von array2

von Karl H. (kbuchegg)


Lesenswert?

Na ja. In solchen Fällen würde ich mich nicht wirklich drauf verlassen, 
dass ein Debugger mit solchen Dingen problemlos umgehen kann. Debugger 
sind auch nur Programme, die selbstverständlich fehlerhaft sein können.

printf ist durch nichts zu ersetzen. (nicht ganz ernst gemeint)

von MWS (Gast)


Lesenswert?

Christian Q. schrieb:
> value von array2

Evtl. in der Watchlist das genaue Element referenzieren, daß Du 
angezeigt haben möchtest.

von Christian Q. (osx)


Lesenswert?

1
int dd = 2;
2
int array2[dd];
3
array2[0] = 0;
4
array2[1] = 1;
5
printf("%d\n", array2[0]); //Ausgabe 0
6
printf("%d\n", array2[1]); //Ausgabe 1

Was soll ich dazu noch sagen? Toller Debugger.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.