Probleme mit dem einlesen einer Matrix
-
Guten abend zusammen,
Ich habe ein Problem mit der Lösung einer aufgabe wofür ich eine Matrix in ein 2 dimensionales Array einlesen muss. Diese soll wahlweise aus einer Datei oder über eine manuelle eingabe erfolgen.
Wenn ich das array im Hauptprogramm fülle funktioniert alles, aber ich will dies in eine eigene funktion packen, da ich insgesammt 7 Matrizen einlesen will.
Am besten wäre es also innerhalb einer funktion ein 2 dimensionales Array zu erzeugen und dann an das Hauptprogramm zu übergeben.Vielen dank schonmal im Vorraus
Patrick
-
Patrick2002 schrieb:
Am besten wäre es also innerhalb einer funktion ein 2 dimensionales Array zu erzeugen und dann an das Hauptprogramm zu übergeben.
Ja.
-
Ups, ja ich habe meine Frage ganz vergessen
also wie mache ich das denn, das ich ein 2 dimensionales Array in einer Funktion befülle und anschließend übergebe
MFG Patrick
-
Patrick2002 schrieb:
also wie mache ich das denn, das ich ein 2 dimensionales Array in einer Funktion befülle und anschließend übergebe
Gar nicht. Man kann keine Arrays übergeben, sondern nur Zeiger. Ein Array von Arrays wird dadurch zu einem Zeiger auf einen zusammenhängenden Bereich.
Array-Dimensionen sind nur zur Compilezeit bekannt. Wenn du 2d-Arrays mit verschienden Dimensionen haben willst, wäre es wahrscheinlich am besten, die Dimensionen irgendwo zu speichern, damit sie zur Laufzeit bekannt sind. Propagiere dafür eine Struktur, die am Anfang Informationen über die Grösse hat:
typedef int number_t; typedef struct { /* Dimensionen */ size_t dim_a, dim_b; /* Bereich für die Zahlen. 1 reicht als Grösse, weil ich selbst dafür sorge, dass genügend Platz vorhanden sein wird. */ number_t numbers[1]; } array_2d; /* Die Adresse des Elements mit den Koordinaten (a, b) */ inline number_t * index(array_2d *p, size_t a, size_t b) { return p->numbers + a * p->dim_a + b; }
Ein Array mit dim_a * dim_b kann ich dann so auf dem Heap anlegen:
array_2d * create_array_2d(size_t dim_a, size_t dim_b) { array_2d *p = malloc(sizeof(array_2d) + (dim_a * dim_b - 1) * sizeof(number_t)); /* 1 subtrahieren, weil 1 mal sizeof(number_t) schon in der Struktur-Definition vorkommt. */ p->dim_a = dim_a; p->dim_b = dim_b; return p; }
Fehlerbehandlung ausgespart, am Ende muss ich das Ding mit free() freigeben.
Jetzt kann man das Ding wie ein 2d-Array verwenden, wenn man immer index(array, a, b) zur Indizierung verwendet:
#define NUMBER_FMT "%d" #define SIZE_FMT "%u" array_2d * read_array(size_t dim_a, size_t dim_b) { array_2d *p = create_array_2d(dim_a, dim_b); for (size_t a = 0; a < dim_a; a++) for (size_t b = 0; b < dim_b; b++) readnumber(index(p, a, b), NUMBER_FMT, "array[" SIZE_FMT "][" SIZE_FMT "]> ", a, b); return p; } int main(void) { array_2d *arr = read_array(2, 2); printf("%d\n", *index(arr, 1, 1)); /* ... */ free(arr); return 0; }
readnumber()
ist hier:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1888189.htmlNoch Fragen?
-
Erstmal vielen dank für die schnelle Hilfe. Ich glaube das wird damit aber zu kompliziert für meine Programmierkentnisse.
Ich habe mir aber jetzt etwas anderes überlegt. Da ich vorher angebe, wie viele Zeilen und wieviele Spalten vorhanden sind, wandel ich das array vor der übergabe in ein ein dimensionales array um und übergebe auch gleich die Zeilen und Spaltenanzahl. das kann ich dann später in der berechnungsfunktion wieder umwandeln und ausgeben.Vielen dank und Liebe Grüße
Patrick
-
mngbd schrieb:
Patrick2002 schrieb:
also wie mache ich das denn, das ich ein 2 dimensionales Array in einer Funktion befülle und anschließend übergebe
Gar nicht. Man kann keine Arrays übergeben, sondern nur Zeiger. Ein Array von Arrays wird dadurch zu einem Zeiger auf einen zusammenhängenden Bereich.
Das möchte ich so nicht stehen lassen, weil mich die interne Repräsentation erstmal gar nicht juckt und formal tatsächlich ein (auch multidimensionales) Array übergeben werden kann:
void WorkOnArray(int cube[][7][10]); // die erste Dimension kann ausgelassen werden, die // beiden anderen müssen zur Compiletime feststehen.
Kann man ggf. auch Nachlesen. :p
-
pointercrash() schrieb:
Das möchte ich so nicht stehen lassen, weil mich die interne Repräsentation erstmal gar nicht juckt und formal tatsächlich ein (auch multidimensionales) Array übergeben werden kann:
void WorkOnArray(int cube[][7][10]);
Das hängt von der Form ab. Man könnte auch argumentieren, dass das keine Array-Übergabe ist, weil
cube
ein Zeiger aufint[7][10]
ist. Nach deiner formalen Ansicht wäre die Frage nachsizeof(cube)
nicht zu beantworten, weil die Grösse des Arrays nicht bestimmt ist. Der Ausdruck evaluiert aber zu der Grösse des Zeigers.Gibt es eigentlich noch einen anderen Kontext als den Operanden von
sizeof
, in dem ein Array nicht sofort zu einem Zeiger erstarrt?