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;
}