dynamisches 2D-Array Funktion
-
Habe Probleme mit der Übergabe eines dynamischen mehrdimensionalen Arrays (C, Visual Studio 08).
Wieso geht folgendes nicht?
Wieso kann ich arr[x][y] keinen wert zuweisen?void Allocate2DArray (double** Array, int Zeilen, int Spalten) { int i; Array = (double**)calloc(Zeilen, sizeof(double*)); for (i=0; i<Zeilen; i++) { Array[i] = (double*)calloc(Spalten, sizeof(double)); } } void Test (double** Array) { Array[1][2] = 23.45'; } void main() { double** arr; Allocate2DArray (arr, 10, 10); Test(arr); }
Danke.
-
In deinem Programm passiert im Moment folgendes:
du rufst Allocate2DArray() auf und uebergibst u.a. die Speicheradresse, auf die der Pointer **arr zeigt (die irgendwo ist). Allocate2DArray() zuckt mit den Schultern und uebergibt dem Pointer **Array die gleiche Adresse. Dann alloziert die Funtion Speicher und uebergibt **Array die Anfangsadresse des Speicherbereichs. Danach wird die Funktion beendet. Und wohin zeigt **arr? Keine Ahnung, aber jedenfalls genau dahin wo er vorher auch hingezeigt hat...Lange Rede, kurzer Sinn, du willst einen double** ais Rückgabewert deiner Funktion und nicht als Parameter.
Gruss,
Sebastian
-
machs so
void Allocate2DArray (double ***Array, int Zeilen, int Spalten) { int i; *Array = (double **)calloc(Zeilen, sizeof(double *)); for (i = 0; i < Zeilen; ++i) { (*Array)[i] = (double*)calloc(Spalten, sizeof(double)); } } void Deallocate2DArray(double **Array, int Zeilen) { for (int i = 0; i < Zeilen; ++i) free(Array[i]); free(Array); } void Test (double** Array) { Array[1][2] = 23.45'; } int main() { double **arr; Allocate2DArray(&arr, 10, 10); Test(arr); Deallocate2DArray(arr, 10); }
-
Ich würde Daten und Dimension unbedingt in eine Struktur packen. Sonst sieht die Signatur einer zukünftigen Multiplikation dann irgendwie so aus:
double **mul (double **mat1, int m1, int n1, double **mat2, int m2, int n2, int *m_out, int *n_out)
Nicht so prickelnd
-
Danke für die Antworten.
Ich glaube, ich habs verstanden. Brauche ja ein Pointer auf das 2D-Array. Also einen Pointer auf einen Pointer auf einein Pointer.Aber weinchen hat natürlich recht. Sinnvoller ist ein Rückgabewert, was mir auch besser gefällt.
-
Tim schrieb:
Ich würde Daten und Dimension unbedingt in eine Struktur packen. Sonst sieht die Signatur einer zukünftigen Multiplikation dann irgendwie so aus:
double **mul (double **mat1, int m1, int n1, double **mat2, int m2, int n2, int *m_out, int *n_out)
Nicht so prickelnd
oehm, _das_ sieht bei mir in der Tat fast so aus
Ok, meine Daten habe ich in ner Struktur, aber wie kann ich denn die Dimension da mit hineinbringen? Das klingt jedenfalls sehr praktisch!neugierig,
Sebastian
-
Na einfach
typedef struct { T **data; // T allgemein für beliebigen Typ size_t m; size_t n; } matrix_t;
-
Tim schrieb:
Na einfach
typedef struct { T **data; // T allgemein für beliebigen Typ size_t m; size_t n; } matrix_t;
ach, natuerlich. Ich war etwas verwirrt, weil ich gedanklich noch vor der Allozierung war. Aber sich danach zu merken, wie gross die Dimensionen sind und wieviele man davon hat, ist natuerlich ziemlich praktisch
structs sind toll!
lg,
Sebastian