int[4][4] kann nicht in int** umgewandelt werden?



  • Hallo,
    ich habe folgendes Problem:
    ich habe eine Funktion
    bool TestMagicQuad(int** quad,int size)
    Die sollte überprüfen ob sich in einem Array ein magisches Quadrat befindet.
    Allerdings scheint mein Compiler irgendwie folgendes nicht zu schlucken:

    int quad[4][4]={ //ein magisches Quadrat
        {16, 2, 3,13},
        { 5,11,10, 8},
        { 9, 7, 6,12},
        { 4,14,15, 1}
    };
    
    is_magic_quad=TestMagicQuad(quad,4);
    

    Dann heißts int*[4] konnte nicht in int** konvertiert werden
    Na toll, wie soll ich dann meine Funktion deklarieren.



  • liegt daran, dass ein int[4][4] auch nur ein int* ist.
    du koenntest statt "int**" eher "int[][4]" schreiben.



  • einen stern wegmachen 😃

    bool TestMagicQuad(int* quad,int size)
    

    Obwohl das Teil 2D ist, bleibt quad vom typ int *.
    Am Zugriff in der Funktion ändert das nix und auf die Größe musst ja sowieso aufpassen.

    grüße



  • Also,

    bool TestMagicQuad(int quad[][4],int size)
    

    geht, der Rest nicht 😞
    ist natürlich dumm, weil ich eigentlich das für verschiedene magische Quadrate machen wollte, und nicht nur für ein 4x4 Quadrat.
    Hat jemand ne Idee?

    int* geht natürlich nicht, oder was würdest du dann mit
    quad[0][0] machen 😉



  • oops - das war wohl zu schnell gedacht ...
    Allerdings glaub ich noch immer bzw. jetzt erst recht, dass das mit dem int * nicht so schlecht wär.
    Müsstest halt deine Definition ändern ...

    int quad[4*4]={ //ein magisches Quadrat 
        16, 2, 3,13, 
         5,11,10, 8,
         9, 7, 6,12, 
         4,14,15, 1 
    };
    

    ... und die Indexrechnung in der Funktion selber machen - also

    bool TestMagicQuad(int *quad, int size) {
       ...
       /* statt quad[2][3] -> */ quad[2 * size + 3];
       ...
    }
    


  • Ok, hab eine Lösung gefunden unter dem Motto "Wieso einfach, wenns kompliziert geht" ;):

    Deklaration:

    bool TestMagicQuad(int* quad,int size)
    

    So und wenn man jetzt seinen Kopf lange genug gegen die Wand haut,fällt einem vielleicht wieder ein, wie 2D-Arrays im Speicher abgelegt sind:

    4x4 Array:
    |1/2/3/4|5/6/7/8|9/10/11/12|13/14/15/16|
    ja, alle in einer Reihe. Das heißt, 16 befindet sich um +15sizeof(int) Bytes nach 1.
    Also kann ich aus dem Zweidemensionalen Array tatsächlich ein eindemensionales machen:
    quad[2][2] wird in meiner Funktion zu 1D_quad[2
    size+2]
    Muss man auch erst mal draufkommen...
    Damit ist auch erklärt, warum der Compiler int[][] nicht in int** umwandeln kann:
    bei int[][] ist int[3] gleich der Adresse von 4
    bei int** wäre int[3] gleich der Adresse vom Zeiger auf ein int[4] dessen erstes Element 13 ist

    So schön können Zeiger sein 😃

    PS: geht natürlich mit quad[4][4]=...
    Trotzdem Danke


Anmelden zum Antworten