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!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.