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[2size+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 istSo schön können Zeiger sein
PS: geht natürlich mit quad[4][4]=...
Trotzdem Danke