Hallo zusammen,
da ich im Moment zwischen dem vielen Essen und trinken ein wenig Zeit habe, mich mit meiner Schaltung und meinem Code auseinander zu setzen.
Kommen mir ein paar Fragen auf, die ich gerne verstehen würde.
Folgender Code verstehe ich, aber die nachfolgende Meldung des Compilers verstehe ich nicht... seht selbst.
Aktueller Code worum es geht:
Meine 1. Frage, warum wird eine Warnung für diesen Pointer ausgegeben?Code:unsigned char special[8][8] = { { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' }, { 'I', 'J' ,'K' ,'L', 'M', 'N', 'O', 'P' }, { 'Q', 'R' ,'S' ,'T', 'U' ,'V', 'W', 'X' }, { 'Y', 'Z' ,'a' ,'b', 'c' ,'d', 'e', 'f' }, { 'g', 'h' ,'i' ,'j', 'k' ,'l', 'm', 'o' }, { 'p', 'q' ,'r' ,'s', 't' ,'u', 'v', 'w' }, { 'x', 'y' ,'z' ,'1', '2' ,'3', '4', '5' }, { '6', '7' ,'8' ,'9', '0' ,'*', '+', '-' } }; // define a pointer for Array unsigned char* special_ref; void specialcarachter (unsigned char* character) { unsigned char memoryplace[8] = { '0','1','2','3','4', '5', '6', '7' }; int i = 0, j=0; for (j=0; j<=7;j++) { printf ("This is the place: %c \n", memoryplace[j]); for (i=0; i<=7;i++) { // why does this is a correct ??? printf ("This is a test === %c \n", character[j*8+i]); // ok, i walk through the memory with eight steps, because one of these character J, are eight characters long: // character[0*8+0] == 'A' // character[1*8+1] == 'B' // character[2*8+2] == 'C' // why does this is incorrect, it is easier, but wrong??? //printf ("This is a test === %c \n", character[j][i]); } } } int main (void) { special_ref = special; specialcarachter(special_ref); return 1; }
special_ref = special;
Meine 2. Frage, macht es einen Unterschied, ob ich ein Array an die Funktion übergebeCode:warning: assignment from incompatible pointer type [enabled by default] special_ref = special;
oderCode:void specialcarachter (unsigned char character[8][8])
einen Pointer auf ein Array? Mir geht es hierbei darum, weil die Aussage in "allen" C-Büchern besteht, dass Arrays vom Compiler als Pointer auf ein Array gesehen wird.Code:void specialcarachter (unsigned char* character)
Für mich ist die 1. Schreibweise wesentlich "leichter" zu interpretieren. Wenn ich aber mit der Pointer Schreibweise, aufgrund der nicht durchzuführenden Kopie des Arrays, da es ja eine Call by reference Durchführung ist, Speicherplatz im RAM spare ist mir die 2. Schreibweise lieber!
Und die 3. Frage, wahrscheinlich schon im Text erkannt, warum kann ich in der Funktion mit den übergebenen Pointern, dass Array nicht über die Ebenen ansprechen und warum muss ich hier über die Speicherstellen gehen?
Vielen Dank für die Erläuterungen und Erklärungen.Code:// why does this is incorrect, it is easier, but wrong??? printf ("this is a test === %c \n", character[j][i]); printf ("This is a test === %c \n", character[j*8+i]); // ok, i walk through the memory with eight steps, because one of these character J, are eight characters long: // character[0*8+0] == 'A' // character[1*8+1] == 'B' // character[2*8+2] == 'C'
Und einen wirklich schönen Feiertag!
Lesezeichen