Array anlegen

HolgerX

Mitglied
Ich will ein zweidimensionales Array anlegen.
Code:
unsigned char image[spalten][zeilen];
Als Parameter bekomme ich
Code:
... const int zeilen, const int spalten, ...
Dabei bekomme ich die Fehlermeldung: Konstanter Ausdruck erwartet
Hallo, spalten und zeilen sind doch konstant!
Ausserdem bekomme ich noch folgende Fehlermeldung:
Reservierung eines Feldes der konstanten Größe 0 nicht möglich
<unbekannt> Feldindex fehlt
'image' : unbekannt Größe


Wo ist das Problem?
 
Zuletzt bearbeitet:
Code:
      1 bool initArray(const int a, const int b){
      2 
      3         unsigned char feld[a][b];
      4         return true;
      5 }
      6 
      7 int main(void){
      8 
      9         initArray(5,3);
     10 }

Das lässt sich vom gcc prima übersetzen...

Gruß

RedWing
 
@Redwing:
Und was soll das nützen? Die Arraygrössen müssen konstant sein, darum geht es. Sind ja bei dir auch in gewisser Weise. Vermutlich frisst der Compiler es nur, weil das char-Array ohnehin wegoptimiert wird. Oder sehe ich da was falsch?
Letztenendes geht es ja darum, dass dem Compiler die Grösse des Arrays zur Compile-Zeit bekannt sein muss.

@HolgerX:
Wie gesagt: Wenn du ein Array auf dem Stack definierst, muss die Anzahl der Arrayeinträge eine Konstante sein. Du intialisierst die "konstanten Variablen" aber gar nicht bei der Deklaration. Wie soll das gehen? Nachher geht es ja nicht mehr. Oder sSind es tatsächlich Funktionsparameter?
 
du musst das Array dynamisch mit malloc anfordern. Die benötigte Speichergröße dabei ist Zeilenzahl*Spaltenzahl*Speicher_für_typ.
Dann den Zeiger casten und das müsste reichen.
 
@Kacheletor

1.)Wer sagt das die Feldgröße zur Compile Zeit bekannt sein muss?
Ein statischer Datentyp wird dadurch charkterisiert, das er zur Laufzeit in seiner
Größe nicht veränderbar ist, oder?

2.) Sind meine größen nicht Konstant?

3.) Was heißt wegoptimieren?

Gruß

RedWing
 
Original geschrieben von RedWing
@Kacheletor

1.)Wer sagt das die Feldgröße zur Compile Zeit bekannt sein muss?
Ein statischer Datentyp wird dadurch charkterisiert, das er zur Laufzeit in seiner
Größe nicht veränderbar ist, oder?

2.) Sind meine größen nicht Konstant?

3.) Was heißt wegoptimieren?

Gruß

RedWing

Ein statischer Datentyp wird dadurch charakterisiert, dass er zur Laufzeit in seiner Größe nicht veränderbar ist, da die Größe zur Compile-Zeit festgelegt wurde. Der Speicher wird dabei in einem speziellen Codesegement reserviert (.DATA normalerweise) und nicht auf dem HEAP.

Deine Größen sind vielleicht konstant zur Laufzeit - können sich aber von Lauf zu Lauf ändern bzw. von Funktionsaufruf zu Funktionsaufruf.

Wegoptimiert heisst, dass der Code nicht in die exe geschrieben wurde, da der Compiler festgestellt hat, dass er nie ausgeführt wird. Dadurch entsteht dann natürlich auch kein Fehler zur Compilezeit. Am besten ist, du schaust die das Disassembly von deinem Programm in einem Debugger wie z.B. OllyDbg an und verfolgst den Programmablauf im Einzelschrittmodus. Dann müsstest du es sehen.
 
Also, meine Parameter sind Konstante,

Aber ich habe das jetzt mit malloc probiert. - Natürlich habe ich keine Ahnung, ob ich das so richtig gemacht habe.
Code:
	// Das Bild als zweidimensionales Array
	unsigned char **image;
	image = (unsigned char **) malloc(spalten*zeilen *sizeof(unsigned char) );
Jetzt habe ich das Problem, wenn ich image Werte zuweisen will.
Code:
	for(zeile = 0; zeile<zeilen; zeile++)
	{
		for(spalte = 0; spalte<spalten; spalte++)	
		{
			i = zeile * spalten + spalte;
			image[spalte][zeile] = input[i];						
		}

	}
Wobei folgende Parameter existieren:
Code:
void CSegmentation::EdgeTracing(unsigned char *input, const int zeilen, const int spalten, int minLength)
Dabei bricht das Programm immer mit Fehlermeldung ab, wenn ich die Zeile mit der Zuweisung von image erreiche. :mad:
Wieso? - Kompilieren tut er ja ohne Probleme.
 
Siehe link oben - da ist ein Codebeispiel. Ich kann es leider hier nicht ausprobieren - bin auf Arbeit.

probier mal: image[ i ] stattdessen aus.
 
Zurück