Keine Ahnung von Funktionsübergabe und Makros



  • Folgendes Problem ist gegeben, aber keine Angst, ich will keine komplette Lösung 😉

    Schreiben Sie für die Multiplikation einer Matrix mit einem Vektor
    c = A · b
    eine C-Funktion.

    Diese Funktion habe folgenden Aufruf:
    void mave(m,n,a,b,c)

    Dabei besitzen die Parameter folgende Bedeutung:
    m int Zahl der Zeilen der Matrix
    n int Zahl der Spalten der Matrix
    a double* Vektor der Matrixelemente von A
    b double* Vektor b
    c double* Vektor c

    Die Matrix A wird
    zeilenweise im Vektor a gespeichert, so gilt folgende Beziehung:
    Ai,j = ai*n+j

    Für diese Umrechnung der Indizes schreibe man einen Makro INDEX mit
    den Parametern i,j und n, welcher als Ergebnis den Index im Vektor
    a berechnet.

    Der Letzte Absatz ist eigentlich mein Hauptproblem, was soll ich da machen?
    Ich verstehe einfach nicht wozu das dienen soll!?!
    Achja, und wozu dient der Parameter "c" in der Funktion?
    Das ist doch eigentlich das Ergebnis, was soll denn als "c" übergeben werden?

    Ich Hoffe Ihr könnt mir helfen?



  • zeisesoft2000 schrieb:

    Der Letzte Absatz ist eigentlich mein Hauptproblem, was soll ich da machen?
    Ich verstehe einfach nicht wozu das dienen soll!?!

    Du hast ein 2d array, uebergibst es aber in der flachen form als 1d array.

    bsp:
    2x2 matrix
    das sind 4 felder.
    da mehrdimensionale arrays in c echt sucken, wird oft ein 1d array verwendet.
    aus 2x2 wird 1x4
    anzahl der elemente ist gleich, nur sie stehen jetzt ein dimensional im speicher.

    statt
    m[1][1]
    muss man jetzt
    m[3]
    schreiben

    und genau diese umlegung soll dein makro index machen (die formel verrate ich dir mal nicht, da kommst du selber drauf :))

    [quote]Achja, und wozu dient der Parameter "c" in der Funktion?
    Das ist doch eigentlich das Ergebnis, was soll denn als "c" übergeben werden?

    ja, in c kommt das ergebnis.
    der caller uebergibt hier lediglich den speicher.

    siehe zB strcpy()
    nimmt 2 params, target und source. es kopiert source nach target.
    der caller stellt fuer target nur den rohen speicher zur verfuegung.

    genauso soll dein c sein.



  • Erstmal zum Makro. Das erkläre ich dir anhand eines Beispiels:

    #define ADDIERE(a, b) (a + b)
    
    //Verwendung
    int zahl_a = 3, zahl_b = 5;
    printf("%d + %d = %d", zahl_a, zahl_b, ADDIERE(zahl_a, zahl_b));
    

    Erklärung:
    ADDIERE(a, b) wird ersetzt im Beispiel durch (a + b) wobei a = zahl_a ist und b = zahl_b ist. D. h. es steht dann intern (zahl_a + zahl_b) dort:

    printf("%d + %d = %d", zahl_a, zahl_b, (zahl_a + zahl_b));
    

    Genauso kannst du mit Indezes verfahren ;).

    Nun noch zum Parameter:
    In c wird dein Ergebnis gespeichert, das ist richtig. Sinn dabei ist, dass du ja Speicher brauchst in dem das Ergebnis stehen soll. Da du dafür keine lokale Variable verwenden kannst (die ist ja nicht mehr gültig nachdem die Funktion durchgelaufen ist) musst du den Speicherbereich an die Funktion übergeben, wo dein Ergebnis gespeichert werden soll.
    Es gäbe noch die Möglichkeit lokal einen Zeiger zu definieren, mit malloc() den nötigen Speicher zu reservieren und dann diesen Zeiger zurückzugeben, aber ich denke so weit bist du noch nicht. Außerdem müsstest du dich danach um die Freigabe des Speichers mit free() kümmern.

    Edit: Ich hatte es noch nie so mit den Namen der Operatoren 🤡



  • AJ schrieb:

    #define ADDIERE(a, b) (a * b)

    👍 👍 👍

    🤡



  • ich danke euch beidern erst einmal für eure versuche es mir ein wenig verständlicher zu machen. werde mich gleich mal hinsetzen und es versuchen in mein bestehendes programm irgendwie versuchen einzubinden.
    wenn ich weiterhin probleme habe, meld' ich mich wieder.

    denn ich habe es bisher zwar alles so wie es gefordert wird:

    #include <stdio.h>
    #include <conio.h>
    #define DIM_M 10     //  max. Anzahl Spalten
    #define DIM_N 10     //  max. Anzahl Zeilen
    // m ist y 
    // n ist x
    
    void mave(int m,int n,int a[DIM_N],int b[DIM_N],int c[DIM_N])
    {
    int i;
    int zw=0;
        for( i=0;i<=n-1;i++){
            //printf("\nUebergebner Vektor der Matrix: %i",a[i]);
            //printf("\nUebergebner Vektor : %i",b[i]);
    
            zw=zw+a[i]*b[i];
        }
            printf("\nErgebnis: %i",zw);
    
    }
    main(){
        int Vektor[DIM_N];
        int Matrix[DIM_M][DIM_N];
        int A[DIM_N]={0,9,4};
        int N,M;
        int x,y,d,w;
    
    printf("X-Dimension der Matrix : ");
    scanf("%i",&N);
    printf("Y-Dimension der Matrix : ");
    scanf("%i",&M);
    
    //Vektoreingabe
    printf("\n***Vom Programm generierter Zufallsvektor im Bereich [0..9].\n");
    for(y=0; y<=N-1; y++) {
        Vektor[y] = rand()%10;
        printf("\n%d",Vektor[y]);    
    }
        printf("\n");
    
    //Matrixeingabe
    printf("\n***Vom Programm generierte Zufallsmatrix im Bereich [0..9].\n\n");
    for(x=0; x<=M-1; x++) {
       for(y=0; y<=N-1; y++){
          Matrix[x][y] = rand()%10;
          printf("%d  ",Matrix[x][y]);
          }
       printf("\n");    
    }
    
    for(d=0;d<=M-1;d++){
        for(w=0;w<=N-1;w++){
              A[w]=Matrix[d][w];
              //printf("\nVektor A hat im %i.ten Durchlauf den Wert %i",d,A[w]);
              } 
               mave(M,N,A,Vektor,0);
    
    }
    getch();
    }
    

    zuerst lese ich die dimensionen der matrix ein, daraus ergibt sich ja automatisch die zeilenzahl des vektors,
    matrix und vektor lasse ich dann automatisch erzeugen...so weit so gut.

    dann rufe ich die funktion mave so oft auf, wie zeilen in der matrix bestehen, und berechne dann die jeweilige matrixzeile mit dem vektor!

    jedoch, wie man sieht funktioniert es zwar, aber alles ohne pointer und diesem INDEX Makro!

    nach ich versuch's ersteinmal ohne eure hilfe!
    danke!



  • Shade Of Mine schrieb:

    AJ schrieb:

    #define ADDIERE(a, b) (a * b)

    👍 👍 👍

    🤡

    Wenigstens einer der aufpasst 😃



  • ich danke euch, ich habe es am wochendende endlich geschafft, aber noch immer ohne pointer! naja, ich hoffe der prof wird es auch so akzeptieren. 😞


Anmelden zum Antworten