URL: https://www.overclockers.at/coding-stuff/solved_mehrdimensionale_arrays_als_funktionsparame_128277/page_1 - zur Vollversion wechseln!
Also wie übergebe ich ein mehrdimensionales Array an eine Funktion, wobei aber des array eigentlich im hauptprogramm eine dynamische größe hat!
man muss ja normal bei einem array alle bis auf die 1. arrayteillänge nennen also bei eindimensionalen arrays muss ma gar ka länge angeben, aber bei mehrdimensionalen schauts ja zb so aus
Code:int function(int var[][b]); //funktionsdekleration <- int function(int *var[b]); int main(void) { int var[a][b]; //variablendef. function(var); // funktionsaufruf }
wie wärs wennst einfach einen zeiger als parameter übergibst?
meinst ich machs so:
funkt net, habs auch probiert, da funkt die typenzuweisung netCode:int function(int *var) //funktionsdekleration { int *_var[a][b]; _var = var; } int main(void) { int var[a][b]; //variablendef. function(&var); // funktionsaufruf }
erstamal: welche sprache?
bitte immer sprache dazuschreiben, man kann zwar vermuten - sicher ist man sich aber nie.
c++.. das sieht man doch du lusche
@topic:
Code:#include <stdio.h> #define a 5 #define b 5 void show(int (* var)[b]) { for (int i=0;i != a;i++) { for (int j=0;j != b;j++) printf("%d ",var[i][j]); printf("\n"); } } int main(void) { int var[a][b]; for (int i=0;i != a;i++) { for (int j=0;j != b;j++) var[i][j] = i*j; } show(var); return 0; }
sorry, dass ich sprache net dazugschrieben hab!
is ANSI C (net c++)
mat super, die möglichkeit is eh klar, nur hab ich ja nach dynamisch erstellten array größen gefragt, also, dass i eben a und b nicht in einem define hab oder von hand in die variablendefinition schreib, war mehr a pseudocode bei der definition um klar zu machen wies dann vorm funktionsaufruf ausschaut....
zu einem array auflösen geht net, weil es geht um matritzen operationen wie zb matrizenmultiplikationen und da kann ich nicht mit eindimensionalen arrays arbeiten
2 Möglichkeiten:
Entweder du übergibst die Dimensionen der Matrizen im Methodenaufruf oder du definierst ein struct, das eine Matrix repräsentiert und in dem die Dimensionen gespeichert sind.
Also entweder
int function(int matrix[][], int dim_x, int dim_y) { ... }
oder
int function(matrix_type *matrix) { ... }
ja die dimensionen übergeb ich sowieso, aber muss der compiler nicht schon im funktionskopf schon stehn haben, dass die matrix von der größe dim_x/dim_y ist, schon oder und des geht wiederum nicht
weil sonst weiß er ja beim funktionsaufruf nicht wieviel speicherplatz er belegen muss :/
wie du des mim struct meinst bin i ma net sicha, weiß net wie du da zu was kommst
schnellste, schönste und beste lösung: templates
es sei den du bestehst auf c bzw dein projekt ist darauf ausgelegt.
ich kann nur C/C++
und wir haben an der FH bis jetzt nur C
i mein später kommt dann damit OOP drin is java (c++ mach ma gar net)
also is doch irgendwie vorgeben
i mein wir ham dynamisches erstellen eh no net mal glernt, aber i hab dacht i werd des scho hinbekommen, a vorahnung hab i ja scho vo da htl
naja des mit der übergabe von dynamischen mehrdimensionalen arrays is ma aber jetzt zur ersten hürde gworden
welche operationen sollten deine matrizen können?
wenns nur grundsätzliche sind, zB Identity, mul, add usw. dann kannst das array auflösen durch ein int * und mit % und / arbeiten.. am besten machst du dir dafür makros.
bei schwierigeren operationen bleiben dir unterschiedliche codepaths nicht erspart.
Also ich hab dir jetzt mal schnell das hier in ANSI C geschrieben (als Anregung sozusagen):
Code:#include <stdio.h> #include <stdlib.h> int main(char **argv, int argc) { int **matrix; int a, b, i, j; a = 5; b = 5; matrix = (int**)malloc(sizeof(int *) * a); if (!matrix) { printf("Couldn't allocate matrix!\n"); exit(1); } for (i = 0; i < a; i++) { matrix[i] = (int *)malloc(sizeof(int) * b); if (!matrix[i]) { printf("Couldn't allocate matrix[%d]!\n", i); exit(1); } for (j = 0; j < b; j++) { matrix[i][j] = j; } } printf("%d\n", matrix[0][3]); /* Müsste 3 ausgeben */ free(matrix); }
ähm das problem is ja nicht das dynamische anlegen von dynamischen matrizen, aber wie erstelle ich eine funktion der ich diese dynamische matrix übergeben kann....
wenns nicht möglich ist, dann muss ichs sowieso mit einem eindimensionalen machen, aber eigentlich ist eben die angabe ein mehrdimensionales array zu verwenden
wirklich gefordert is dynamische speicherreservierung eh nicht, sondan bei dem wissensstand, den einige hier erst haben reicht ihm auch ein arbeiten mit globalen variablen, nur war es mein eigenes interesse durch das ich auf dieses problem gestossen bin
Versteh ehrlich gesagt nicht, wo da dann das Problem ist aber bitte...
Hier noch eine Funktion, der du eine solche Matrix übergeben kannst:
Code:#include <stdlib.h> #include <stdio.h> /** * Schreibt eine Matrix matrix mit den Dimensionen n x m auf den Stream f */ void dumpmatrix(int n, int m, int **matrix, FILE *f) { int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { fprintf(f, "%d ", matrix[i][j]); } fprintf(f, "\n"); } } int main(char **argv, int argc) { int **matrix; int a, b, i, j; a = 5; b = 5; matrix = (int**)malloc(sizeof(int *) * a); if (!matrix) { printf("Couldn't allocate matrix!\n"); exit(1); } for (i = 0; i < a; i++) { matrix[i] = (int *)malloc(sizeof(int) * b); if (!matrix[i]) { printf("Couldn't allocate matrix[%d]!\n", i); exit(1); } for (j = 0; j < b; j++) { matrix[i][j] = j; } } dumpmatrix(a, b, matrix, stdout); for (i = 0; i < a; i++) free(matrix[i]); free(matrix); } /* gue@mrradar:~/misc/tmp$ gcc -ansi -o matrixexp matrixexp.c gue@mrradar:~/misc/tmp$ ./matrixexp 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 */
hm komisch, so hab ichs zu schreiben versucht (obwohl in meine C/C++ buch steht, dass das nicht möglich ist) hat er mir an fehler ausgeben, vielleicht weil ich eben im hauptprogramm noch kein dynamisches verwendet hatte und er deshalb wegen der fixen größe es nicht annnimmt bei einem int** als übergabewert
vielleicht wird ein int x[a]['b] anders aufbaut als ein (hochkomma wegen tags!)
sizeof(int *) * a in dem wieder in jedem arrayteil ein
sizeof(int *) * b drinnen steht
daran könnts liegen
hm muss ich mal testen...
EDIT:
hier der code den ich testet hab
Code:// Testprogramm für verschiedene Tests #include <stdio.h> #include <stdlib.h> void show(int m, int n, int **v) { int i,j; for (i=0;i != m;i++) { for (j=0;j != n;j++) printf("%d ",v[i][j]); printf("\n"); } } int main(void) { int var[5][5], i, j; int **dyn_var; int a = 5; int b = 5; dyn_var = (int**)malloc(sizeof(int *) *a); for (i=0; i != a ;i++) { dyn_var[i] = (int *)malloc(sizeof(int) * b); for (j=0;j != b;j++) var[i][j] = 10*i+j; } show(a, b, dyn_var); printf("\n\n"); show(a, b, var); return 0; }
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025