[C] Olimpiadi

di il
5 risposte

[C] Olimpiadi

Ragazzi vi pongo il seguente algoritmo, non ci sono errori sintattici ma il programma crasha dopo aver letto il nome da file, ve lo mostro:
#include <stdio.h>
#include <stdlib.h>

typedef struct dati {
int giorno;
char tipo_gara[20];
int finale;} olimpiadi;

void leggi_file(olimpiadi *p, int n_l);
void output(olimpiadi *p);

int main (){
int n_l;
olimpiadi *p;

leggi_file(p,n_l);
output(p);

free(p);

system("PAUSE");
}

void leggi_file(olimpiadi *p, int n_l){
FILE *f;
char c,nomefile[20];
int i,tmp;

printf("Inserisci il nome del file: ");
scanf("%s",&nomefile);

f=fopen(nomefile,"r");
if(f==NULL){
    printf("Impossibile aprire il file");
    exit(1);
}
else{
   p=(olimpiadi*)malloc(16*sizeof(olimpiadi));

for(i=0;i<16;i++){
    fscanf(f,"%d",tmp);
    if(tmp==10+i){
        fscanf(f,"%d",p[i].giorno);
        fscanf(f,"%s",p[i].tipo_gara);
        fscanf(f,"%d",p[i].finale);
    }
    else{

    }
}
}

fclose(f);
}

void output(olimpiadi *p){
int i;

for(i=0;i<16;i++){
    if(p[i].tipo_gara==NULL)
    printf("%d nessuna competizione interessante",p[i].giorno);
else{
    printf("%d %s %d ",p[i].giorno,p[i].tipo_gara,p[i].finale);
}
}
}
Il testo è questo:
Il programma riceve come primo argomento sulla linea di comando il nome del file contenente
il calendario delle gare e deve produrre in output un elenco in cui, per ogni giorno
(in ordine da 10 e 26), si suggerisca all’utente quale disciplina guardare in TV. La disciplina
suggerita deve essere scelta secondo le seguenti regole:
1. se in un determinato giorno vi è una sola disciplina, indicare quella
2. se in un determinato giorno vi sono due o più discipline in parallelo, ne verrà scelta
una arbitrariamente dal programma
3. se in un determinato giorno non vi sono discipline, si scriva “niente di interessante”

Manca qualche punto della traccia, ma piuttosto vorrei capire come mai crasha. Inoltre ho sempre problemi circa la lettura di caratteri da file, l'avevo già esposto in un altro tread D:

5 Risposte

  • Re: [C] Olimpiadi

    Inizia con lo scaricare un ambiente di sviluppo decente tipo code::blocks poi ne riparliamo.
  • Re: [C] Olimpiadi

    Utilizzo quello :S
  • Re: [C] Olimpiadi

    Cambia
    scanf("%s",&nomefile);
    in
    scanf("%s",nomefile);
  • Re: [C] Olimpiadi

    Tra l'altro non stai passando il nome del file come argomento da riga di comando...
    Potresti usare qualcosa del genere:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
    FILE *file;
    if(argc!=2)	//Il primo argomento da riga di comando è sempre il nome dell'eseguibile
    	{
    	fprintf(stderr,"Usage: progname file_name\n");
    	exit(EXIT_FAILURE);
    	}
    file=fopen(argv[1],"r");
    if(file==NULL)
    	{
    	fprintf(stderr,"Error, can't open %s\n",argv[1]);
    	exit(1);
    	}
    return 0;
    }
  • Re: [C] Olimpiadi

    Come ho gia detto dev-c++ è una ciofeca,le bugie prendono per i fondelli solo a te stesso.
    non ci sono errori sintattici
    ||=== Build: Debug in iop (compiler: GNU GCC Compiler) ===|
    D:\C_C++\CodeBlock\iop\main.c||In function 'leggi_file':|
    D:\C_C++\CodeBlock\iop\main.c|32|warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[20]' [-Wformat=]|
    D:\C_C++\CodeBlock\iop\main.c|43|warning: format '%d' expects argument of type 'int *', but argument 3 has type 'int' [-Wformat=]|
    D:\C_C++\CodeBlock\iop\main.c|45|warning: format '%d' expects argument of type 'int *', but argument 3 has type 'int' [-Wformat=]|
    D:\C_C++\CodeBlock\iop\main.c|47|warning: format '%d' expects argument of type 'int *', but argument 3 has type 'int' [-Wformat=]|
    D:\C_C++\CodeBlock\iop\main.c|28|warning: unused variable 'c' [-Wunused-variable]|
    D:\C_C++\CodeBlock\iop\main.c||In function 'main':|
    D:\C_C++\CodeBlock\iop\main.c|24|warning: control reaches end of non-void function [-Wreturn-type]|
    D:\C_C++\CodeBlock\iop\main.c||In function 'leggi_file':|
    D:\C_C++\CodeBlock\iop\main.c|43|warning: 'tmp' may be used uninitialized in this function [-Wmaybe-uninitialized]|
    D:\C_C++\CodeBlock\iop\main.c||In function 'main':|
    D:\C_C++\CodeBlock\iop\main.c|18|warning: 'p' is used uninitialized in this function [-Wuninitialized]|
    D:\C_C++\CodeBlock\iop\main.c|18|warning: 'n_l' is used uninitialized in this function [-Wuninitialized]|
    ||=== Build finished: 0 error(s), 9 warning(s) (0 minute(s), 5 second(s)) ===|
    IL compilatore ha sempre ragione!
Devi accedere o registrarti per scrivere nel forum
5 risposte