Funktion definieren, um ein Array dynamisch anzulegen
-
^^gabs letztens schon mal: http://www.c-plusplus.net/forum/viewtopic-var-t-is-233880-and-start-is-90-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html
-
aha,
ich habe folgendes probiert:
#include <stdio.h> #include <stdlib.h> void fun(int **intarray, int rows, int cols); int main(void) { int dimi, dimj; int i,j; int **array; printf("Dimension i: "); scanf("%d", &dimi); printf("Dimension j: "); scanf("%d", &dimj); array = malloc(dimi * sizeof(int*)); for (i=0; i<dimi; i++) { array[i] = malloc(dimj * sizeof(int)); } for (i=0; i<dimi; i++) { for (j=0; j<dimj; j++) { array[i][j] = j + i*dimi; } } for (i=0; i<dimi; i++) { for (j=0; j<dimj; j++) { printf("array[%d,%d]: %d ", i+1, j+1, array[i][j]); } printf("\n"); } fun(array, dimi, dimj); for (i=0; i<dimi; i++) { for (j=0; j<dimj; j++) { printf("array[%d,%d]: %d ", i+1, j+1, array[i][j]); } printf("\n"); } free(array); return 0; } void fun(int **intarray, int rows, int cols) { intarray[rows][cols] = 1000; }
Das war allerdings nicht erfolgreich. "./bsp2.make: line 5: 11461 Speicherzugriffsfehler bsp2.exe".
In einem anderen Bsp habe ich gelesen, das malloc wie folgt verwendet werden soll, um ein 2D-array aufzuspannen:
int **array = malloc(zeilen*sizeof(int**));
das verstehe ich aber nicht. Ich hätte sizeof(int*) verwendet....
-
Phil270307 schrieb:
In einem anderen Bsp habe ich gelesen, das malloc wie folgt verwendet werden soll, um ein 2D-array aufzuspannen:
int **array = malloc(zeilen*sizeof(int**));
das verstehe ich aber nicht. Ich hätte sizeof(int*) verwendet....
schmeiss das beispiel in die tonne und machs richtig.
in dem fall sollte es aber egal sein, weil sizeof(int*) und sizeof(int**) beide gleich gross sind, somit liefert zeilen*sizeof(int**) == zeilen*sizeof(int*) == 4 bytes.
-
Phil270307 schrieb:
Und wenn das ganze in mehreren Dimensionen in einer Funktion erfolgen soll?
mehrdimensionale arrays mit zeiger a la int** int*** etc sind vor allem bei sehr vielen arrayelementen ineffizient, weil etliche (mega/giga) bytes nur für die zeiger verschwendet werden.
jede n-dimensionale tabelle lässt sich auf ein eindimensionales array vom typ E* zurückführen.
E == egal was fürn typ.
-
Phil270307 schrieb:
Wie genau meinst Du das? Die Funktion sollte z.B. in der Lage sein, ein Array für int, char, double, float anlegen zu können. Ist das möglich
jo, ist möglich, guckst du:
#define INT 0 #define PINT 1 #define CHAR 2 #define PCHAR 3 void* my_malloc_factory ( unsigned type, unsigned n ) { switch (type) { case INT: return malloc ( sizeof(int) * n ); break; case PINT: return malloc ( sizeof(int*) * n ); break; //... case PCHAR: return malloc ( sizeof (char*) * n ); break; default: return NULL; break; } } int main () { int* pint = my_malloc_factory ( INT, 100 ); int** ppint = my_malloc_factory ( PINT, 100 ); char** ppchar = my_malloc_factory ( PCHAR, 100 ); free (pint); free (ppint); free (ppchar); return 0; }
die fehermeldung-/behandlung, die noch fehlt habe ich mir gespart. die würd ich in etwa so machen tun:
void* my_malloc_factory ( unsigned type, unsigned n ) { void* my_multipointer = NULL; switch (type) { case INT: if ( NULL == (my_multipointer = malloc ( sizeof(int) * n ))) fprintf ( stderr, "%s\n", strerror(errno)); return my_multipointer; return malloc ( sizeof(int) * n );
und in main:
int* pint = my_malloc_factory ( INT, 100 ); if (pint == NULL ) // nach hause gehen, oder sonst was :)
gruß,
l.n.
-
ist dein Motto "Warum einfacher, wenn es schwerer geht?"
Die einfachste Methode:
T *array; array = malloc(elements * sizeof *array);
wobei T frei wählbar ist und an sich die einzige Codezeile, die verändert werden muss.
-
schon klar, aber der OP wollte eine funktion für alle möglichen typen, bei deinem T kann das in eine casting orgie ausarten.
-
Ich sehe keine Casting-Orgie. Noch nichtmal eine Cast-Orgie.
-
list n00b schrieb:
schon klar, aber der OP wollte eine funktion für alle möglichen typen, bei deinem T kann das in eine casting orgie ausarten.
Wenn ich meinen letzten Beitrag anschaue, dann kann ich nur Tims Worte wiederholen: Ich sehe keine Casting-Orgie. Noch nichtmal eine Cast-Orgie.
-
list n00b schrieb:
schon klar, aber der OP wollte eine funktion für alle möglichen typen...
wenn ich mich recht erinnere, will der OP will ein dynamisches 2D-array haben.
-
+fricky schrieb:
list n00b schrieb:
schon klar, aber der OP wollte eine funktion für alle möglichen typen...
wenn ich mich recht erinnere, will der OP will ein dynamisches 2D-array haben.
wo ist der smiley?
hast du heute schlechte laune?
-
nachhol-smiley:
hab ihn vergessen. kann ja mal vorkommen.
-
supertux schrieb:
Wenn ich meinen letzten Beitrag anschaue, dann kann ich nur Tims Worte wiederholen: Ich sehe keine Casting-Orgie. Noch nichtmal eine Cast-Orgie.
das ist nur die ruhe vor dem sturm.
die ruhe vor dem casting sturm.
wuuuuuuuuuuuuuuuusch !