SOLVED: Mehrdimensionale Arrays als funktionsparameter

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/solved_mehrdimensionale_arrays_als_funktionsparame_128277/page_1 - zur Vollversion wechseln!


Neo-=IuE=- schrieb am 28.10.2004 um 10:58

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? :/


Gegi schrieb am 28.10.2004 um 11:19

wie wärs wennst einfach einen zeiger als parameter übergibst?


Neo-=IuE=- schrieb am 28.10.2004 um 11:35

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


watchout schrieb am 28.10.2004 um 11:58

erstamal: welche sprache?

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


mat schrieb am 28.10.2004 um 12:10

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=- schrieb am 28.10.2004 um 13:11

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 schrieb am 28.10.2004 um 14:11

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=- schrieb am 28.10.2004 um 16:19

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 schrieb am 28.10.2004 um 16:43

schnellste, schönste und beste lösung: templates

es sei den du bestehst auf c bzw dein projekt ist darauf ausgelegt.


Neo-=IuE=- schrieb am 28.10.2004 um 16:47

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 schrieb am 28.10.2004 um 17:03

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 schrieb am 28.10.2004 um 18:02

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=- schrieb am 02.11.2004 um 10:25

ä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 schrieb am 02.11.2004 um 12:14

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=- schrieb am 02.11.2004 um 13:04

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 :)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025