C - 2D Array an Funktion übergeben - Pointer

Manda

Erfahrenes Mitglied
Hallo Leute,
ich versuche einfach ein 2D-Array an eine Funktion zu übergeben. Leider kommen dort falsche Werte raus, als die die im Array vordefiniert sind.
Ich hab auch schon im Internet gesucht, aber konnte mir selbst nicht helfen. Nun hoffe ich, dass einer von euch helfen könnte.

C++:
int main(void)
{
	int matrix[ZEILE][SPALTE] ={	{5,3,0,0,7,0,0,0,0},
											{6,0,0,1,9,5,3,0,0},
											{0,9,8,0,0,0,0,6,0},
											{8,0,0,0,6,0,0,0,3},
											{4,0,0,8,0,3,0,0,1},
											{7,0,0,0,2,0,0,0,6},
											{0,6,0,0,0,0,2,8,0},
											{0,0,0,4,1,9,0,0,5},
											{0,0,0,0,8,0,0,7,9}
										};
	int *ptr = matrix;
	menu(ptr); 
	return 0;
}

void menu(int *matrix)
{
//Kopiere hier nur das wesentliche rein
ausgabe(&matrix);
}

void ausgabe(int *matrix)
{	
	int i = 0;
	int j = 0;
	int *mat[SPALTE];
   
	for(i=0; i<SPALTE; i++)
		mat[i] =  *matrix;

	system("cls");
	printf("Ausgabe Sudoku:\n");
	printf("===============\n");
	printf("\n");
	printf("+---------------------------------+\n");
	for(i=0; i<ZEILE; i++) 
	{		
		if( (i > 0) && (i % 3 == 0) )
		{
			 printf("+---------------------------------+\n");
		}
		printf("|");
		for(j=0; j<SPALTE; j++) 
		{
			 if( (j > 0) && (j % 3 == 0) )
			 {
				printf(" + ");
			 }
			 printf(" %d ", mat[i][j]);
		}
		printf("|\n");
   }
	printf("+---------------------------------+\n");
	printf("\n");	
	system("pause");	
}

Erwartet: Einfach nur das Array mit den Werten ausgeben.
Problem: Es kommen ganz andere Werte raus:confused:

Danke viel mals!
Gruß

Manda
 
C++:
void menu(int *matrix)
{
ausgabe(&matrix);
}

void ausgabe(int *matrix)
{	
}

Muss lauten

C++:
void menu(int *matrix)
{
ausgabe(matrix); // <--
}

void ausgabe(int *matrix)
{	
}

Ausgabe erwartet einen Zeiger, aber anstelle des Zeigers übergibst Du die Adresse des Zeigers.
 
Hi.

Du solltest die Warnungen deines Compilers einschalten und diese auch beachten.

Mein Compiler (GCC) sagt zu deinem Code:
Code:
foo.c: In function ‘main’:
foo.c:13: warning: initialization from incompatible pointer type
foo.c: In function ‘menu’:
foo.c:21: warning: passing argument 1 of ‘ausgabe’ from incompatible pointer type
foo.c: note: expected ‘int *’ but argument is of type ‘int **’
foo.c: In function ‘ausgabe’:
foo.c:31: warning: assignment makes pointer from integer without a cast
Warum übergibst du in Zeile 21 einen Zeiger auf einen Zeiger?

Außerdem hast du ein statisch definiertes Array an die Funktion übergeben. Siehe http://www.tutorials.de/forum/c-c/332487-2d-array-als-funktionsparameter.html wie man ein solches Array ausgeben kann. Evtl. solltest du mal suchen üben ;-]

Gruß
 
@deepthroat: Danke erstmal.
Aus der Warnmeldung werde ich leider nicht schlau draus:confused:
Code:
'function' : Anzahl der Dereferenzierungen bei 'int *' und 'int [9][9]' unterschiedlich
Diese ercheint beim Aufruf von "menu(matrix)".
Hab das nun folgendermaßen gemacht:

C++:
#include<stdio.h>
#include<stdlib.h>

#define  ZEILE 9
#define SPALTE 9

int main(void)
{
//Die Matrix ist hier auch noch drin, wollte sie nicht wieder rein kopieren.
    menu(&matrix[0][0], ZEILE, SPALTE);//ist [0][0] ok? oder [ZEILE][SPALTE] besser?
}

void menu(int *matrix, int zeile, int spalte)
{
//ausgabe(&matrix[0][0], zeile, spalte) <- ergibt leider einen Fehler. Aber warum?
//Ich will ja einfach nur die Matrix weiter reichen. Die Ausgabe Funktion erwartet als Parameter ja das selbe.
    ausgabe(matrix, zeile, spalte);
}

void ausgabe(int *matrix, int zeile, int spalte)
{	
	int i = 0;
	int j = 0;
	int *mat[SPALTE];
   
	for(i=0; i<SPALTE; i++)
		mat[i] =  *matrix;

	system("cls");
	printf("Ausgabe Sudoku:\n");
	printf("===============\n");
	printf("\n");
	printf("+---------------------------------+\n");
	for(i=0; i<ZEILE; i++) 
	{		
		if( (i > 0) && (i % 3 == 0) )
		{
			 printf("+---------------------------------+\n");
		}
		printf("|");
		for(j=0; j<SPALTE; j++) 
		{
			 if( (j > 0) && (j % 3 == 0) )
			 {
				printf(" + ");
			 }
			 printf(" %d ", mat[i][j]);
		}
		printf("|\n");
   }
	printf("+---------------------------------+\n");
	printf("\n");	
	system("pause");	
}

Jetzt stürzt das Proramm gleich ab und gibt garnichts aus. Habe ich was übersehen?
Hoffe du kannst mir da nochmal helfen.

Gruß
Manda
 
@deepthroat: Danke erstmal.
Aus der Warnmeldung werde ich leider nicht schlau draus:confused:
Code:
'function' : Anzahl der Dereferenzierungen bei 'int *' und 'int [9][9]' unterschiedlich
Diese ercheint beim Aufruf von "menu(matrix)".
Welchen Compiler verwendest du? Diese Warnung kannst du ignorieren.
Jetzt stürzt das Proramm gleich ab und gibt garnichts aus. Habe ich was übersehen?
Du hast die ausgabe Funktion ja auch nicht verändert. Was soll denn das bringen:
C:
int *mat[SPALTE];
   
    for(i=0; i<SPALTE; i++)
        mat[i] =  *matrix;
Das ist Unfug. Und auf mat[x][y] kannst du nicht zugreifen.

Schau dir nochmal das verlinkte Thema an. Da siehst du doch wie du auf ein mehrdimensionales, statisches Array in einer Funktion zugreifen kannst.

Gruß
 
@deepthorat: Ich benutze Visual Studio 6.0
Ich hab mir das nochmal angeschaut (dein link) und habe mein Code wie folg verändert:

C++:
int main(void)
{
   menu(matrix);
   return 0;
}

void menu(int (*matrix)[SPALTE])
{
  ausgabe(matrix);
}

void ausgabe(int (*matrix)[SPALTE])
{
//Das mache ich, weil ich das Array in ein anderes Array speichern muss.
//So bekam ich jedenfalls eine Ausgabe. Ich konnte nicht auf das Array aus der
//Parameterliste zugreifen und ausgeben. 
  for(i=0; i<SPALTE; i++)
  {
    mat[i] =  *matrix;
    matrix += ZEILE;
  }
//...
}

Jetzt kriege ich nur die 1.Zeile vom Array korrekt ausgegeben, aber beim Rest kommt was falsches raus. Die Warnmeldung ist auch jetzt weg.

Gruß
Manda
 
Zurück