Sortowanie stuktur - język C

Knave
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 gru 2007, o 22:45
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

Sortowanie stuktur - język C

Post autor: Knave »

Mam bardzo wielką prośbę. Czy ktoś mógłby obejrzeć ten kod i powiedzieć mi gdzie jest błąd. Bo ja już slęcze nad tym któryś dzień i nie mam już siły.

To bardzo prosty program więc nie zajmie on dużo czasu do sprawdzenia.
Bardzo liczę na pomoc.
Z góry dziękuje za jakiekolwiek rady.

Błąd objawia się wyskakującym "segmentation fault" po wypisaniu na ekran "Sortowanie wedlug ...:".

Kod: Zaznacz cały

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


FILE *srcf;


int n, nr;


/*STRUKTURA*/

struct osoba {
char imie[10];
char nazwisko[20];
int wiek;
};

struct osoba **dane;


/*PROTOTYPY FUNKCJI*/

int licz ();
void pamiec (int nr);
void tablica (int nr);
void onscreen (int nr, char sort[]);
void sortowanie (int nr, char sort[]);
void czyszczenie (int n);



/*MAIN*/

int main(int argc, char *argv[])
{
	if (argv[1] == NULL)
		{
		printf("Blad nazwy pliku zrodlowego");
		}

	if (argv[2] == NULL)
		{
		printf("Blad rodzaju sortowania");
		}
	
	

	if (( argv[2][0] != 'i' ) && ( argv [2][0] != 'n' ) && (argv [2][0] != 'w'))
		{
		printf ("\n Prosze podac poprawny parametr: i/n/w ... \n");
		}

	if (argv [2][1] != '\0')
		{
		printf ("\n Jako drugi parametr podano wiecej niz jeden znak! \n Pod uwage zostanie wziety tylko pierwszy...\n");
		}


	if ((srcf = fopen (argv[1], "rt")) == NULL)
		{
			printf ("Nie moge otworzyc pliku: %s", argv[1]);
		}


	nr = licz();
	pamiec(nr);
	tablica(nr);

	sortowanie (nr, argv[2]);
	onscreen (nr, argv[2]);


	printf ("\n");

	fclose (srcf);

	czyszczenie (n);


	return 0;
}






/*FUNKCJE*/


int licz () /*ZLICZA ILOSC REKORDOW W PLIKU ZRODLOWYM*/
{
	char c;
	

	while (( c = fgetc (srcf)) != EOF)
	{
		if (c == '\n')
		{
			nr++;
		}
	}
	fseek (srcf, -1, SEEK_END);
	c = fgetc (srcf);
	if (c != '\n')
		{
		nr++;
		}

	return (nr);
}


void pamiec (int nr) /*ALOKUJE PAMIEC*/
{

	dane = (struct osoba **) malloc ( nr * (sizeof (struct osoba *)) );

		for (n=0; n<nr; n++)
			{
				dane [n] = (struct osoba *) malloc (sizeof (struct osoba));
			}

	return;
}


void tablica (int nr) /*ZAPIS DO TABLICY*/
{
	char *bufpart;
	char buf [1024];
	int bufwiek;


	rewind (srcf);
	for (n=0; n<nr; n++)
		{
			fscanf (srcf, "%s", buf);

		bufpart = strtok (buf, ";");
			strcpy (dane[n] -> imie, bufpart);

		bufpart = strtok (NULL, ";");
			strcpy (dane[n] -> nazwisko, bufpart);

		bufpart = strtok (NULL, ";");
		bufwiek = strtoul (bufpart, NULL, 0);
			dane[n] -> wiek = bufwiek;
		}
	
	return;
}


void sortowanie (int nr, char sort[]) /*SORTOWANIE*/
{
	int i,j;
	struct osoba bufor;

	if (sort[0] == 'i')
	{
		for (i=0; i<nr; i++)
			{
				for (j=i; j<nr; j++)
				{
				if (strcmp (dane[i] -> imie, dane[j] -> imie) > 0)
					{
					bufor = *dane[i];
					*dane[i] = *dane[j];
					*dane[j] = bufor;
					}
				}
			}
	}

	if (sort[0] == 'n')
	{
		for (i=0; i<nr; i++)
			{
				for (j=i; j<nr; j++)
				{
				if (strcmp (dane[i] -> nazwisko, dane[j] -> nazwisko) > 0)
					{
					bufor = *dane[i];
					*dane[i] = *dane[j];
					*dane[j] = bufor;
					}
				}
			}
	}


	if (sort[0] == 'w')
	{
		for (i=0; i<nr; i++)
			{
				for (j=i; j<nr; j++)
				{
				if ((dane[i] -> wiek) < (dane[j] -> wiek))
					{
					bufor = *dane[i];
					*dane[i] = *dane[j];
					*dane[j] = bufor;
					}
				}
			}
	}


return;
}


void onscreen (int nr, char sort[]) /*WYPISANIE NA EKRAN*/
{

	if (sort[0] == 'i')
		{
		printf ("\nSortowanie wedlug imienia: \n");
		}

	if (sort[0] == 'n')
		{
		printf ("\nSortowanie wedlug nazwiska: \n");
		}

	if (sort[0] == 'w')
		{
		printf ("\nSortowanie wedlug wieku: \n");
		}

	for (n=0; n< nr; n++)
		{
			printf ("\n%s %s %d, dane[n] -> imie, dane[n] -> nazwisko, dane[n] -> wiek");
		}


return;

}


void czyszczenie (int n)
{
	for (n=0; n<nr; n++)
		{
			free (dane[n]);
		}
	free (dane);

	return;
}
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

Sortowanie stuktur - język C

Post autor: smiechowiec »

Proponuję na początek w funkcji onscreen zamienić linię
printf ("
%s %s %d, dane[n] -> imie, dane[n] -> nazwisko, dane[n] -> wiek");
na
printf ("
%s %s %d", dane[n] -> imie, dane[n] -> nazwisko, dane[n] -> wiek);
Knave
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 gru 2007, o 22:45
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

Sortowanie stuktur - język C

Post autor: Knave »

Dziękuję bardzo.
I przepraszam że z takim durnym problemem sie zgłaszam...
ODPOWIEDZ