pointer 2 dimensionales array
-
Du hast in der Deklaration den Namen des Parameters ("row") bereits drin. In der Implementierung dann zweimal, das muss krachen.
-
hallo ja sorry hab vorherigen post editiert, verzweifle echt langsam...
was is dann jez der typ fuer die funktion?
wenn ich es mitvoid identity(int *[10]);ueber main definiere klappt es, ist das richtig? kann ich das sagen dass es ein array mit 10 plaetzen fuer int zeiger ist?
-
ALLES NEU

habe es jetzt geschafft

void identity(int (*)[10]); //muss ich das so definieren? geht mir nicht ganz ein, wie wird das gelesen? array von 10 elementen welche pointer auf ints sind? int main() { int square[10][10]; int (*row)[10] = square; //show the addresses of each row for(int i = 0; i < 10; ++i) cout << *(row+i) << endl; //distance is exactly 28hex (40dec) //which is 10times a int per row identity(row); cout << endl; return 0; } void identity(int (*tst)[10]) //es war das prob dass ich die klammern rund um den pointer vergessen habe, warum brauche ich die klammern? also auch hier wieder die frage wie es interpretiert wird. ??? { cout << "in identity\n" << *tst; }
-
zusatz, habe jetz auf verschiedenste arten versucht das array zu initialisieren - klaglos gescheitert

also falls jemand hier neu liest, es geht um obigen code, hier moechte ich in der funktion das array initialisieren, verwendet werden duerfen nur pointer (definiert in zwei vorschleifen)mein idee:
for(int *x = *row; x != *(row+9); x += sizeof(int)*10)ich mache einen int pointer (fuer zeile) welchen ich so lange um 10 ints inkrementiere (10 da jede zeile 10 ints hat) und das ganze so lang bis der pointer die adresse des letzen array elemntes bekommt.
nur funktioniert es nich
will das endlich verstehen...
-
Was soll deine Funktion jetzt genau machen? Das ist mir in diesem Thread nicht ganz klar geworden...
Falls es nur darum geht, ein 2D-Array mit Nullen zu füllen, kannst du Folgendes tun. Ich würde es zuerst mal mit
operator[]versuchen, das ist einleuchtender. Wenn du das wirklich verstanden hast, kannst du immer noch direkte Zeigerarithmetik verwenden.// (1): statisches Array mit Initialisierungsliste int Array[w][h] = {}; // (2): statisches Array mit For-Schleife int Array[w][h]; for (unsigned int x = 0; x < w; ++x) { for (unsigned int y = 0; y < h; ++y) { Array[x][y] = 0; } } // (3): dynamisches Array int** Array = new int*[w]; for (unsigned int x = 0; x < w; ++x) { Array[x] = new int[h]; for (unsigned int y = 0; y < h; ++y) { Array[x][y] = 0; } } // beim dynamischen Array wieder in umgekehrter Reihenfolge delete[] anwenden.
-
hallo nexus, danke fuer die antwort!
das ist mir alles klar, ich habe das problem mit den pointern..
nohcmals genaue aufgabnestllung:arry der groeße [10][10] diese wird in main definiert, in main wird ein pointer gemacht der auf die diversen zeilen zeigt. also p[0] = adresse erste zeiel ... p[9] = adresse letzt zeile
dieser pointer wird an ne funktion uebergeben. diese fuellt das array mit lauter nullen, außer in der diagonale, da sind es einsen! [0][0],[1][1] usw....
dazu folgende bestimmungen:
2 for schleifen
eine zuweisungszeile
in der fkt darf nur der parameter + 2 pointer der for schleifen verwendet werden.hoert sich nicht so schwer an, ist es aber ^^
-
Sowas?
void identity(int *p){ for(int y = 0; y < 10; y++) for(int x = 0; x < 10; x++) p[y*10+x] = x == y; }
-
nein noch ein mal, es duerfen nur pointer verwendet werden!
und das array wir in main initialisiert mitterls:int square[10][10];und uebergeben wird ein array von pointern (oder weiß jemand eine besser idee, zb nur einen pointer uebergeben?)
danke...
-
AbsoluterBeginner schrieb:
nein noch ein mal, es duerfen nur pointer verwendet werden!
Ich denke, du meinst nicht Zeiger selber, sondern Zeigerarithmetik. Zudem ist
Array[i]äquivalent mit*(Array+i), aber du darfst natürlich gerne den komplizierteren Weg einschlagen. Wenn du wirklich der Ansicht bist, man dürfe denoperator[]nicht verwenden (was eine ziemlich blöde Aufgabenstellung wäre), würde ich ihn trotzdem zuerst benutzen und anschliessend seine Vorkommen nach obiger Regel durchoperator*undoperator+ersetzen.AbsoluterBeginner schrieb:
und uebergeben wird ein array von pointern (oder weiß jemand eine besser idee, zb nur einen pointer uebergeben?)
Arrays können nicht übergeben werden, es sind immer nur Zeiger.
-
Sowas?
void identity(int *p){ for(int *y = p; y-p < 100; y++) *y = !((y-p)%11); }entweder mit identity(&square[0][0]) aufrufen oder entsprechend anpassen.
-
als hinweis ist gestanden an soll pointer aritmetik veerwenden (nicht nur um zu prüfen ob ein element in der diagonalen ist)
was meinst du denn damit?@fellhuhn, danke, aber ich habe es nicht geschafft das 2dim array mit einem pointer zu uebergeben, aber ich denke auch ich soll ein 1dim array mit den adressen der zeilen uebergeben...
aber dien code sieht schon mal gut aus (da eben pointer verwendet werden)
aber ich glaube du hast es schon zu kompakt gemacht
ich verstehe die zuweisung nicht ganz, waere es nicht auch einfacher mit 2 forschleifen?
so sollte ich es naemlich loesen...danke euch!!
-
Also, ganz ehrlich, wenn gefordert ist, dass eine zweidimensionale Matrix übergeben werden soll, dann würde ich das auch ganz stumpf so machen. Ich würde das dann irgendwie so machen (nicht getestet):
const size_t dim = 10; typedef int ElementType; typedef ElementType MatrixType[dim][dim]; void identity(MatrixType mat) { for(ElementType (*row)[dim] = mat; row != (mat + dim); ++row) { for(ElementType *col = *row; col != (*row + dim); ++col) { if(row - mat == col - *row) { *col = 1; } else { *col = 0; } } } } //Test: MatrixType matrix; identity(matrix); //vielleicht noch ausgeben
-
Hier habe ich das mal ein wenig näher beschrieben, was du für möglichkeiten hast:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-212469-and-highlight-is-array+2+dimensionales.html
-
hallo, nochmals vielen dank an alle, heute war abgabe und ich habe es nicht geschafft, was solls

will das problem aber trotzdem verstehen und habe mit hierzu ein weiteres programm gebastelt.
da es aber nichts mit diesem thread zu tun hat habe ich einen neun aufgemacht, wenn wer lust hat zu helfen keine scheu
hier der link: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1607316.html#1607316
danke euch!