Fehler: 2-dimensionales Array an Funktion übergeben
-
Moin,
es wurde außer der Anmerkung von Wutz nichts verändert. Ich programmiere nur mit einem Texteditor und kompiliere es mit gcc von Mac OS 10.6 über Konsole. Ich hoffe, der legt nicht woanders als außer in dem Ordner Ordner an. Da gibt es keinen Debug-Ordner.
Gruß knoidc
-
Hast du evtl. die Funktionsdeklarationen vor main vergessen?
Dann ziehe doch beide Definitionen vor main.Sonst habe ich keine Idee, außer, zeilenweise auskommentieren bis der Fehler gefunden ist
-
mach doch noch mal ein kleines programm mit der funktion und übergabe und poste nochmal, wenns nicht klappt.
-
Moin.
Fehler bleibt bestehend.#include <stdio.h> #include <stdlib.h> // Funktionen void zweiDimensionalesFeldFuellen(int *, int); // Konstanten const int ANZZEILE = 3; const int ANZSPALTE2 = 4; int main(void) { // Variablen int zweiDimensionalesFeld[ANZZEILE][ANZSPALTE2]; zweiDimensionalesFeldFuellen(zweiDimensionalesFeld, ANZZEILE, ANZSPALTE2); } void zweiDimensionalesFeldFuellen(int feld[][ANZSPALTE2], int zeile, int spalte) { // Variablen int i, j; printf("Sie haben ein 2 dimensionales Feld mit 3*4 Elementen gewählt.\n"); printf("Geben nach einander die einzelnen Werte ein und bestätigen immer mit Enter.\n"); // Zahlen eingeben for (i = 0; i < zeile; i++) { for (j = 0; j < spalte; j++) { printf("Geben Sie den Wert für [%i][%i] ein:", i, j); scanf("%d", &feld[i][j]); } } }
felder2.c: In function ‘main’: felder2.c:16: warning: passing argument 1 of ‘zweiDimensionalesFeldFuellen’ from incompatible pointer type felder2.c:16: error: too many arguments to function ‘zweiDimensionalesFeldFuellen’ felder2.c: At top level: felder2.c:19: error: conflicting types for ‘zweiDimensionalesFeldFuellen’ felder2.c:6: error: previous declaration of ‘zweiDimensionalesFeldFuellen’ was here
-
das erklärt alles. zähl mal die parameter und vergleiche die typen.
-
Upps... Danke für den Hinweis.
void zweiDimensionalesFeldFuellen(int *, int, int);
Fehler bleibt bestehen.
Gruß.
-
richtig, denn int feld[][ANZSPALTE2] ist nicht gleicht int*
also, entweder void zweiDimensionalesFeldFuellen(int feld[][ANZSPALTE2], int, int);
oder void zweiDimensionalesFeldFuellen(int (*)[ANZSPALTE2], int, int );oder int* nehmen und auch einen int* übergeben.
alles weitere findest du hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-267357.html
-
Hallo machma,
danke für die Hilfe. Ich habe es mit Pointer realisiert. Für 1-dimension geht, für 2 nicht. Mein Code:void einDimensionalesFeldFuellen(int *, int); void zweiDimensionalesFeldFuellen(int (*)[ANZSPALTE2], int, int); int main(void) { // Variablen int *einDimensionalesFeld[ANZSPALTE1]; int *zweiDimensionalesFeld[ANZZEILE][ANZSPALTE2]; einDimensionalesFeldFuellen(*einDimensionalesFeld, ANZSPALTE1); zweiDimensionalesFeldFuellen(*zweiDimensionalesFeld, ANZZEILE, ANZSPALTE2); printf("Das Feld sieht so aus: \n"); for (i = 0; i < ANZZEILE; i++) { for (j = 0; j < ANZSPALTE2; j++) { printf("[%i] \t ", *zweiDimensionalesFeld[i][j]); } printf("\n"); } } void einDimensionalesFeldFuellen(int feld[ANZSPALTE1], int anzahl) { // Variablen int i; printf("Sie haben ein 1 dimensionales Feld mit 5 Elementen gewählt.\n"); printf("Geben nach einander die einzelnen Werte ein und bestätigen immer mit Enter.\n"); // Zahlen eingeben for (i = 0; i < anzahl; i++) { printf("Geben Sie den Wert für [%i]ein: ", i); scanf("%d", &feld[i]); } } void zweiDimensionalesFeldFuellen(int feld[ANZZEILE][ANZSPALTE2], int zeile, int spalte) { // Variablen int i, j; printf("Sie haben ein 2 dimensionales Feld mit 3*4 Elementen gewählt.\n"); printf("Geben nach einander die einzelnen Werte ein und bestätigen immer mit Enter.\n"); // Zahlen eingeben for (i = 0; i < zeile; i++) { for (j = 0; j < spalte; j++) { printf("Geben Sie den Wert für [%i][%i] ein:", i, j); scanf("%d", &feld[i][j]); } } }
warning: passing argument 1 of ‘zweiDimensionalesFeldFuellen’ from incompatible pointer type
Bei der Ausgabe für 2 dim. Array kommt der Fehler:
Das Feld sieht so aus: Segmentation fault
Ich denke, ich verstehe den Konzept nicht so richtig. Danke für die Nachsicht!
Gruß
-
Ist mir alles irgendwie zu kompliziert
wie wäre es denn mit folgender Vorwärtsdeklaration:
void zweiDimensionalesFeldFuellen(int *feld, int zeile, int spalte);
mit folgender Deklaration und Funktionsaufruf
int zweiDimensionalesFeld[ANZZEILE][ANZSPALTE2]; zweiDimensionalesFeldFuellen(*zweiDimensionalesFeld, ANZZEILE, ANZSPALTE2);
und deiner Funktion
void zweiDimensionalesFeldFuellen(int *feld, int zeile, int spalte) { [...] scanf("%d", &feld[i*zeile+j]); [...] }
versuch durch ein einfaches Beispiel zu verstehen, wie Array's funktionieren.
int main() { int x[25]; for(int i=0; i<25; ++i) x[i] = i; // Zeiger auf das erste Element cout << *x << " oder " << x[0] << endl; // Zeiger auf das fuenfte Element cout << *x+5 << " oder " << x[5] << endl; }
Versuch jetzt mit einem zweidimensionalen Array ebenfalls mal, verschiedenen Dinge auszugeben.
//Edit Kommentare ergaenzt
-
Huhu,
man deklariert die Felder soint eind [N]; int zweid [Z][S];
und übergibt nur die Bezeichner, also
eind_fuellen( eind, ...
zweid_fuellen( zweid, ..In der for Schleife ist das Sternchen auch zuviel, die Dereferenzierung bekommst du
frei Haus durch die Indexschreibweise.
printf("[%i] \t ", zweid[i][j]);#include <stdio.h> #define ANZZEILE 2 #define ANZSPALTE1 3 #define ANZSPALTE2 4 void einDimensionalesFeldFuellen ( int*, int ); void zweiDimensionalesFeldFuellen ( int(*)[ANZSPALTE2], int, int ); int main(void) { // Variablen int i, j; int einDimensionalesFeld[ANZSPALTE1] = {0}; int zweiDimensionalesFeld[ANZZEILE][ANZSPALTE2] = {0}; einDimensionalesFeldFuellen(einDimensionalesFeld, ANZSPALTE1); zweiDimensionalesFeldFuellen(zweiDimensionalesFeld, ANZZEILE, ANZSPALTE2); printf ( "Das Feld sieht so aus: \n" ); for (i = 0; i < ANZZEILE; i++) { for (j = 0; j < ANZSPALTE2; j++) { printf( "[%i] \t ", zweiDimensionalesFeld[i][j]); } printf("\n"); } } void einDimensionalesFeldFuellen ( int feld[ANZSPALTE1], int anzahl ) { // Variablen int i; printf("Sie haben ein 1 dimensionales Feld mit %u Elementen gewählt.\n", anzahl); printf("Geben nach einander die einzelnen Werte ein und bestätigen immer mit Enter.\n"); // Zahlen eingeben for (i = 0; i < anzahl && i < ANZSPALTE1; i++) { printf ( "Geben Sie den Wert für Element[%i] ein: ", i ); scanf ( "%d", &feld[i] ); } } void zweiDimensionalesFeldFuellen(int feld[ANZZEILE][ANZSPALTE2], int zeile, int spalte) { // Variablen int i, j; printf ( "Sie haben ein 2 dimensionales Feld mit %u*%u Elementen gewählt. \n", zeile, spalte ); printf ( "Geben nach einander die einzelnen Werte ein und bestätigen immer mit Enter.\n" ); // Zahlen eingeben for ( i = 0; i < zeile && i < ANZZEILE; i++ ) { for ( j = 0; j < spalte && j < ANZSPALTE2; j++ ) { printf ( "Geben Sie den Wert fürs Element[%i][%i] ein:", i, j ); scanf ( "%d", &feld[i][j] ); } } }
-
Was spricht denn gegen
void zweiDimensionalesFeldFuellen ( int**, int, int );
?
Grüße
-
trion schrieb:
Was spricht denn gegen
void zweiDimensionalesFeldFuellen ( int**, int, int );
?
Die Tatsache, das es nicht geht. Bitte die Beiträge erst lesen.
Die beste Lösung wäre sowieso auf Arrays mit mehr als einer Dimension zu verzichten, und stattdessen lieber die Dimensionen simulieren.