Übergabe von Feldern



  • Ich habe versucht ein Programm zu schreiben das Matritzen multipliziert. Im Endeffekt ist dies aber nebensächlich da ich ein Grundlegendes Problem habe. Die Übergabe von Array bzw. Feldern.

    Als erstes der Funktionsaufruf meine Funktion die rechnen soll.
    Was ist daran falsch?

    matrix3[][] = multmatrix(matrix1[][], matrix2[][]);
    

    Hier die Funktion selbst:
    Was ist daran falsch?

    double multmatrix(double m1[][], double m2[][]) {
        double m3[3][3];   //Diese MAtrix wird zurückgegeben
        int i,j,k;         //Schleifenvariablen
    
         //hier wird ganz viel gerechnet......
    
        return m3[][];
    }
    

    Mal danke im Voraus für die Hilfe
    ------------------------------------------------------------------------

    Zum Schluss nochmal das ganze Programm bis jetzt...

    #include <stdio.h>
    
    double multmatrix(double m1[][], double m2[][]) {
              double m3[3][3]; //Return Matrix
       int i,j,k;         //Schleifenvariablen
    
       while (i<3) {
           j=0;
    
           while (j<3) {
                          k=0;
               m3[i][j]=0;
               while (k<3) {
    
                   m3[i][j]=m3[i][j]+(m1[i][k]*m2[k][j]);
    
                   /*Ausgabe der Feldelemente*/
                   printf("\ni:%d    j:%d    k:%d  m3:%.4f  m1:%.4f m2:%.4f",i,j,k,m3[i][j],m1[i][k],m2[k][j]);
                   k++;
               }
               j++;
           }
           i++;
       }
    
       return m3[][];
    
    }
    
    void main() {
    
       double matrix1[3][3]; //erste Matrix
       double matrix2[3][3]; //zweite Matrix
       double matrix3[3][3]; //Ergebnis Matrix
    
       int i, j;             //Schleifenvariablen
    
       printf("\nGeben Sie bitte die 3*3 Elemente der 1. Matrix ein: ");
       for(i=0; i<3; i++){
           scanf("%lf %lf %lf", &matrix1[i][1], &matrix1[i][2], &matrix1[i][3]);
       }
       printf("\nGeben Sie bitte die 3*3 Elemente der 2. Matrix ein: ");
       for(i=0; i<3; i++){
           scanf("%lf %lf %lf", &matrix2[i][1], &matrix2[i][2], &matrix2[i][3]);
       }
    
       matrix3[][] = multmatrix(matrix1[][], matrix2[][]);
    
       printf("\n\nErgebnismatrix ist: ");
    
       for(i=0; i<3; i++) {
           for(j=0; j<3; j++) {
               printf("%5.2lf ", matrix3[i][j]);
           }
           printf("\n");
       }
    }
    


  • hmm.. würde ich so ähnlich machen:

    void multmatrix(const double m1[3][3], const double m2[3][3],double result[3][3]) 
    { 
        int i=0,j=0,k=0;         //Schleifenvariablen
        while (i<3) { 
           j=0; 
    
           while (j<3) { 
               k=0; 
               result[i][j]=0; 
               while (k<3) { 
    
                   result[i][j]=result[i][j]+(m1[i][k]*m2[k][j]); 
    
                   /*Ausgabe der Feldelemente*/ 
                   printf("\ni:%d    j:%d    k:%d  m3:%.4f  m1:%.4f m2:%.4f",i,j,k,result[i][j],m1[i][k],m2[k][j]); 
                   k++; 
               } 
               j++; 
           } 
           i++; 
        } 
    }
    


  • @CMatt
    Bist du dir sicher, dass das so dann funktioniert, wie es sollte?

    Ich würde es eher so machen:

    double **multmatrix(const double **matrix1, const double **matrix2);
    //oder
    void multmatrix(const double **matrix1, const double **matrix2, double **ergebnis);
    //das sollte auch kein Problem geben
    void multmatrix(const double matrix1[][], const double matrix2[][], double ergebnis[][]);
    


  • double **multmatrix(const double **matrix1, const double **matrix2);

    aber dann bitte kein:

    double* bla()
    {
      dobule f[3][3];
    ...
      return f;
    }
    

    wie oben



  • Also, der Aufruf muss dann schonmal anders lauten, denn der Name eines Arrays (in deinem Fall also matrix1 und matrix2) ist bereits ein (konstanter!) Zeiger auf das Array.

    Arrays als Rückgabewerte sind schwierig zu handhaben. Du musst entweder deine Ergebnismatrix bereits vor dem Funktionsaufruf mit

    double ergebnismatrix[3][3];
    

    angelegt haben oder in deiner Funktion mit

    malloc()
    

    anlegen. In letzterem Fall solltest Du hinterher auf jeden Fall auch den angeforderten Speicher mit

    free()
    

    wieder freigeben.
    Die Funktion würde ich dann so schreiben:

    void mmult(const double matrix1[][3], const double matrix2[][3], double ergmatrix[][3])
    {
        int i, j, k;
        for (i = 0;i < 3;i++)
        {
            for (j = 0;j < 3;j++)
            {
                ergmatrix[i][j] = 0.0;
                for (k = 0;k < 3;k++)
                {
                    ergmatrix[i][j] += matrix1[i][k] * matrix2[k][j];
                }
            }
        }
    }
    

    Funktioniert so, allerdings eben nur für 3x3-Matrizen
    Alles andere muss man wohl dynamisch machen



  • CMatt schrieb:

    double **multmatrix(const double **matrix1, const double **matrix2);

    aber dann bitte kein:

    double* bla()
    {
      dobule f[3][3];
    ...
      return f;
    }
    

    wie oben

    Sicherlich nicht 😉



  • Danke erstmal für die ganze Hilfe. Ich denk ich hab das einigermassen begriffen. Mit Zeigern hab ich mich bisher leider noch nicht auseinandersetzen können, aber ich seh das es ohne das Wissen nicht mehr geht.


Anmelden zum Antworten