[C] Przekazywanie wskaznika do tablicy strutur - seg. fault

0

Witam,

mam pewien problem przy zapisywaniu wartosci do tablicy struktur wysylanej do funkcji. Ma ona miec efekt na zewnatrz funkcji (wczytuje dane ze strumienia, liczy ilosc wierszow i zapisuje te dane w postaci X,Y do tablicy struktur):

typedef struct {
	double real;
	double imaginary;
} complex;

void loadComplex( complex** cx ) {
	int lineCount = 0, i = 0;
	char c = '\0';
	double real = 0.0, imaginary = 0.0;

	while( scanf( "%c", &c ) != EOF ) {
		if( c == '\n' ) ++lineCount;
	}
	rewind( stdin ); // wiem ze to jest bledne, ale nie o ta linie mi tu chodzi

	*cx = malloc( lineCount * sizeof( complex ) );

	printf( "%d\n", sizeof( *cx ) ); 
	for( i = 0; i < lineCount; ++i ) {
		scanf( "%lf,%lf", &cx[i]->real, &cx[i]->imaginary ); // tutaj sie wysypuje
	}
}

int main( void ) {
	complex* cx = NULL;

	loadComplex( &cx );

	return 0;
}

z tego co sie dowiedzialem, to przesylam zle dane do tej funkcji w ktorej wystepuje blad (scanf(); zaznaczone w kodzie), co ja powinienem tam wyslac? Probuje na rozne sposoby i nic mi nie wychodzi.

Pozdrawiam i dziekuje za pomoc (i przepraszam za brak polskich znakow).

0

Dla tablicy struktur przyklad:

#include <stdio.h>

typedef struct cos {
	int robak;
} cos;

void load(cos *tab)
{
	int i;
	for(i = 0; i < 25; i++)
		tab[i].robak = i;
}

int main(void)
{
	cos tab[25];
	load(tab);

	return 0;
}

Ty bardziej zrobiles tablice pointerow na strukture, ale chciales tablice struktur, wiec mozesz sie na tym kodzie wzorowac ;)

0

no to robilem tak wczesniej i (komentarze w kodzie):

typedef struct {
	double real;
	double imaginary;
} complex;

void loadComplex( complex* cx ) {
	int lineCount = 0, i = 0;
	char c = '\0';
	double real = 0.0, imaginary = 0.0;

	while( scanf( "%c", &c ) != EOF ) {
		if( c == '\n' ) ++lineCount;
	}
	rewind( stdin );

	cx = malloc( lineCount * sizeof( complex ) );

	printf( "%d\n", sizeof( *cx ) ); 
	for( i = 0; i < lineCount; ++i ) {
		scanf( "%lf,%lf", &cx[i].real, &cx[i].imaginary );
	}
	printf( "%lf,%lf", cx[0].real, cx[0].imaginary ); // tu moge wyswietlic dane
}

int main( void ) {
	complex* cx = NULL;

	loadComplex( cx );
	printf( "%lf,%lf", cx[0].real, cx[0].imaginary ); // ale tutaj poza ta funkcja juz nie, bo mam segmentation fault, dlaczego?
	getchar();
	return 0;
}
0

to skoro zrobiles tak wczesniej to gratuluje, tylko nie edytuj swojego pierwszego posta ;]

0

@jajcek:
Bo zmienna cx zdefiniowana w main() cały czas ma wartość NULL. Wewnątrz loadComplex masz z kolei parametr, który akurat też nazwałeś cx i który zainicjalizowałeś wartością zmiennej cx z main. Poza tym faktem to są dwie różne zmienne. Wewnątrz loadComplex ustawiasz argument cx na obszar pamięci zaalokowany za pomocą malloc, ale zmienna cx z main wciąż jest NULL.

Proponuje zmodyfikować loadComplex tak, by funkcja zwracała wskaźnik na zaalokowaną pamięć. Usuń argument cx -- funkcja i tak go nie odczytuje. Zamiast tego zadeklaruj w tej funkcji zmienną cx. Dalej niech będzie tak, jak jest -- cx przypisujesz wartość zwróconą przez malloc. Na końcu loadComplex robisz "return cx". Wtedy nowej funkcji loadComplex używasz tak:

complext* cx = loadComplex(); 

Pamiętaj KONIECZNIE, by na końcu main zwolnić zaalokowaną pamięć, tj. zrobić free(cx).

0
t0m_k-tmp napisał(a)

to skoro zrobiles tak wczesniej to gratuluje, tylko nie edytuj swojego pierwszego posta ;]

nie rozumiem

bswierczynski napisał(a)

Proponuje zmodyfikować loadComplex tak, by funkcja zwracała wskaźnik na zaalokowaną pamięć. Usuń argument cx -- funkcja i tak go nie odczytuje. Zamiast tego zadeklaruj w tej funkcji zmienną cx. Dalej niech będzie tak, jak jest -- cx przypisujesz wartość zwróconą przez malloc. Na końcu loadComplex robisz "return cx".

wlasnie za wszelka cene chcialem uniknac zwracania wskaznika przez funkcje, chcialem to po prostu zrobic wskaznikami, aby efekt byl na zewnatrz funkcji, dlatego w pierwszym poscie przesylalem wskaznik, tylko nie mam pojecia dlaczego mam segmentation fault. W tej petli dla i=0 to dziala, jednak dla wiekszych juz nie dziala.

//edit

to jest wciaz aktualne :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1