Mehrdimensionale Arrays an Zeiger übergeben???
-
@Shade Of Mine
thx
Allerdings weiß ich immer noch nicht wie ich Pointern Mehrdimensionale Arrays zuweisen kann, hab schon in der MSDN und in einem Referenz-Buch geschaut. -> Fehlanzeige
-
Guter Witz
Du machst es in deinem Beispiel richtig
ob du
short test[3];
oder
short test1[3][5];
schreibstDeine Zuweisung bekommst du mit
short *ptest=test;
short *ptest1=test1;Noch Fragen.
-
Aber das so wie du schreibst mach
#include <iostream> using namespace std; #define for if(false);else for int main() { short test[3][3]; short *ptest = 0; for(int i = 0; i == 3; i++) for(int j = 0; i == 3; j++) test[i][j] = j; ptest = test; cout << ptest[0][1]; return 0; }
Bekomme ich nur drei Kompilerfehler:
C:\Wissen\VC++\My Projects\test\test.cpp(13) : error C2440: '=' : 'short [3][3]' kann nicht in 'short *' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
C:\Wissen\VC++\My Projects\test\test.cpp(15) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp
-
Hier die Änderugen damits läuft.
Schau die bitte deine for Schleifen Konstruktion an, sie tut glaube ich nicht das was sie sollte, ich habe sie deswegen geändert.#include <iostream> using namespace std; #define for if(false);else for int main() { short test[3][3]; short *ptest = 0; for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) test[i][j] = j+i*3; ptest = &test[0][0]; cout << "i" << " " << "j" << " " << "Value" <<"\n" ; for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) cout << i << " " << j << " " << *(ptest+i*3+j) <<"\n" ; return 0; }
:p Für folgende zwei Zeilen such ich unter C++ noch bessere Formulierungen. :p
ptest = &test[0][0]; *(ptest+i*3+j)
-
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