PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2d array als Funktionsparameter



Ghostrider
23-07-2008, 14:46
Hallo,

ich möchte einen 2d array

double array[150][2];

an eine Funktion übergeben, genauer die Adresse, denn ich möchte mit der Funktion den array verändern. Wie muss der Funktionsaufruf und die Funktionsdeklaration aussehen, damit das klappt? Ich habe verschiedene Dinge wie

void function(double * array[150][2]);
void function(double * (*&array)[2]);
void function(double ** array);

usw. ausprobiert, Funktionsaufruf mit wahlweise

function(array);
function(&array);

In keinem Fall passen die Datentypen zusammen. Wie bekommt man das konsisten hin?

Ghost

Berufspenner
23-07-2008, 14:55
Also eigentlich sollte

double array[][];
void function(double** array);
mit
function(array);
funktionieren. Zumindest läuft fogelnder Code bei mir problemlos

void free_matrix(double** array, int size)
{
int i;

for(i = 0; i < size;i++)
{
//Gibt den Speicher der "Spalten-Zeiger" wieder frei
free(array[i]);
}

//Gibt den Speicher des "Zeilen-Zeiger" wieder frei
free(array);
}
free_matrix(matrix,size);

ContainerDriver
23-07-2008, 15:51
@Ghostrider: so sollte es funktionieren:


void function(double array[150][2]);
void function(double (*array)[2]);


Hilfreich ist dieser Link: http://c-faq.com/aryptr/ary2dfunc3.html.

@Berufspenner: dein Code dürfe nur funktionieren, wenn matrix vom Typ Pointer auf Pointer (also double**) ist.

BLUESCREEN3D
23-07-2008, 15:52
@Berufspenner: Dein Code gibt in C eine Warnung und in C++ eine Fehlermeldung.

Also gehe ich mal davon aus, dass der Threadersteller C++ nutzt.

@Ghostrider: Eigentlich wäre void function(double array[][]); richtig, aber bei mehrdimensionalen Arrays muss der Compiler ja wissen, in welchen Schritten er auf die Arrayelemente zugreifen muss:

double array[A][B];
array[c][d] = 0;
In der zweiten Zeile muss auf array + c * B + d zugegriffen werden, also muss B bekannt sein. Deshalb musst du der Funktion auch alle Größenangaben außer der ersten nennen:

void function(double array[][2]);
Damit kann die Funktion dann aber auch nur Arrays der Größe irgendwas*2 bearbeiten ...

Also: Warum benutzt du nicht std::vector, wenn du schon in C++ programmierst?

#include <vector>
std::vector< std::vector<double> > array(150, std::vector<double>(2));
void function(std::vector< std::vector<double> > &array);
Damit kannst du auch innerhalb der Funktion die Dimension abfragen.

Berufspenner
23-07-2008, 18:52
@Berufspenner: dein Code dürfe nur funktionieren, wenn matrix vom Typ Pointer auf Pointer (also double**) ist.


@Berufspenner: Dein Code gibt in C eine Warnung und in C++ eine Fehlermeldung.

Ja, bei mir wars ein Doppelpointer auf ein durch calloc aloziertes Speicherfeld. Mir fällts auch auch grad wieder ein, dass man Felder != Pointer sind, also wenn man es ganz genau betrachtet. Von daher war mein Beitrag wohl nicht so hilfreich.

Ghostrider
24-07-2008, 09:48
ok Denkfehler meinerseits: Ich wollte unbedingt einen Pointer auf mein array übergeben, damit auch wirklich das Originalarray geändert wird. Da array aber selbst ein Pointer ist, ist das offenbar überflüssig. Der Code



function(double array[][2]){
...}

...main{
double array[150][2]=...;
function(array);


funktioniert. Thx an alle!