2D-Array(auf Heap) an Funktion übergeben?
-
Hallo zusammen ...
Ich glaub ich stell mich wieder mal ziemlich doof an

Es soll Array[X][Y], welches auf dem Heap liegt an deine Funktion übergeben werden.
void Funktion(int *Vektor)
Übergeben habe ich den Vektor dann einfach mitFunktion(Vektor);Aber anscheinend lässt sich das nicht wirklich 1:1 auf 2D-Arrays übertragen!
Schreibe ichvoid Funktion2(int **Matrix)und versuche über
Funktion2(Matrix);Bekomme ich die Fehlermeldung "error C2664: 'Funktion2': Konvertierung des Parameters 3 von 'int (*)[480]' in 'int ** ' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat."Was mach ich falsch?
-
Auch ein 2D-Array ist eigentlich nur ein 1D Array. Der Compiler übernimmt für dich die Umrechung. Wenn du aber eines an eine Funktion übergeben willst, und die Dimensionen nicht schon angibst, musst du sie auch von Hand übergeben.
Siehe hier für genaueres Vorgehen:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-212469-and-highlight-is-array+2+dimensionales.html
-
void func(int (*t)[5]) { } void func2(int x[2][5]) { } void func3(int x[][5]) { } ... int x[2][5]; func(x); func2(x); func3(x);
-
#include <iostream> template<typename T, std::size_t X, std::size_t Y> void foo(T(& array)[X][Y]) { // Testanzeige, ob alles klappt. std::cout << "X: " << X << "\tY: " << Y << std::endl; } int main() { int a[10][20]; foo(a); return 0; }So geht das :p
Oder jetzt nur mit
intund nicht beliebige Typen, dann mussfooso aussehen:template<std::size_t X, std::size_t Y> void foo(int(& array)[X][Y]) { // Testanzeige, ob alles klappt. std::cout << "X: " << X << "\tY: " << Y << std::endl; }Es wird hier im übrigen eine Referenz übergeben, also keine Kopie

Grüssli
PS: Falls Templates noch nicht bekannt sind, lieber auf die Alternativen ausweichen

-
Vielen Dank für euere Hilfe!
Ich werde die verschiedenen Methoden gleich mal durchprobieren.
Wobei ich sagen muss, dass Draveres Variante für mich ein wenig mysteriös aussieht
-
Dravere schrieb:
So geht das :p
Aber auch nur so lange, wie die Dimensionen zur Kompilierzeit bekannt sind.

Es wird hier im übrigen eine Referenz übergeben, also keine Kopie
Das wird ein Array immer. Oder war das nur eine Klarstellung?
-
drakon schrieb:
Aber auch nur so lange, wie die Dimensionen zur Kompilierzeit bekannt sind.

Jap, und er hat was von Heap gesagt, also geht es wohl nicht

Meine Gedanken sind in den Ferien oder ich habe mich von this->that Beispiel ablenken lassen...drakon schrieb:
Das wird ein Array immer. Oder war das nur eine Klarstellung?
Klarstellung.
Wie Mandel gesagt hat, ist die Sache etwas mysteriös, da sollte man das schon nochmals klarstellen
Grüssli
-
Man kann sich auch eine Klasse basteln. Wenn die Dimensionen nicht immer gleich sind, halt ein Template. Da geht das Kopieren und Referenz-Übergeben etwas einfacher.

Oder man benutzt gleich Container.
-
Ok... Also Klassen kenne ich, aber bei Templates sagen mir (noch) nichts. Und auch Container ist nen neues Wort für mich in dem Zusammenhang

Aber ich bin ja auch noch recht neu bei C++
-
Container sind fertige Klassen (also genauer gesagt Klassentemplates), die einem ermöglichen, mehrere Elemente gleichen Typs komfortabel zu speichern und zu verwalten. Das populärste Beispiel für Container ist die STL der C++-Standardbibliothek.
Wenn du mal Zeit hast, lohnt es sich auf jeden Fall, sich damit auseinanderzusetzen. Als Einstieg könntest du beispielsweise die Artikel dieses Forums anschauen.
-
Mandel schrieb:
Ok... Also Klassen kenne ich, aber bei Templates sagen mir (noch) nichts. Und auch Container ist nen neues Wort für mich in dem Zusammenhang

Aber ich bin ja auch noch recht neu bei C++
Nur als kleinen Vorgriff: std::vector und std::tr1::array wären mögliche Kandidaten (Gibt aber noch einige mehr die je nach Fall besser geeignet sein können). Ersteres bei dynamischer Größe, letzteres (falls dein Compiler den TR1 bereits unterstützt) für fixe Größe.
cu André