Fehler: 2-dimensionales Array an Funktion übergeben



  • 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 so

    int 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.


Anmelden zum Antworten