Mehrdimensionales Array als Parameter an Array übergeben?



  • Hi Leute!

    Ich möchte ein mehrdimensionales Array an eine Funktion als Parameter übergeben. Wie mache ich das richtig?

    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
    
    void skalarMult(int **matrix, int zeilen, int spalten, int skalar)
    {
    	int i;
    	while(i != (zeilen-1))
    	{
    
    		i = i + 1;
    	}
    }
    
    int main()
    {
    	int matrix[3][3] = {{3,0,5},{5,0,6},{4,4,5}};
    	int zeilen, spalten, skalar;
    
    	printf("Bitte den zu multiplizierenden Skalar eingeben: ");
    	scanf("lambda = %i\n\n", &skalar);
    
    	zeilen = 3;
    	spalten = 3;
    
    	skalarMult(matrix, zeilen, spalten, skalar);
    
    return 0;
    }
    

    Ich möchte ein 3x3-Matrix an eine Funktion übergeben und dann mit dem Skalar multiplizieren. Wie mache ich das? So wie es momentan is gehts leider nicht ...



  • Genau so wie eindimensionale.

    Tipp: Fülle das Array zum testen mit eindeutigen Werten

    int matrix[3][3] = {{11,12,13},{21,22,23},{31,32,33}};
    

    und drucke es aus

    void MatPrint(int *matrix, int zeilen, int spalten, int skalar)
    {
        int i;
        for (i=0;i<(zeilen*spalten);i++)
        {
           printf ("%2d : %d\n",i, *(matrix+i))
        }
    }
    


  • Bei meinem Funktionsaufruf in der main wird das matrix unterringelt. Die Funktion ist jetzt genauso wie deine... Ich kann das Programm somit nicht starten...

    #include<stdio.h>
    
    void skalarMult(int *matrix, int zeilen, int spalten, int skalar)
    {
    	int i;
    	for(i=0; i<(zeilen*spalten); i=i+1)
    	{
    		printf("%i : %i\n", i, *(matrix+i));
    	}
    }
    
    int main()
    {
    	int matrix[3][3] = {{11,12,13},{21,22,23},{31,32,33}};
    	int zeilen, spalten, skalar;
    
    	printf("Bitte den zu multiplizierenden Skalar eingeben: ");
    	scanf("lambda = %i\n\n", &skalar);
    
    	zeilen = 3;
    	spalten = 3;
    
    	skalarMult(matrix, zeilen, spalten, skalar);
    
    return 0;
    }
    

    Fehlermeldung lautet wie folgt: Konvertierung des Parameters 1 von 'int [3][3]' in 'int *' nicht möglich.

    Wenn ich aber nun den Funktionsaufruf zu

    skalarMult(*matrix, zeilen, spalten, skalar);
    

    ändere, dann rennt der Compiler durch. Ich hätte gedacht, man macht auch bei mehr dimensionalen die Parameterübergabe gleich?



  • NOch ein weiteres Problem. Ich möchte, dass die Ausgabe so aussieht:

    11 12 13
    21 22 23
    31 32 33
    

    Mit der normalen Indizierungsmethode mit zwei ineinanderverschachtelten for-Schleifen hab ich damit kein Problem mehr. Wie ich das aber jetzt mit arrays mache die als Pointer übergeben worden sind hab ich leider keine Ahnung. Ich hab mal so angefangen:

    void skalarMult(int *matrix, int zeilen, int spalten, int skalar)
    {
    	int i, j;
    	for(i=0; i<zeilen; i=i+1)
    	{
    		for(j=0; j<spalten; j=j+1)
    		{
    			printf("%i", *(matrix+j));
    		}
    		printf("\n");
    	}
    }
    


  • So, jetzt kann ich zwar schon mal multiplizieren, aber mir fehlt mir immer noch die für eine Matrix typische Darstellung:

    #include<stdio.h>
    
    void skalarMult(int *matrix, int zeilen, int spalten, int skalar)
    {
    	int i, j, zahl;
    	for(i=0; i<(zeilen*spalten); i=i+1)
    	{
    		*(matrix+i) = *(matrix+i) * skalar;
    		printf("%i", *(matrix+i));
    	}
    }
    
    int main()
    {
    	int matrix[3][3] = {{11,12,13},{21,22,23},{31,32,33}};
    	int zeilen, spalten, skalar;
    
    	printf("Bitte den zu multiplizierenden Skalar eingeben: ");
    	scanf("%i", &skalar);
    
    	zeilen = 3;
    	spalten = 3;
    
    	skalarMult(*matrix, zeilen, spalten, skalar);
    
    return 0;
    }
    


  • if(i % zeilen == 0)
       printf("\n");
    


  • Überleg mal wie du die Adresse des ersten Elements von matrix bekommst.

    Und dann schau mal an welcher stelle die 11, die 21 und die 31 stehen. Dann schau dir zeilen und spalten an und kombiniere.



  • Ich würde das mit einer struct machen:

    typedef struct { int** elements; int cols, rows; } matrix;
    


  • Überleg mal wie du die Adresse des ersten Elements von matrix bekommst.

    Naja das erste Element bekomm ich ja mit *(matrix+i) wenn der schleifenzähler auf 0 steht.

    Und dann schau mal an welcher stelle die 11, die 21 und die 31 stehen. Dann schau dir zeilen und spalten an und kombiniere.

    Die 11, 21 und 31 sind ja die Anfangselemente jeder weiteren Zeile, nicht wahr?

    D.h., ich bräuchte nach jeweils 3 Elementen einen Zeilenumbrauch auf der Konsole...



  • So, ich glaub ich hab's, aber wahrscheinlich werdet ihr mich gleich schlagen 🙂

    void skalarMult(int *matrix, int zeilen, int spalten, int skalar)
    {
    	int i, j, zahl;
    	for(i=0; i<(zeilen*spalten); i=i+1)
    	{
    		*(matrix+i) = *(matrix+i) * skalar;
    		if((i % spalten) == 0)
    		{
    			printf("\n");
    		}
    		printf("%i ", *(matrix+i));
    	}
    }
    


  • Aber welche 3? Zeilen oder Spalten?

    Dann mach mal eine 3*4 und eine 4*3 Matrix und schau nochmal.



  • Ich glaub da hat sich grad ein Edit überschnitten! So geht's jedenfalls jetzt auch mit anderen Matrixgrößen!

    #include<stdio.h>
    
    void skalarMult(int *matrix, int zeilen, int spalten, int skalar)
    {
    	int i, j, zahl;
    	for(i=0; i<(zeilen*spalten); i=i+1)
    	{
    		*(matrix+i) = *(matrix+i) * skalar;
    		if((i % spalten) == 0)
    		{
    			printf("\n");
    		}
    		printf("%i ", *(matrix+i));
    	}
    }
    
    int main()
    {
    	int matrix[4][3] = {{11,12,13},{21,22,23},{31,32,33},{41,42,43}};
    	int zeilen, spalten, skalar;
    
    	printf("Bitte den zu multiplizierenden Skalar eingeben: ");
    	scanf("%i", &skalar);
    
    	zeilen = 4;
    	spalten = 3;
    
    	skalarMult(*matrix, zeilen, spalten, skalar);
    
    return 0;
    }
    

    Wenn man die Matrix-Größe ändert, dann muss man halt nun auch noch die Indizierung des arrays bei der deklaration sowie die anzahl der zeilen und spalten ändern!


Anmelden zum Antworten