WinFuture-Forum.de: Parameterübergabe In C - 2d Array - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Parameterübergabe In C - 2d Array Wo liegt mein Problem


#1 Mitglied ist offline   I3lack0ut 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.047
  • Beigetreten: 14. Oktober 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart

geschrieben 02. Juni 2008 - 21:00

Hallo,

ich will ein simples Unterprogramm schreiben, dem ein 2d Array übergeben wird und das Unterprogramm soll lediglich dieses Array ausgeben. Das Programm kompiliert zwar, hat aber immer folgende Laufzeitfehler:

	 62 [main] test 6116 _cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
   1618 [main] test 6116 open_stackdumpfile: Dumping stack trace to test.exe.stackdump


#include <stdio.h>

void putmatrix(double ** A, int dim);

int main(void){
	
	double A[3][3] = {	{1,2,3},
						{4,5,6},
						{7,8,9}};
	int dim = 3;
	
	putmatrix(A,dim);
	
	return 0;
}

void putmatrix(double ** A, int dim){
	
	int i = 0;
	int j = 0;
	
	for (i = 0; i < dim; i++){
		for (j = 0; j < dim; j++){
			printf("%f ",A[i][j]);
		}
		printf("\n");
	}
	
	
}


Danke schonmal :)
Never run a changing system.
Micro Game Reviews (Mein Blog)
0

Anzeige



#2 Mitglied ist offline   Der Kenner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 574
  • Beigetreten: 30. Januar 05
  • Reputation: 0

geschrieben 03. Juni 2008 - 15:36

Ok, hier erst einmal der korrigierte Code:
#include <stdio.h>
#include <stdlib.h>

void putmatrix(double A[][3], int dim){
	int i, j;
	for (i = 0; i < dim; i++){
		for (j = 0; j < (sizeof(A[0]) / sizeof(A[0][0]) ); j++){
			printf("%f ",A[i][j]);
		}
		printf("\n");
	}
}

int main(){
	enum {DIM=3};	
	double a[DIM][DIM] = {	{1.0, 2.0, 3.0},
											{4.0, 5.0, 6.0},
											{7.0, 8.0 ,9.0}
									};
	putmatrix(a, DIM);
	
	return EXIT_SUCCESS;
}


Zur Erläuterung:
1) "double A[][3]" in der Parameterliste der Funktion ist wichtig, damit der Compiler "weiß", wo die Zeilen anfangen. Andernfalls wird er sich über den nichtvollständigen Parameter beschweren.
2) Die Berechnung mit den sizeof-Operatoren hat die 3 (Spaltenanzahl) als Ergebnis.
3) Bei der Arrayinitalisierung hab ich mal explizit float-Werte reingeschrieben. Implizite Konvertierung ist nicht so toll.
4) Der enum erstellt eine "Konstante" namens "DIM". Der Vorteil davon gegenüber "const unsigned int DIM=3;" ist, dass du DIM auch gleich bei der Größenbestimmung des Arrays benutzen kannst.
5) Ansonsten hab ich noch die überflüssige doppelte Initialisierung der Laufvariablen i und j rausgenommen und die stdlib.h eingebunden. Mit Letzterem kannst du einen plattformunabhängigen Errorcode zurückgeben (-> return).
0

#3 Mitglied ist offline   I3lack0ut 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.047
  • Beigetreten: 14. Oktober 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart

geschrieben 03. Juni 2008 - 17:38

Zitat

1) "double A[][3]" in der Parameterliste der Funktion ist wichtig, damit der Compiler "weiß", wo die Zeilen anfangen. Andernfalls wird er sich über den nichtvollständigen Parameter beschweren.


Also ohne habe ich eigentlich keinen Kompilerfehler bekommen, mir geht es hier im Prinzip darum, die Funktion Putmatrix für beliebige Quadratische Matrizen verwenden zu können. Es müsste doch daher eigentlich genügen wenn ich der Funktion den Zeiger auf das Array übergebe und die Dimension.

(Soetwas wie array.size gibt es in C ja leider nicht!)

Zitat

2) Die Berechnung mit den sizeof-Operatoren hat die 3 (Spaltenanzahl) als Ergebnis.


