Matrix, Pointer und Funktion



  • hallo,
    ich habe gerade ein problem, dass ich so alleine nicht lösen kann. Es gibt schon ähnliche Fragen in diesem Forum aber die helfen mir alle nicht weiter.

    Und zwar habe ich eine Datenstructur die so aussieht:
    //*********************************
    typedef struct
    {
    char N[100];
    double M;
    }
    Prp;
    //
    ********************************
    Dazu habe ich diese Funktion:
    //*********************************
    int Mat_con(Prp *M1,Prp *M2);

    Jetzt kann ich in der Structur nichts mit dem *M anfangen. Es handelt sich hier um einen Pointer auf eine Matrix. Ich habe schon alles ausprobiert, nur wohl nicht das richtige.... Und da ich glaub das das eigenltich net schwer ist wollte ich mal fragen wie man das hinbekommt.
    Ich möchte einfach nur 2 Structuren definieren z.B. Prp Data1, Data2;
    und in dieser N und *M füllen. Wobei *M wie gesagt ein Zeiger auf eine Matrix ist. Und dann möchte ich die Funktion aufrufen......

    Die Funktion rufe ich dann so auf habe ich mir gedacht:
    Mat_con(& Data1,& Data2);
    Wäre das richtig?

    Vielen Dank schon mal
    Cascoin



  • was genau hast du denn ausprobiert?

    folgendes funktioniert bei mir

    //Hilfsvariable
    double *a = new double[10];
    for (int i=0; i<10; i++) a[i] = 0.0+(i*5.5);
    
    //Struct füllen
    Prp Data1;
    Data1.M = a;
    
    //Testausgabe in Memo
    for (int i=0; i<10; i++)
      Memo1->Lines->Add("a"+IntToStr(i)+": "+FloatToStr(Data1.M[i]));
    


  • ich wollte das so machen:

    double A[3][3];
    A[0][0]=1
    A[0][1]=1;
    A[0][2]=1;
    A[1][0]=1;
    A[1][1]=1;
    A[1][2]=1;
    A[2][0]=1;
    A[2][1]=1;
    A[2][2]=1;

    Data1.M = A //Hab ich jetzt probiert.....geht aber nicht
    Data1.M = *A //geht auch nicht....ich hab einfach alle möglichkeiten
    //planlos ausprobiert

    was du jetzt vorschlägst geht halt leider nicht mit einer mehrdimensionalen Matrix. Und das brauche ich unbedingt...
    Gibts da ne Möglichkeit?
    Bzw. ist dein Vorschlag ja auch das dynamisch zu machen...dann müßte ich den Speicherbereich danach wieder freigeben oder?
    Wäre super wenn da nochmal jemand helfen könnte oder eine alternative hätte.
    Vielen dank schonmal für die bisherige hilfe.....
    Cascoin



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Also ich würde empfehlen nicht Arrays zu benutzen, weil die, wie du schon gemerkt hast nicht das zu sein scheinen, was du denkst. Arrays haben keine Kopiersemantik. Darum würde ich dir empfehlen dich mal mit der Standardbibliothek vertraut zu machen. Siehe z.B:

    std::vector

    Das ist am ehesten das, was du suchst.

    Von denen kannst du auch ganz einfach mehrdimensionale Konstrukte bilden.



  • 😃



  • hoi,
    Danke erstmals für die Antwort aber das hilft mir irgendwie nicht so richtig weiter weil ich jetzt wieder nicht weiß wie ich so ein Vector IN MEINE STRUCTUR (siehe oben) bekomme. Kann da jemand aushelfen bzw. erklären wie man das mit einem mehrdimensionalen Array hinbekommt?

    ich erzeuge also einen Vektor beispielsweise :

    vector< vector<int> > M1; //genau dieses M1 möchte ich mit meiner Structur
    //verknüpfen über einen Pointer.

    Oder (und das ist jetzt auf den 2 Beitrag von "Linnea" bezogen) wie bekomme ich einen dynamischen mehrdimensionalen Array in meine Struktur?

    danke schonmal

    mfg cascoin 🙄


  • Mod

    Irgendwie verstehe ich nicht ganz, wo dein Problem ist, du machst es doch anscheinend schon richtig:

    vector< vector<int> > M1;         // dynamisches mehrdimensionales "Array"
    vector< vector<int> > *M2;        // Zeiger auf dynamisches mehrdimensionales "Array"
    
    struct foo{
     vector< vector<int> > M3;        // dynamisches mehrdimensionales "Array" in struct
     int andere_daten;
    };
    
    struct bar{
     vector< vector<int> > *M4;       // Zeiger auf dynamisches mehrdimensionales "Array" in struct
     int andere_daten;
    };
    

    Wobei der Begriff Array hier bewusst in Gänsefüßchen steht, da ein vector eigentlich etwas anderes ist.



  • Hallo,
    danke soweit.....aber das bringt meine funktion nicht zum laufen...... 😡

    ich probiers nochmal zu erklären weils vielleicht net ganz klar ist:
    //*************************************************************
    Dies Funktion möchte/muss ich zum laufen bekommen:

    int Mat_con(Prp *M1,Prp *M2);

    Die Struktur Prp sieht folgendermaßen aus:
    //*************************************************************
    typedef struct
    {
    char N[100];
    double *M; //M ist eine n*m dimensionale Matrix-> 1,2,3 oder n-dimensional
    }
    Prp;
    //*************************************************************
    Ich habe ehrlich gesagt KEINE AHNUNG wie ich diese Structur Prp füllen soll.
    Wie bekommen ich meine Matrix (also mathematisch gesehen eine Matrix) nach *M (oder besser gesagt wie pointe ich von *M auf eine Matrix. Wie auch immer ich muss sie nur mit Werten "füllen". Und das bekomme ich NICHT hin. Ich würd nicht fragen wenn ich es vermeiden könnte aber das ist momentan echt wichtig für mich und ich komme ohne das nicht weiter.
    Danke für jede Hilfe

    Cascoin



  • Hallo Jungs,
    hab ganz vergessen zu sagen das ich es mit Vektoren nicht machen kann, weil ich meine Datenstruktur nicht verändern möchte. Liegt daran das auf dieser Datenstruktur jede Menge Funktionen aufbaut...... Aber generell wollte ich mal fragen ob es Performanceunterschiede gibt wenn ich statt mit Arrays mit Vectoren arbeite????

    Wenn ich also meine Datenstruktur gefüllt habe, was ich immer noch nicht weiß wie das gehen soll (HILFE!!! s. beitrag oben) kann ich dann die Funktion so aufrufen?

    Mat_con(&Data1,&Data2); //Geht das?????

    Falls irgendjemand nen Rat hat bitte melden.... 👍
    Aber was noch wichtiger wäre, wie bekomm ich meine struktur gefüllt???????????

    typedef struct
    {
    char N[100];
    double M; //hier muss eine beliebig dimensionale matrix rein!!!!!
    }
    Prp;
    //
    **************************************************************
    z.B. so:

    A[0][0]=1; //füllen 2dim. "matrix" mit werten
    A[0][1]=1;
    A[0][2]=1;
    A[1][0]=1;
    A[1][1]=1;
    A[1][2]=1;
    A[2][0]=1;
    A[2][1]=1;
    A[2][2]=1;

    Diese matrix muss mit der Structur verbunden werden.....
    Eine neue überlegung von mir war es so zu machen:

    Data.M = &A[0][0] ; //geht aber auch nicht....

    ich kenn mich mit pointern und "&" und "*" nicht aus....

    Dank euch schonmal

    mfg cascoin



  • casicas13 schrieb:

    Aber generell wollte ich mal fragen ob es Performanceunterschiede gibt wenn ich statt mit Arrays mit Vectoren arbeite????

    Wenn du mit dynamischen Arrays ( new und delete arbeitest), kaum. Du programmierst die Funktionalität des std::vector nach, nur fehleranfälliger und weniger komfortabel, weil du dich mit manueller Speicherverwaltung rumschlagen musst.

    casicas13 schrieb:

    hab ganz vergessen zu sagen das ich es mit Vektoren nicht machen kann, weil ich meine Datenstruktur nicht verändern möchte. Liegt daran das auf dieser Datenstruktur jede Menge Funktionen aufbaut......

    Wäre das Design durchdacht, könntest du die Implementierung ändern, ohne die Schnittstelle anzurühren. In Zukunft solltest du etwas mehr auf Datenkapselung achten, um genau solche Flexibilität zu ermöglichen. Aber vielleicht hast du Glück und kannst trotzdem std::vector verwenden, dank überladenem operator[] bleibt die Syntax die gleiche wie bei Zeigern auf dynamische Arrays.

    Du solltest zuerst eine Instanz deiner Struktur erstellen, und danach dein M verwenden.

    Prp MeinPrp;
    MeinPrp.M = new double[AnzahlElemente];
    // verwende MeinPrp.M
    delete[] MeinPrp.M;
    

    Da du zur Kompilierzeit nicht weisst, ob du eine, zwei oder drei Dimensionen brauchst und scheinbar kein modernes C++ nutzen willst/kannst, musst du leider auf die Syntax A[x][y] verzichten. Stattdessen brauchst du dir den Index bei mehreren Dimensionen selbst auszurechnen (du kannst dir dafür auch Funktionen schreiben, was ich empfehle):

    A[y*h + x] = 1; // wobei h die Höhe des 2D-Arrays ist.
    

Log in to reply