Neo-=IuE=-
Here to stay
|
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 int function(int var[][b]); //funktionsdekleration <- int function(int *var[b]);
int main(void)
{
int var[a][b]; //variablendef.
function(var); // funktionsaufruf
}
nur wie gesagt i muss die 2. dimension bzw. auch jedere weitere angeben (in dem fall des "b" gehts irgendwie mit dynamisch erstellten? :/
Bearbeitet von Neo-=IuE=- am 02.11.2004, 13:27
|
Gegi
Here to stay
|
wie wärs wennst einfach einen zeiger als parameter übergibst?
|
Neo-=IuE=-
Here to stay
|
meinst ich machs so: int function(int *var) //funktionsdekleration
{ int *_var[a][b];
_var = var;
}
int main(void)
{
int var[a][b]; //variablendef.
function(&var); // funktionsaufruf
}
funkt net, habs auch probiert, da funkt die typenzuweisung net  oda meinst es anders, dann posts bitte
Bearbeitet von Neo-=IuE=- am 28.10.2004, 11:39
|
watchout
Legendundead
|
erstamal: welche sprache?
bitte immer sprache dazuschreiben, man kann zwar vermuten - sicher ist man sich aber nie.
|
mat
AdministratorLegends never die
|
c++.. das sieht man doch du lusche  @topic: #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;
}
2 möglichkeiten: void show(int (* var)[b]) oder void show(int var[][b]) allerdings rate ich dir zu einem array aufzulösen und über int * zu arbeiten (weil in diesem fall ist dein array nichts anderes).
|
Neo-=IuE=-
Here to stay
|
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
|
gue
Addicted
|
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) { ... }
|
Neo-=IuE=-
Here to stay
|
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
|
mat
AdministratorLegends never die
|
schnellste, schönste und beste lösung: templates
es sei den du bestehst auf c bzw dein projekt ist darauf ausgelegt.
|
Neo-=IuE=-
Here to stay
|
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
|
mat
AdministratorLegends never die
|
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.
|
gue
Addicted
|
Also ich hab dir jetzt mal schnell das hier in ANSI C geschrieben (als Anregung sozusagen): #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);
}
Alloziieren tut man mit malloc() (definiert in stdlib.h). Freigeben mit free(). Siehe auch: http://www-ccs.ucsd.edu/c/So, wie es mat beschrieben hat (als ein einziges Blockarray), auf dem du mit %, / oder Macros arbeitest), gehts auch (und ist wahrscheinlich performanter aber auch ein bisschen komplizierter IMHO). Edit: Statt free(matrix) müsstest du natürlich auch alle einzelnen "Zeilen" der Matrix freen
|
Neo-=IuE=-
Here to stay
|
ä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
|
gue
Addicted
|
Versteh ehrlich gesagt nicht, wo da dann das Problem ist aber bitte... Hier noch eine Funktion, der du eine solche Matrix übergeben kannst: #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
*/
hth ...
|
Neo-=IuE=-
Here to stay
|
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 // 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;
}
die zeile "show(a, b, var);" liefert ein warning: passing arg 3 of `show' from incompatible pointer typedas ausführen des programms führt bei "dyn_var" zu einer korrekten ausgabe, bei "var" also wo auch ein warning is stürzt das programm mit 7 [main] test 496 handle_exceptions: Exception: STATUS_ACCESS_VIOLATION 330 [main] test 496 open_stackdumpfile: Dumping stack trace to test.exe.stackdump ab, also lags nur dran, dass ich das malloc beim testprogramm no net verwendet hatte und geglaubt hab, dass es mit malloc auch nicht funktionieren wird.... also sag ich danke
Bearbeitet von Neo-=IuE=- am 02.11.2004, 13:26
|