Kann ich jetzt händisch nicht direkt nachvollziehen werde aber mal ein paar Testfälle durchspielen und schauen was rauskommt.

Zitat

3) Bei der Arrayinitalisierung hab ich mal explizit float-Werte reingeschrieben. Implizite Konvertierung ist nicht so toll.


Verstehe ich, war mehr oder weniger Faulheit von mir, aber daran soll es ja auch nicht gelegen haben :)

Zitat

4) Der enum erstellt eine "Konstante" namens "DIM". Der Vorteil davon gegenüber "const unsigned int DIM=3;" ist, dass du DIM auch gleich bei der Größenbestimmung des Arrays benutzen kannst.


Gibt es einen Grund wieso es mit "const unsigned int DIM=3" nicht geht?

edit: Hat sich erübrigt habe die Erklärung gefunden :)

Zitat

5) Ansonsten hab ich noch die überflüssige doppelte Initialisierung der Laufvariablen i und j rausgenommen und die stdlib.h eingebunden. Mit Letzterem kannst du einen plattformunabhängigen Errorcode zurückgeben (-> return).


Habe im Internet auch noch eine andere Lösungsmöglichkeit gefunden bei der diese Bibliothek auch verwendet wird, um Speicherplatz dynamisch zuzuweisen, da steige ich aber auch noch nicht so recht durch.

Dieser Beitrag wurde von I3lack0ut bearbeitet: 03. Juni 2008 - 17:44

Never run a changing system.
Micro Game Reviews (Mein Blog)
0

#4 Mitglied ist offline   Der Kenner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 574
  • Beigetreten: 30. Januar 05
  • Reputation: 0

geschrieben 03. Juni 2008 - 18:44

Sorry, hab mich falsch ausgedrückt. Ich meinte, die '3' ist wichtig bei "double A[][3]".

Zitat

Putmatrix für beliebige Quadratische Matrizen

Hm, bei C++ fallen mir da Templates ein, aber bei C...

Zitat

Kann ich jetzt händisch nicht direkt nachvollziehen

void putmatrix(double A[][3], int dim){
	int i, j, x;
	for (i = 0; i < dim; i++){
		for (j = 0; j < (x= sizeof(A[0]) / sizeof(A[0][0]) ); j++){
			printf("%f ",A[i][j]);
		}
		printf("\n");
	}
	printf("%d\n", x);
}


Zitat

andere Lösungsmöglichkeit gefunden bei der diese Bibliothek auch verwendet wird, um Speicherplatz dynamisch zuzuweisen

Ja, die stdlib.h macht natürlich noch mehr. Aber es werden eben auch die symbolischen Konstanten für die jeweiligen systemspezifischen Rückgabewerte gesetzt.

Dieser Beitrag wurde von Der Kenner bearbeitet: 03. Juni 2008 - 20:32

0

#5 Mitglied ist offline   I3lack0ut 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.047
  • Beigetreten: 14. Oktober 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart

geschrieben 03. Juni 2008 - 18:52

Ich habe noch folgende für mich verständlichere Lösung als deine gefunden:

#include <stdio.h>
#include <stdlib.h>

void putmatrix(double ** A, int dim);

int main(void){
	
	double **A;
	int dim = 3;
	int ctr1, ctr2;
	
	A = (double **) calloc((size_t) dim, sizeof(double*));
	for(ctr1=0;ctr1<dim;ctr1++){
		A[ctr1] = (double *) calloc((size_t) dim, sizeof(double));
	}
	
	for(ctr1=0;ctr1<dim;ctr1++){
		for(ctr2=0;ctr2<dim;ctr2++){
			A[ctr1][ctr2]=(double) 1;
		}
	}
	
	putmatrix(A,dim);
	
	free(A);
	return 0;
}

void putmatrix(double ** A, int dim){
	
	int i = 0;
	int j = 0;
	
	for (i = 0; i < dim; i++){
		for (j = 0; j < dim; j++){
			printf("%f ",A[i][j]);
		}
		printf("\n");
	}
	
	
}

Dieser Beitrag wurde von I3lack0ut bearbeitet: 03. Juni 2008 - 18:58

Never run a changing system.
Micro Game Reviews (Mein Blog)
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0