C Pointer auf Strukturen Pointerpointer in Strukture

djdolla

Cadet 1st Year
Registriert
Mai 2006
Beiträge
15
Hallo Zusammen,

ich hab im folgendes Problem:
Ich brauche eine Strukur die eine dynamische 2D Matrix aufnimmt und will diese manipulieren.

Code:
Code:
typedef struct{
	int columns;
	int rows;
	int** Matrix;
}MATRIX;

int CreateMtz(MATRIX *Matrix)
{
	if(Matrix->columns == 0||Matrix->rows==0||Matrix->Matrix==NULL)
		return -1;
	Matrix->Matrix = (int**)malloc(sizeof(int*)*Matrix->rows);
	for(int i = 0;i<Matrix->columns;i++)
	{
		Matrix->Matrix[i] = (int*)malloc(sizeof(int)*Matrix->columns);
	}

	Matrix[0].Matrix[0][0] = 1;
	return 0;
}
int main()
{
	MATRIX myMtz;
	myMtz.columns = 3;
	myMtz.rows = 3;
	CreateMtz(&myMtz);
        //Bis hierher funktioniert das ganze noch zumindest kommt kein Fehler
        printf("%i",myMtz.Matrix[0][0]); //Das funktioniert nicht mehr. 
}



Nun meine Frage: Ist der Code bis jetzt korrekt?

Wie kann ich auf mein 2D Arrray in einer Funktion (also über Pointer) zugreifen?

Danke für die Hilfe!

Schöne Grüße
 
Code:
if(Matrix->columns == 0||Matrix->rows==0||Matrix->Matrix==NULL)
Warum willst du abbrechen wenn Matrix NULL ist?
solltest eher abbrechen wenn es NICHT Null ist (weil schon initalisiert)

un der code ist auch böse
Code:
Matrix[0].Matrix[0][0] = 1; //so dereferenziert man auf ein array und nicht auf einpointer
//besser
(*Matrix).Matrix[0][0] = 1;
//oder
Matrix->Matrix[0][0] = 1;
der Code funktioniert bei mir aber
VS C++ 2005

Was funktioniert bei dir nicht?
 
the_nobs schrieb:
Code:
if(Matrix->columns == 0||Matrix->rows==0||Matrix->Matrix==NULL)
Warum willst du abbrechen wenn Matrix NULL ist?
solltest eher abbrechen wenn es NICHT Null ist (weil schon initalisiert)
Du hast natürlich recht. War ein denkfehler von mir.

the_nobs schrieb:
un der code ist auch böse
Code:
Matrix[0].Matrix[0][0] = 1; //so dereferenziert man auf ein array und nicht auf einpointer
//besser
(*Matrix).Matrix[0][0] = 1;
//oder
Matrix->Matrix[0][0] = 1;
der Code funktioniert bei mir aber
VS C++ 2005

Was funktioniert bei dir nicht?

Auch hier hast du natürlich recht. Das ist nur im Rahmen des herumprobierens entstanden.
Bei mir im Code habe ich das auch via Matrix->Matrix[0][0] = 0; gemacht.

Funktioniert bei dir außerhalb der Funktion das printf auch noch?
Bei mir wird die printf Anweisung nicht mehr ausgeführt.
Code:
printf("Matrix: %i",myMtz.Matrix[0][0]);

Ich arbeite übrigens mit Eclipse und MacOS X
 
Zuletzt bearbeitet: (Ergänzung)
was heißt wird nicht ausgeführt?
Bist du mit einem Debugger schon durchgegangen?

wird einfach die outputconsole schon zugemacht bevor du was tun kannst?
einfach mal ein "getchar()" nach dem printf reinhängen.
meiner Meinung sollte das tun
 
Oh Gott: Sch*** Eclipse!
Wenn ich das Programm in der Console direkt starte läuft es.
Danke für deine Hilfe nobs!

Falls jemand Lust haben sollte das mal in Eclipse zu versuchen nocheinmal der vollständige Code.

Ich häng noch einen Screenshot von meinem Eclipse Output und dazu Konsolenoutput.

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

typedef struct{
	int columns;
	int rows;
	int** Matrix;
}MATRIX;

int CreateMtz(MATRIX* Matrix);


int main()
{
	MATRIX myMtz;
	myMtz.columns = 3;
	myMtz.rows = 3;
	CreateMtz(&myMtz);

	printf("Matrix: %i\n",myMtz.Matrix[0][0]);

}

int CreateMtz(MATRIX *Matrix)
{
	if(Matrix->columns == 0||Matrix->rows==0||Matrix->Matrix==NULL)
		return -1;
	Matrix->Matrix = (int**)malloc(sizeof(int*)*Matrix->rows);
	for(int i = 0;i<Matrix->columns;i++)
	{
		Matrix->Matrix[i] = (int*)malloc(sizeof(int)*Matrix->columns);
	}

	Matrix->Matrix[0][0] = 1;
	printf("Unterfunktion: %i\n",Matrix->Matrix[0][0]);

	return 0;
}

Tante Edit:
Das ist ja eine völlig komische Sache:
Wenn ich das Programm in Eclipse ausführe (Run) wird mir nichts angezeigt. Ein getchar() ändert überigens auch nichts daran.
Wenn ich das Programm debugge (Debug) werden mir die printfs angezeigt.
 

Anhänge

  • Bildschirmfoto 2012-02-10 um 17.01.44.jpg
    Bildschirmfoto 2012-02-10 um 17.01.44.jpg
    71,7 KB · Aufrufe: 92
Zuletzt bearbeitet: (Ergänzung)
Zwei Sachen noch:

Matrix wird nicht initialisiert: myMtz.Matrix = NULL; // sicher ist sicher

in Zeile 29: for(int i = 0;i<Matrix->columns;i++)
muss heißen: for(int i = 0;i<Matrix->rows;i++)
 
Danke für die Hinweise, aber das Beispiel verfolgt keinen tieferen Zweck ist für mich nur ein techbeispiel gewesen.
 
djdolla schrieb:
Falls jemand Lust haben sollte das mal in Eclipse zu versuchen nocheinmal der vollständige Code.

Tante Edit:
Das ist ja eine völlig komische Sache:
Wenn ich das Programm in Eclipse ausführe (Run) wird mir nichts angezeigt. Ein getchar() ändert überigens auch nichts daran.
Wenn ich das Programm debugge (Debug) werden mir die printfs angezeigt.

Also bei mir läuft sowohl im Debug als auch als Release durch.
Benutze Eclipse 3.7.1 unter Ubuntu.
 
Zurück
Oben