Mehrdimensionale Arrays an Zeiger übergeben???
-
kurze verständnisfrage: ein Array repräsentiert meines wissens nach doch einen Zeiger auf das erste element. Warum also noch "&" vor das array?
-
ptest = &test[0][0];
test zeigt auf das erste seiner Elemente, das ist korrekt, aber es wird doch nicht von test die Adresse ermittelt sondern von dem ersten short (test[0][0]).
Man könnte also auchptest = &(test[0][0]);
schreiben.
-
Danke das du meine Frage wiederholst.
Für folgende zwei Zeilen suche ich unter C++ noch bessere Formulierungen.ptest = &test[0][0]; *(ptest+i*3+j) und nicht *(ptest[i][j])
Jetzt meine blöde Antwort: Anderfalls compilerts und funktionierts nicht
Blöde Antwort deshalb weil ich keine Erklärung habe.
@Dennis danke für die Antwort, hast du für das zweite auch noch was
-
Warum macht ihr nicht einfach so was in der Art?
template<typename T> T** alloc2d(unsigned cx, unsigned cy) { T** ppt = new T*[cx]; for(unsigned i = 0; i < cy; ++i) ppt[i] = new short[cy]; return ppt; } int main() { short** pps = alloc2d<short>(10, 10); pps[9][9] = 10; return 0; }
-
Für
short test[5][3]; short* ptest = &test[0][0]; *(ptest+i*3+j)
müsste man auch das hier schreiben können:
short test[5][3]; short *ptest = reinterpret_cast<short*>(test); // hier wird ein mehrdimensionales Array zu einem Pointer gecastet. ptest[i*5+j];// oder: (i*5+j)[ptest];
Zumindest funzte der Code mal bei mir (auch wenn er nich hübsch is).
-
@MaSTaH Danke für die C++ Lösung
Das war mein erster Beitrag zu diesem Thema:
In C übergebe ich den Pointer auf das erste Element sprich [0][0]..[0],
den Rest kann ich mir in der Funktion berechnen, Notfalls mus ich die einzelnen Dimensionen übergeben.Vielleicht gibt es in C++ dafür einen moderneren Weg
Habe auf grund meines Wissens nur eine sinnvolle C lösung anbieten können und gehoft das ein C++ Beispiel auch noch kommen würde.
-
Interessant wäre hier eine Lösung mit getrennten Dimensionen, so das ich die Position im Vektor nicht selber ausrechenen muss
-
Wenn man die multidimensionalen Arrays als einfachen Array behandeln will, muss man schon selbst rechnen lassen.
-
Was ich als Anmerkung bei meinem Vorschlag vegessen habe: Der Speicher ist dann AFAIK nicht zwangsläufig an einem Stück.
-
Was man teilweise als Nachteil sehen muss, wenn man so ein feld effektiv und schnell über pointer mathematisch bearbeiten will
-
Ok, ich muss mich wol damit abfinden es selbst immer zu errechnen. Aber wieso ist das so, muss doch einen Grund geben oder
-
Guck doch mal in die FAQ. Da steht soweit ich weiß auch ein laaanger Artikel von Dimah zu dem Thema drin
.
-
@ MaSTaH Danke, jetzt ist mir einiges klarer geworden, trotzdem finde ich die erklährung wieso:
[quote]Den Zeiger auf ein zweidimensionales Array zeigen lassen.
Wichtig: Die zweite Dimension muss mit der Array-Größe
übereinstimmen, mit der der Zeiger deklariert wurde
pArr = new int [5][2]; wäre z.B. illegal, da ein Zeiger auf ein
Array mit 5 Elementen nicht in einen Zeiger auf ein Array mit
2 Elementen konvertiert werden kann.
[quote]
nicht gerade die beste, da eien Array ja auch nur ein pointer auf den ersten Wert ist und somit auch illegal wäre (bleibt wohl für immer ein Mysterium