Integer Matrix dynamisch anlegen
-
Hallo,
ich bin ansi c anfänger, und versuche gerade mit dynamischem speicher, arrays und structs zurecht zu kommen.
Mein problem ist folgendes:
Ich habe ein struct in einer header datei deklariert, und definiere es im source file. Jetzt hätte ich gerne gewusst, ob ich, was ich bis jetzt gemacht habe, richtig gemacht habe. Mein ziel ist es, eine matrix mit der größe n * n in dem struct zu haben.
header:
#ifndef DYN_ARRAY_TEST_H_ #define DYN_ARRAY_TEST_H_ struct MyStruct; typedef struct MyStruct MyStruct; MyStruct *createMyStruct(int n); #endif /* DYN_ARRAY_TEST_H_ */
source:
#include <stdlib.h> #include "DYN_ARRAY_TEST.h" struct MyStruct { int **matrix; }; MyStruct *createMyStruct(int n) { int i = 0; MyStruct *mStruct = (MyStruct*)malloc(sizeof(MyStruct)); mStruct->matrix = malloc(n * sizeof(int*)); for(i = 0;i<n;i++) mStruct->matrix[i] = malloc(n * sizeof(int)); return mStruct; }
Weiters würde ich gerne, z.b. an die stelle [1][5] einen wert schreiben, wie greife ich jetzt darauf zu? Folgendes scheint nicht zu funktionieren:
MyStruct *s = createMyStruct(10); s->matrix[1][5] = 3;
-
Steini79 schrieb:
Ich habe ein struct in einer header datei deklariert, und definiere es im source file. Jetzt hätte ich gerne gewusst, ob ich, was ich bis jetzt gemacht habe, richtig gemacht habe.
Das ist in der Regel schon mal falsch. Um eine Struktur in anderen *.c Dateien (aka Compilation Units) verwenden zu können, muss der Compiler die gesammte Definition der Struktur zur Kompilierzeit wissen.
Warum? Weil Dinge, die du in aeiou.c definierst nicht in foo.c sichtbar sind. Außer natürlich die Dinge, die man mit extern deklarieren kann.
Die löst dann der Linker (@ Link-Schritt) auf. Strukturen müssen aber eben @ Compile-Schritt bekannt sein.Heißt also,
struct MyStruct { int **matrix; };
gehört in den Header.
Dein Problem wird sich wohl auf dies beziehen, die genaue(en) Fehlermeldung(en) des Compilers währen aber trozdem hilfreich
.
Note: Ganzer Post ist stark vereinfacht.
Note 2: Post wurde in Eile verfasst, wird möglicherweise Unsinn enthalten.
-
Ein Zeiger ist kein Array, er kann aber auf eines zeigen. Jedoch bedeutet dies, dass ein Zeiger auf einen Zeiger ganz was anderes ist als ein Zeiger auf ein 2D-Array. Du willst daher immer noch einen einfachen Zeiger, wenn du mit Matrizen (effizient) arbeiten willst.