multidimensionale arrays übergeben



  • hallo!

    ich stehe vor folgendem problem: ich schreibe grade für die uni ein programm, dass matrizen verarbeiten soll, die ich in einem 2-dimensionalen array speichere. früher oder später kommt der punkt, an dem ich eine solche matrix geren an eine funktion übergeben würde. das scheint auch im prinzip kein problem zu sein, sofern zumindest eine dimension des arrays bekannt ist. ich würde nun allerdings gerne ein array übergeben, dessen grösse zum zeitpunkt des compilierens nicht bekannt ist, eine entsprechende eingabe jedoch vom benutzer erfolgt. ich habe diese frage zunächt meinem freund google gestellt und glaube, dass es möglich ist, eine übergabe durchzuführen, ohne die grösse des arrays vorher zu kennen, und dass der enstsprechende code in etwa so aussehen müsste:

    int piv(double **, int);
    
    int main(void)
    {
        double mat[dim][dim]={definition};
        int n=dim;
    
        piv(mat, n);
        return(0);
    }
    
    int piv(double **mat, int n)    
    {
        anweisungen
    }
    

    die anfangs in main verwendete wert dim muss vorher eigentlich von einer anderen funktion geholt werden, ich habe beim testen des codes hier selbstverständlich zahlenwerte eingesetzt.

    der obige code wird compiliert, ich bekomme jedoch eine warnung ausgegeben:

    in function 'main': 8 [Warning] passing arg 1 of `piv' from incompatible pointer type

    wenn ich versuche, das programm laufen zu lassen, so stürzt es ab. ich bin mir fast sicher, dass der fehler durch die (offenbar fehlerhafte) übergabe von mat verursacht wird. ich habe versucht, beim aufrufen der funktion das array mit **mat zu übergeben (hätte ja klappen können ^^), aber dann compiliert das programm erst gar nicht.

    kommen wir zu den fragen:

    -> ist der obige code, zumindest ansatzweise, korrekt?
    -> wenn nein, wie kann eine derartige übergabe durchgeführt werden?

    wie bereits erwähnt habe ich auf google bereit nach dem problem gesucht und einige artikel zum thema durchgelesen, ohne jedoch einen wirklich hilfreichen zu finden. enweder beschäftigen sich die artikel nur mit 1-D arrays, oder man wirft gleich wild mit pointern um sich, was ich hoffe vermeiden zu können. darum poste ich die frage hier.

    im voraus schon vielen dank für die antworten!

    DL

    P.S.: sollte die frage bereits gestellt worden sein, so möchte ich mich entschuldigen. die suchfunktion hat keine threads gefunden und im FAQ habe ich auch nichts gesehen, aber das heisst bei mir leider nicht unbedingt viel...



  • http://c-faq.com/aryptr/pass2dary.html

    PS: Ich liebe diese FAQ 👍



  • Dynamische Arrays funktionieren (leider) nur eindimensional so einfach. (int[] kann als int* übergeben werden, aber int[][] ist inkompatibel zu int**) Als Lösung müsstest du dein Array als Doppelzeiger anlegen und dynamisch belegen:

    double** mat = malloc(zeilen*sizeof(double*);
    for(i=0;i<zeilen;++i)
    {
      mat[i]=malloc(spalten*sizeof(double);
      for(j=0;j<spalten;++j) mat[i][j]=...;
    }
    

    Oder du verwendest eindimensionale Arrays und rechnest die Indizes dann selber um (aus mat[i][j] wird mat[i*spalten+j]).

    edit @TactX: Ja, man kann es sich auch einfach machen 😃



  • CStoll schrieb:

    edit @TactX: Ja, man kann es sich auch einfach machen 😃

    Nicht jeder ist so schreibwütig wie du 😉

    Im Ernst: Diese FAQ ist bei solchen Fragen einfach perfekt. Sie erklärt den Sachverhalt kurz aber vollständig und liefert zudem noch sinnvolle Links zu anderen Fragen/Antworten. Imho verweise ich (wir) sogar viel zu selten darauf.



  • ich habe das problem jetzt mit der malloc funktion und einem pointer-auf-pointer loesen koennen. vielen dank nochmals!


Anmelden zum Antworten