"We are back" « oc.at

SOLVED: Mehrdimensionale Arrays als funktionsparameter

Neo-=IuE=- 28.10.2004 - 10:58 890 14
Posts

Neo-=IuE=-

Here to stay
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3232
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
}

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
Registered: Jan 2001
Location: Wien
Posts: 793
wie wärs wennst einfach einen zeiger als parameter übergibst?

Neo-=IuE=-

Here to stay
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3232
meinst ich machs so:
Code:
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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
erstamal: welche sprache?

bitte immer sprache dazuschreiben, man kann zwar vermuten - sicher ist man sich aber nie.

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25650
c++.. das sieht man doch du lusche :p ;)

@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;
}

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
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3232
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
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
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
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3232
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

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25650
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
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3232
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

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25650
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
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
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);
}

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
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3232
ä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
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
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
*/

hth ...

Neo-=IuE=-

Here to stay
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3232
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;
}

die zeile "show(a, b, var);" liefert ein warning: passing arg 3 of `show' from incompatible pointer type
das 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
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz