PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ 2-dimensionales array an funktion übergeben


(del)
2007-12-11, 16:58:29
hi,
ich bin gerade am programmieren und komme einfach nicht weiter...

Es geht darum, in C++ ein zweidimensionales array an eine funktion zu übergeben.

Hier mal der quellltext:

#include<iostream>
#include<math.h>
#include <stdarg.h>

using namespace std;

void gauss(int** matrix){
}

int main(){
int test[3][2];
gauss(test);
}

Der Compiler meckert:
g++ -o aufgabe1 aufgabe1.cpp
aufgabe1.cpp: In function »int main()«:
aufgabe1.cpp:12: Fehler: »int (*)[2]« kann nicht nach »int**« für Argument »1« nach »void gauss(int**)« umgewandelt werden


Ich verstehe es nicht. Ich habe auch ehrlich gesagt keine große Ahnung was die Sternchen bedeuten sollen, habe im Netz diesen Syntax in einem Tutorial gefunden, aber es läuft nicht. ich möchte die Funktion gauss auch nicht mit gauss(int matrix[][spaltenbreite]) deklarieren, da sie Matrizen unterschiedlicher größe behandeln können soll.

Bei einem eindimensionalen array test[] funktioniert es wunderbar mit gauss(int *matrix).

Danke schonmal
mfg
bazooka

Superguppy
2007-12-11, 18:38:06
Probier mal das aus:
void gauss(int* matrix[])

Achja, die Sternchen sind übrigens Pointer - da solltest du dich früher oder später mal einlesen!

malte.c
2007-12-11, 19:15:13
hi,
Es geht darum, in C++ ein zweidimensionales array an eine funktion zu übergeben.
[...]
int test[3][2];


Probier's mit std::vector statt c-Arrays, das kommt ohne die Sternchen aus :)


void gauss(std::vector<std::vector<int> > array)
{}

int main()
{
std::vector<std::vector<int> > array;
gauss(array);
}

Xmas
2007-12-11, 21:09:10
ich möchte die Funktion gauss auch nicht mit gauss(int matrix[][spaltenbreite]) deklarieren, da sie Matrizen unterschiedlicher größe behandeln können soll.
Du kannst einen Pointer auf das erste Element sowie die Spaltenbreite als separaten Parameter übergeben und die matrix dann mit pointer[x * spaltenbreite + y] statt matrix[x][y] ansprechen.

Gast
2007-12-11, 21:37:24
Mal eine kurze Zwischenfrage, ist int matrix[3][2] für den Compiler nicht sowieso dasselbe wie int matrix[6]
Oder hab ich da was falsch in Erinnerung?

Superguppy
2007-12-11, 22:05:38
Ist im Prinzip das selbe - der Speicher ist ja eindimensional verwaltet - mehrdimensionale Arrays werden dann auch so abgebildet.

(del)
2007-12-12, 08:15:56
vielen Dank an euch für die Tips. Habe bis jetzt nur mit Java und PHP zu tun gehabt... da ist das mit arrays etwas "komfortabler".
Ich habe es jetzt so ähnlich gelöst wie Xmas mir geraten hat. habe mir einfach ein "array" selbst gembaut mit
double* matrix;
matrix=alloc(anzahl_spalten*anzahl_zeilen*sizeof(double));
und dann direkt mit dem pointer gearbeitet. ist eigentlich komfortabler als ich dachte...

zu Superpuppys erstem Post:
funktioniert das nur mit arrays dimension kleiner gleich 2? Bei 3D arrays hätte ich ja dann wieder das Problem, dass ich gauss(int** matrix[]) schreiben müsste, bzw (int* matrix[][]).

amida maru
2007-12-12, 13:39:28
du kannst das auch in 2d umwandeln.... ich habe das jetzt nur für ein rpg beispiel so ungefähr:

also die map ist 1dimensional
char map[width * height];

sagen wir mal du wiillst mit koordinaten auf die map zugreifen

int Map::GetTileAt(int TileX, int TileY)
{
int pos = TileX + TileY * w; // hier wird einfach das zweidimensionale in eindimensional umgewandelt
if(pos >= 0 && pos < size) // size ist gleich width * height also mapbreite mal maphöhe...
return map[pos];
}

ich hoffe das hat dir geholfen^^

MfG
Timaru

rotalever
2007-12-12, 18:27:47
du kannst das auch in 2d umwandeln.... ich habe das jetzt nur für ein rpg beispiel so ungefähr:
also die map ist 1dimensional
char map[width * height];
sagen wir mal du wiillst mit koordinaten auf die map zugreifen
int Map::GetTileAt(int TileX, int TileY)
{
int pos = TileX + TileY * w; // hier wird einfach das zweidimensionale in eindimensional umgewandelt
if(pos >= 0 && pos < size) // size ist gleich width * height also mapbreite mal maphöhe...
return map[pos];
}

Wofür soll denn da die if-Abfrage gut sein? Bzw. was würde zurückgegeben, wenn pos != 0...size ist?

Kann ein Compiler eigentlich besser Optimieren (Loop-Unrolling etc.) wenn man array[height][width] anstatt array[height*width] benutzt?

amida maru
2007-12-12, 19:36:10
eindimensionale arrays sind komfortabler... als wenn du überall immer zwei ** und [] übergibst kommste irgendwann durcheinander....

rotalever
2007-12-12, 20:33:23
eindimensionale arrays sind komfortabler... als wenn du überall immer zwei ** und [] übergibst kommste irgendwann durcheinander....
Solange man sie keiner Funktion übergibt. Zweitens geht ** doch wohl nur für Pointerarrays, oder?

Gast
2007-12-13, 07:46:37
eindimensionale arrays sind komfortabler... Geschmackssache. :)

amida maru
2007-12-13, 15:45:25
jo aber wenn dann nen anfänger kommt und der will n 2dimensionales array ner funktion übergeben hat er verkackt... weil das arsch kompliziert ist :D

rotalever
2007-12-13, 16:21:57
jo aber wenn dann nen anfänger kommt und der will n 2dimensionales array ner funktion übergeben hat er verkackt... weil das arsch kompliziert ist :D
Weil es in C eigentlich auch gar nicht geht. Man kann sie in C ja noch nicht mal vom Heap holen. Nur statische Stackgenerierung ist möglich und so erstmal Standardmäßig auf ein paar MB beschränkt.
Im Endeffekt nutze ich immer eindimensionales, oder vectoren, wenn es später mal verändert werden soll und die Endgröße zu Beginn noch nicht festliegt.

Coda
2007-12-13, 18:14:54
http://www.boost.org/libs/multi_array/doc/index.html

Noch komfortabler :tongue: ;)