C Problem mit Array-Deffinition

schulze_91

Newbie
Dabei seit
Nov. 2009
Beiträge
1
hallo,
ich habe folgendes programm geschrieben , jedoch sagt mit der pc das das array nicht richtig deffiniert ist. er sagt mir syntax error near char , damit ist die zeile gemeint:
Code:
 	char Anzeige[9][7]={{0,0,0,0,1,1,0},		//Zahl1
hier der ganze code:
Code:
 #include<reg517a.h>
 void zeile(char spalte);
 char taster[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
 void wait1ms(int k);
 int i;
 void main(void)
  {
   char blink[8];
   		 char Anzeige[9][7];
    	P1=0;
	P4=0;
	P8=0x0f;
	   blink[0]=0x01;
	 blink[1]=0x02;
	 blink[2]=0x04;
	 blink[3]=0x08;
	 blink[4]=0x10;
	 blink[5]=0x20;
	 blink[6]=0x40;
	 blink[7]=0x80;
	 
 	char Anzeige[9][7]={{0,0,0,0,1,1,0},		//Zahl1
					 	 {1,0,1,1,0,1,1},
					 	 {1,0,0,1,1,1,1},
					 	 {1,1,0,0,1,1,0},
						 {1,1,0,1,1,0,1},
						 {1,1,1,1,1,0,1},
						 {0,0,0,0,1,1,1},
						 {1,1,1,1,1,1,1},
						 {1,1,0,1,1,1,1}};	   //Zahl9


	while(1)
		{
			P6=1;
		 	for(i=0;i<9;i++)
		 		{
					P4=Anzeige[i];
					wait1ms(2000);
				}	
				
			
				
		
		}
 }

 void zeile(char spalte)
 	{
 		if((P8&0x01)==0)
		taster[spalte][0]=1;
		if((P8&0x02)==0)
		taster[spalte][1]=1;
		if((P8&0x04)==0)
		taster[spalte][2]=1;
		if((P8&0x08)==0)
		taster[spalte][3]=1;
	}

void wait1ms(int k)
	{
		int i,j;
		for(j=0;j<k;j++)
		for(i=0;i<122;i++);
	}
 

Arnd

Lieutenant
Dabei seit
Jan. 2005
Beiträge
926
Das hier:

char Anzeige[9][7];

muss weg. Dann sollte es gehen. Anzeige ist doppelt definiert.

MfG

Arnd
 
M

muro4ever

Gast
das erste
char Anzeige[9][7]; muss weg.
beim 2.
char Anzeige[9][7]={{},....{}} müssen die Matrixdimensionen [9][7] weg, denn du gibst ja die Größe der Matix in dem {{},....{}}Block an.
 

XunnD

Lieutenant
Dabei seit
März 2006
Beiträge
728
das erste
char Anzeige[9][7]; muss weg.
beim 2.
char Anzeige[9][7]={{},....{}} müssen die Matrixdimensionen [9][7] weg, denn du gibst ja die Größe der Matix in dem {{},....{}}Block an.
Anmerkung: die Angaben über die Feldgrößen sind bei nachfolgenden Initialisierungen nicht zwingend erforderlich, aber auch nicht verboten!
Initialisierungen dieser Art sind auch nur bei der Variablendeklaration möglich - eine spätere Zuweisung in dieser Syntax ist nicht möglich.

Zudem sollte vielleicht noch erklärt werden, warum 'Anzeige' entfernt werden muss: Variablen sind innerhalb eines Sichtbarkeitsbereichs (Funktionen, Anweisungsblöcke, etc.) eindeutig. Eine nochmalige Deklaration von 'Anzeige' in einer tieferen Ebene ist durchaus möglich - ein Beispiel:

Fehler:
Code:
void func() {
	int i;
	i=1;
	int i; // 2. Deklaration innerhalb des Sichtbarkeitsbereichs
	i=2;
}
Möglich, birgt jedoch Fallstricke:
Code:
void func() {
	int i;
	i=1;
	if (i==1) { // neue Sichtbarkeit
		int i; // 2. Deklaration, daher möglich - ACHTUNG: i mit dem Wert 1 ist hier nicht mehr sichtbar!!!
		i=2;
	}
}
 

BlackMark

Lt. Commander
Dabei seit
Juni 2007
Beiträge
1.281
@XunnD: Dem kann man jedoch noch etwas hinzufügen:
Code:
void func() {
	int i;
	i=1;
	if (i==1) { // neue Sichtbarkeit
		int i; // 2. Deklaration, daher möglich - ACHTUNG: i mit dem Wert 1 ist hier nicht mehr sichtbar!!!
		i=2;
	}

	i=3; // Hier wird das erste i, welches den Wert 1 hat, überschrieben, das i aus der 2. Deklaration ist hier nicht mehr sichtbar!!!
}
Gruß
BlackMark
 

XunnD

Lieutenant
Dabei seit
März 2006
Beiträge
728
@XunnD: Dem kann man jedoch noch etwas hinzufügen:

...code...

Gruß
BlackMark
Man kann sogar eins draufsetzen: das 'int i;' aus dem Anweisungsblock der if-Bedingung ist dort nicht nur mehr 'nicht mehr sichtbar' sondern auch nicht mehr gültig, da auf dem Stack angelegt.
Mit dem Verlassen des Anweisungsblocks werden dort angelegte Variablen wieder freigegeben.

ACHTUNG: Speicher, der innerhalb eines Anwendungsblocks auf dem Heap erzeugt wird (malloc, calloc, etc.), wird nicht implizit freigegeben.
 
Top