Array-Doppelzeiger-Funktionsparameter?????



  • Hi zusammen,

    ich hab hier ne funktion die ich dringend für ein programm brauche:

    int eigen (..., REAL ** mat, ...);
    

    dem doppelzeiger möchte/muss ich nun eine n x n Matrix übergeben. Das hab ich dann auch mehr oder weniger kompliziert hingekriegt,

    REAL matrix[2][2] = {5, 0,
                         5, 5};
    
    double * ptr=matrix[0];
    double ** ptrptr = &ptr;
    

    indem ich dann einfach ptrptr übergebe, aber in der Funktion scheitere ich dann an dieser schleife

    for (i = 0; i < n; i++)
        if (mat[i] == NULL) return (1);          //PROBLEM !!!!!!!!!!!!!!!!!!!!!!!!
    

    ich komm bei den ganzen dimensionen und (de)referenzierungen nicht mehr ganz mit und wäre für sachliche hinweise recht dankbar.

    gruß christian



  • Ich benutze mehrdimensionale Arrays nicht so oft, aber müsste es nicht

    REAL matrix[2][2] = {
                            {5, 0},
                            {5, 5}
                         };
    
    double ** ptrptr = matrix;
    

    heißen?

    Wann genau kommt der Fehler, wie lautet er (möglicherweise ein Segfault?!) und was steht in n?


  • Mod

    ein pointer auf pointer hat nichts mit 2-dimensionalen matrizen zu tun - auch wenn der zugriff in beiden fällen mittels indexoperators dieselbe form hat.

    ein array
    int foo[4][2]
    degeneriert in einen pointer
    int (*p)[2]
    dieser pointer zeigt auf ein array und eben nicht auf einen weiteren pointer.



  • danke für die schnellen antworten.

    das mit

    double ** ptrptr = matrix;
    

    funktioniert nicht. hab ich auch schon ausprobiert, dann krieg ich nur den hier:

    cannot convert from 'double [9][9]' to 'double **
    

    der fehler ist nicht, dass windows das programm abricht, sondern die funktion aufgrund falsch übergebener parameter abbricht. und der abbruch geschieht genau hier

    for (i = 0; i < n; i++)
        if (mat[i] == NULL) return (1);          // <- return to main
    

    das n steht für die anzahl der Zeilen bzw. spalten (n x n matrix). hier werden wohl ein array mit zeigern auf die spalten/zeilen erwartet 😕, und ich hätte eigentlich auch gedacht, dass ich eben solche übergeben hätte. aufgrund des abbruchs ist dem aber wohl nicht so.

    es mag zwar sein, dass doppelzeiger nicht viel mit 2d-arrays zu tun haben. aber irgendwie muss doch ein sinnvoller und in diesem fall funktioniernder zusammenhang zwischen

    **mat und mat[][]
    

    herzustellen sein. der autor dieser funktion hats ja anscheinend auch irgendwie geschafft und wird sich sicher auch seine gedanken zu dieser art von übergabe gemacht haben.


  • Mod

    du benötigst eine zweite matrix, die die benötigten zeiger auf die spalten der 2dimensionalen matrix enthält. etwa

    REAL matrix[2][2] = {
                            {5, 0},
                            {5, 5}
                         };
    REAL* spalten[] = { &matrix[0], &matrix[1] };
    double ** ptrptr = spalten;
    


  • ja, das hört sich für mich auch ganz logisch an, aber ich krieg dann trotzdem wieder fehlermeldungen vom compiler.

    hab das problem jetzt so gelöst, das ich mit einer anderen bibliotheksfkt eine matrix in form eines doppelzeigers erzeuge und in diese dann per hand meine gegebene matrix kopiere, ohne irgendwelche doppelzeiger fktparameter.

    danke trotzdem für die schnelle hilfe


Anmelden zum Antworten