Dobrý večer, při spuštění mého kódu a zadání názvu souboru mi vyskočí chyba program ......exe přestal pracovat. Kód jsem si procházel několikrát a chybu nemohu najít. Překladač žádný error ani warning nevyhazuje.(používám CodeLite s TDM-GCC)
Jen kdyby náhodou, vstupní soubor vypadá nějak takhle:
Jarmila Adamkova 36
Jiri Lapcik 22
Milan Petru 12.7
Milena Novakova 37.5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *vstup;
typedef struct
{
char * Jmeno;
char * Prijmeni;
float znamka;
} Student;
int porovnejZnamky(float a, float b){
if (a<b) return -1;
if (a>b) return 1;
return 0;
};
int porovnejStudenty(const void *n1,const void *n2){
if ((strcmp (((Student*)n1)->Prijmeni,((Student*)n2)->Prijmeni))==0) {
if ((strcmp (((Student*)n1)->Jmeno,((Student*)n2)->Jmeno))==0) {
porovnejZnamky(((Student*)n1)->znamka,((Student*)n2)->znamka);
}
else return strcmp (((Student*)n1)->Jmeno,((Student*)n2)->Jmeno);
}
else return strcmp (((Student*)n1)->Prijmeni,((Student*)n2)->Prijmeni);
};
Student *poleStudentu;
int main(int argc, char **argv)
{
char soubor[256];
int p = 255;
if (argc>1){
vstup = fopen(argv[1], "r");
if (vstup == NULL){
printf("\nVstupni soubor nelze otevrit\n");
return 1;
}
}
else{
printf("\nZadejte nazev vstupniho souboru: ");
gets(soubor);
vstup = fopen(soubor, "r");
if (vstup == NULL){
printf("\nVstupni soubor nelze otevrit\n");
return 1;
}
}
poleStudentu = (Student *) malloc(10 * sizeof(Student));
if(poleStudentu == NULL) {
printf("Nedostatek pameti!\n");
getchar();
exit(1);
}
while(1){
for (int i = 0; i < p; i++){
if (i%10==0){
poleStudentu = (Student*)realloc(poleStudentu, (i+10) * sizeof(Student));}
if(poleStudentu == NULL) {
printf("Nedostatek pameti!\n");
getchar();
exit(1);
}
if(fscanf(vstup, "%s %s %f", poleStudentu[i].Jmeno , poleStudentu[i].Prijmeni , &poleStudentu[i].znamka) == EOF){
p = 0;}
}}
int pocetPrvku=sizeof(poleStudentu)/sizeof(Student);
qsort(poleStudentu, pocetPrvku, sizeof(Student), &porovnejStudenty);
printf("Serazeni studenti: \n");
for (int i = 0; i < pocetPrvku; i++){
printf("\n%s %s %0.2f", poleStudentu[i].Jmeno, poleStudentu[i].Prijmeni, poleStudentu[i].znamka);}
free(poleStudentu);
getchar();
return 0;
}