2D - Matrix mit Pointer an Funktion übergeben
-
Hallo Jungs,
stehe gerade auf dem Schlauch und komme nicht weiter. Wahrscheinlich ist es einfach als es aussieht (nur ich sehe das Problem gerade nicht).
Szenario: 2D Array (vorinitialisierte int Werte) soll in verschiedenen Methoden an Funktion übergeben werden und ausgegeben werden.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}}; menu(matrix); return 0; } void menu(int matrix[ZEILE][SPALTE]) { //hier ist nur eine Menü ausgabe und die Matrix soll gleich an eine Ausgabe Funktion weiter gegeben werden //Aufruf: ausgabe(matrix); //Hier kriege ich 2 Warnungen //1. 'function': Anzahl der Dereferenzierungen bei int** und int[][9] unterschiedlich //2. 'ausgabe': Unterschiedliche Typen für formalen und übergebenen Parameter 1 } void ausgabe(int **matrix) { int i = 0; int j = 0; system("cls"); printf("Ausgabe Sudoku:\n"); printf("===============\n"); printf("\n"); printf("+---------------------------------+\n"); for(i=0; i<9; i++) { if( (i > 0) && (i % 3 == 0) ) { printf("+---------------------------------+\n"); } printf("|"); for(j=0; j<9; j++) { if( (j > 0) && (j % 3 == 0) ) { printf(" + "); } printf(" %d ", matrix[i][j]); } printf("|\n"); } printf("+---------------------------------+\n"); printf("\n"); system("pause"); }
Schreibe ich die Ausgabe Funktion so:
void ausgabe(int matrix[ZEILE][SPALTE]) dann funktioniert es wunderbar.
Rufe ich vom "menu" aus die Funktion ausgabe mit dem Adressoperator auf, so etwa: ausgabe(&matrix);
Dann gibt er die Matrix zwar aus(leider nicht sortiert) und stürzt gleich ab.Sorry für die main(), kann das hier irgendwie nicht formatieren, dass array.
Ich sehe leider meinen Fehler nicht. Hoffe einer von euch kann mir helfen.
Danke.Gruß
Manda
-
Hallo nochmal. Hat denn keiner eine Idee?
Habe nun folgendes probiert: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) { 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"); }
Nun gibt er alles aus (ohne Absturz), aber es wird nicht das array ausgegeben.
Sondern die Ausgabe ist so:
Ausgabe Sudoku:+---------------------------------+
| 5 3 0 + 0 7 0 + 0 0 0 |
| 5 3 0 + 0 7 0 + 0 0 0 |
| 5 3 0 + 0 7 0 + 0 0 0 |
+---------------------------------+
| 5 3 0 + 0 7 0 + 0 0 0 |
| 5 3 0 + 0 7 0 + 0 0 0 |
| 5 3 0 + 0 7 0 + 0 0 0 |
+---------------------------------+
| 5 3 0 + 0 7 0 + 0 0 0 |
| 5 3 0 + 0 7 0 + 0 0 0 |
| 5 3 0 + 0 7 0 + 0 0 0 |
+---------------------------------+Drücken Sie eine beliebige Taste . . .
Ich frage mich, warum ich einfach das array nicht ausgeben kann?
Hoffe auf weitere Tips von euch...Gruß
Manda
-
Wenn du schon einen 50-Zeiler postest, poste wenigstens noch die Includes und defines mit oO
-
Sorry!
#include<stdio.h> #include<stdlib.h> #define ZEILE 9 #define SPALTE 9
Mehr ist da eigentlich nicht.
Danke.
-
void ausgabe(int *matrix) { ... for(i=0; i<SPALTE; i++) mat[i] = *matrix; // <- '*matrix' muß entsprechend mit 'hochgezählt' werden ... }
-
Du meinst so etwa:
oid ausgabe(int *matrix) { ... for(i=0; i<SPALTE; i++) mat[i] = *matrix++; ... }
So gibt er die 1.Zeile korrekt aus. Aber der Rest scheint durcheinander.
Ist denn der Aufruf korrekt? Weil ich hier Warnmeldungen erhalte.int *ptr; = matrix; menu(ptr);//korrekt??
-
'*matrix++' ist zu wenig. Vielleicht so hier:
for(i=0; i<SPALTE; i++) { mat[i] = *matrix; matrix += ZEILE; }
Zum Aufruf ansich ist folgender Thread interessant:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1809037.html#1809037
-
Beide Programme lassen sich nicht mit "gcc -Wall" kompilieren. Auch Warnungen sollten gelesen werden.
int *ptr = matrix;
Vielleicht solltest du nochmal deine Grundlagen auffrischen. Es heisst ja auch "Programmieren" und nicht "Wildes Herumprobieren" (obwohl es sich reimt). Was soll denn z.B. diese Zeile? matrix ist nicht vom Typ int* . Auch sind noch massenhaft andere komische Sachen im Quelltext zu finden.
-
@hinweis - Danke!
Die Aufrufe hatte ich falsch. Nun rufe ich sie korrekt auf, aber die Ergebnisse kommen leider nicht richtig raus.@knivil
Die Zeile habe ich nun entfernt, weil ich gemerkt habe, dass ich es falsch mache/aufrufe. Ich bin ja am ÜbenNun siehts so aus:
int main(void) { menu(matrix); return 0; } void menu(int (*matrix)[SPALTE]) { ausgabe(matrix); } void ausgabe(int (*matrix)[SPALTE]) { //... for(i=0; i<SPALTE; i++) { mat[i] = *matrix; matrix += ZEILE; } //... }
Wie gesagt, nur die 1.Zeile wird richtig ausgegeben, der Rest nicht mehr.
-
Nein! Warum benutzt du ueberhaupt Zuweisungen in der for-Schleife, wenn du direkt mit matrix arbeiten kannst (solltest)?
void ausgabe(int mat[ZEILE][SPALTE]) { for(int i = 0; i < ZEILE; ++i) { for(int j = 0; j < SPALTE; ++j) { printf(" %d ", mat[i][j]); } printf("\n"); } }
Warum es mit Signatur
void ausgabe(int** mat)
nicht klappt, kann ich dir auf die schnelle auch nicht sagen.
-
@knivil - VIELEN DANK!
Nun funktionierts, kriege alle Werte!Gruß
Manda