Vektorproblem



  • Nabend! 🙂

    Ich sitze zurzeit an einer Funktion, mit der ich den Differenzvektor zwischen zwei Vektoren bestimmen soll.

    Das ganze sieht jetzt so aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    double * differenz(double *x, double *y, unsigned int n){
    
        int i;
        double c[n];
    
        for (i=0; i<n; i++) {
            c[i]=y[i]-x[i];
        }
    
        return c;  /*Kann man das so machen?*/
    }
    
    int main ()
    {
        int n=4,i;
        double a[4]={2,3,4,5};
        double b[4]={1,4,6,7};
    
        /*Wie gebe ich den Vektor aus? (Differenz(a,b,n))*/
    
        return 0;
    
    }
    

    Ich bin mir jetzt nicht genau sicher, ob ich in der Funktion als return-Wert einfach die Array-Variable c einsetzen kann.
    Mein Hauptproblem ist jedoch, dass ich es nicht hinbekomme die einzelnen Vektorkomponenten des Differenzvektors auszugeben.

    Kann mir jemand sagen wie man das Problem geschickt behebt? 😃 Danke im Voraus!!


  • Mod

    Das kannst du so nicht machen (Genauer: Du kannst schon, aber es wird nicht funktionieren 🙂 ). Arrays können in C nicht einfach so durch Zuweisung kopiert werden. Gib der Funktion einen Ergebnisvektor, in den sie hinein schreiben kann. Weiterhin würde ich bei der Gelegenheit auch noch auf const-correctness achten, da der Unterschied hier besonders auffällt:

    void vektor_differenz(const double *lhs, const double *rhs, double *result, unsigned int n)
    {
        for (int i=0; i<n; i++) 
        {
            result[i]=lhs[i]-rhs[i];
        }
    }
    
    int main ()
    {
        double a[4]={2,3,4,5};
        double b[4]={1,4,6,7};
        double a_minus_b[4];
    
        vektor_differenz(a, b, a_minus_b, 4);
    }
    

    /*Wie gebe ich den Vektor aus? (Differenz(a,b,n))*/

    Sollte nun klar sein, oder?



  • OT

    SeppJ schrieb:

    void vektor_differenz(const double *lhs, const double *rhs, double *result, unsigned int n)
    

    Damit wirfst du Matlab-mex-Funktionenschreiber voll aus der Bahn 😃

    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, 
      const mxArray *prhs[])
    

    Ich dachte mir "warum macht der lhs const? 😕"

    🤡



  • Ja das Problem ist, dass die Funktion double * differenz(double *x, double *y, unsigned int n) vorgegeben ist und auch so ausgeführt werden muss.

    In deiner Version hast du für den Ergebnisvektor einen eigenen Array im Hauptprogramm erstellt und man kann dann durch Eingabe der jeweiligen Vektor-Komponente (1-4) die Differenz der Komponente ausgeben. Hab ich jetzt hoffentlich richtig verstanden.
    Bei meiner vorgegebenen Funktion wird das aber wohl leider etwas komplizierter sein. Korrigiere mich, wenn ich falsch liege aber für die Vorgabe-Funktion geht das nicht so wie von dir vorgeschlagen oder?

    Wenn ja, anderer Vorschlag?

    Mein "c" im return ist schonmal falsch. Aber der Array für den Differenzvektor muss dann wohl genauso erstellt werden, richtig?



  • Dann kommst du nicht drumherum über malloc() entsprechend Speicher zu reservieren. Sind zwei Zeilen extra.


  • Mod

    Ja das Problem ist, dass die Funktion double * differenz(double *x, double *y, unsigned int n) vorgegeben ist und auch so ausgeführt werden muss.

    Bäh! Wer gibt denn so etwas vor? Das verstößt doch gegen alle Grundregeln guten Designs. Meine Prognose: Schlechter Lehrer.



  • SeppJ schrieb:

    Bäh! Wer gibt denn so etwas vor? Das verstößt doch gegen alle Grundregeln guten Designs. Meine Prognose: Schlechter Lehrer.

    Kein Kommentar 😃

    Naja ich versuche es dann mal mit malloc() hinzubekommen. Danke Tim.



  • Ich habe schamlos gelogen. Es ist nochmal mindestens eine Zeile um dann in main() (zumindest in deinem Fall main) mittels free() den Speicher wieder freizugeben.



  • Zu meiner Verteidigung muss ich erwähnen, dass ich malloc() zum ersten Mal verwende 😃

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    double * differenz(double *x, double *y, unsigned int n){
    
        int i;
    
        double *c = (double*)malloc(n*sizeof(double));
        if (c != NULL) {
    
        for (i=0; i<n; i++) {
            c[i]=y[i]-x[i];
        }
    
      }
    
        return c;
    
    }
    
    int main ()
    {
        int n=4,i;
        double a[4]={2,3,4,5};
        double b[4]={1,4,6,7};
    
        /*Differenzvektor aufrufen*/
    
        free(c);  /*Hier wieder freigeben?*/     
    
        return 0;
    

    Ist die Funktion jetzt in dieser Form korrekt? Und die Freigabe des Speichers in main() auch?

    Ich habe immer noch Probleme auf den Differenzvektor zu zugreifen. Wäre dankbar für den letzten Schliff 🙂



  • Dir fehlt noch ein c in main.
    Ein Zeiger auf double muss es sein.

    c wird von der Funktion differenz zurück gegeben.
    So wie du auf a und b zugreifst (bzw. x und y) kannst du auch auf c zugreifen.



  • Für's "erste Mal" sieht das gut aus 😉

    Modrob.90 schrieb:

    double *c = (double*)malloc(n*sizeof(double));
    

    Da würde ich aber noch zwei Sachen ändern:

    a) cast weg
    b) sizeof nicht direkt auf Typen anwenden

    double *c = malloc(sizeof *c * n);
    


  • Um es kurz zu machen:

    int main () 
    { 
        int n=4, i; 
        double a[4]={2,3,4,5}; 
        double b[4]={1,4,6,7}; 
        double *c;  
    
        /*Differenzvektor aufrufen*/ 
        c = differenz(a, b, n);
        if(c == NULL) return -1;
    
    	/* Ergebnis */
        for (i=0; i<n; i++) { 
            printf("%lf ", c[i]); 
        } 
    
        free(c);  /*Hier wieder freigeben?*/     
    
        return 0;
    }
    

    In der Funktion differenz() kommt noch die Warnung:

    '<': Konflikt zwischen 'signed' und 'unsigned'

    was nicht sein müsste.

    @Tim: sizeof kommt ohne Klammern nicht klar.



  • Tim schrieb:

    Dann kommst du nicht drumherum über malloc() entsprechend Speicher zu reservieren. Sind zwei Zeilen extra.

    Mit allen Fehlerabfragen und am besten noch Fehlermeldungen und free deutlich mehr 😉



  • merano schrieb:

    @Tim: sizeof kommt ohne Klammern nicht klar.

    Deswegen schreibe ich es immer (wo es geht) ohne Klammern, da lernen die Leute noch was.


Anmelden zum Antworten