Da nessuna parte, era una convinzione mia. comunque ho sistemato e aggiunto la swap ma mi da ancora piu errori di prima, il codice ora è:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int carica_elementi_file(FILE *fp, struct concorrente c[]);
void ordina_vettore_concorrenti(int dim, struct concorrente c[]);
void swap (struct concorrente *c[indice_massimo], struct concorrente *c[inizio]);
void stampa_lista_concorrenti(int dim, struct concorrente c[]);
int massimo_in_sottovettore(int inizio, struct concorrente c[], int dim);
struct concorrente estrai_riga(struct concorrente c[], char s[]);
int converti_in_cifre(char t[]);
struct concorrente
{
char cognome[64];
char nome[64];
int voto;
int somma_voti;
};
int main(int argc, char *argv[])
{
FILE *fp;
int dim;
struct concorrente c;
if(argc != 2)
{
printf("Numero di argomenti sbagliati sulla riga di comando: esercizio2 <concorrenti.txt>\n");
exit(EXIT_FAILURE);
}
if((fp = fopen(argv[1], "r")) == NULL)
{
printf("Errore di apertura del file\n");
exit(EXIT_FAILURE);
}
dim = carica_elementi_file(fp,c);
ordina_vettore_concorrenti(dim, c);
stampa_lista_concorrenti(dim, c);
fclose(fp);
return(EXIT_SUCCESS);
}
void ordina_vettore_concorrenti(int dim, struct concorrente c[])
{
int inizio;
int indice_massimo;
for(inizio = 0; inizio < dim; inizio++)
{
indice_massimo = massimo_in_sottovettore(inizio, c, dim);
swap(&c[indice_massimo], &c[inizio]);
}
return;
}
void swap (struct concorrente *c[indice_massimo], struct concorrente *c[inizio])
{
int temp;
temp = *c[indice_massimo];
*c[indice_massimo] = *c[inizio];
*c[inizio] = temp;
}
int massimo_in_sottovettore(int inizio, struct concorrente c[], int dim)
{
int i, indice_massimo;
indice_massimo = inizio;
i = inizio + 1;
for( i = 0; i < dim; i++)
{
if(c[i].somma_voti > c[indice_massimo].somma_voti)
{
indice_massimo = i;
}
}
return indice_massimo;
}
void stampa_vettore(struct concorrente c[], int dim)
{
int i;
for(i = 0; i < dim; i++)
{
printf("%d %s %s %d punti", i, c[i].nome, c[i].cognome, c[i].somma_voti);
}
return;
}
int carica_elementi_file(FILE *fp, struct concorrente c[])
{
char s[256];
int i;
i = 0;
while(fgets(s, 256, fp) != NULL)
{
c[i] = estrai_riga(s);
i++;
}
return i;
}
struct concorrente estrai_riga( struct concorrente c[], char s[])
{
struct concorrente c;
int i, j;
int n_giudici;
char voto[8];
char t[8];
char *bonus;
i = 0;
/*cerco l'inizio del cognome*/
while(s[i] == ' ')
{
i++;
}
j = 0;
while(s[i] != ',')
{
c.cognome[j] = s[i];
i++;
j++;
}
c.cognome[j] = '\0';
i++; /*salto la virgola*/
j = 0;
while(s[i] != ':')
{
c.nome[j] = s[i];
i++;
j++;
}
c.nome[j] = '\0';
i++; /*salto i :*/
j = 0;
while(s[i] == ' ')
{
i++;
}
/*salto gli spazi prima dei voti*/
while(s[i] != '(')
{
for(n_giudici = 0; n_giudici < 5; n_giudici++)
{
/*leggo da s i voti, in lettere e in cifre*/
sscanf("%s", &voto);
/*se i voti sono scritti in cifre, allora li aggiungo alla somma_voti*/
if(voto[0] >= 1 && voto[0] <= 9)
{
t[j] = s[i];
i++;
j++;
c.voto = atoi(t);
c.somma_voti += c.voto;
}
/*altrimenti se sono in lettere, ho bisogno di una funzione che li "converta" in numero*/
else
{
t[j] = s[i];
i++;
j++;
c.voto = converti_in_cifre(t);
c.somma_voti += c.voto;
}
}
}
i++; /*salto la parentesi*/
j = 0;
while(s[i] != ')')
{
sscanf("%s %s", bonus, &voto);
/*se i voti sono scritti in cifre, allora li aggiungo alla somma_voti*/
if(voto[0] >= 1 && voto[0] <= 9)
{
t[j] = s[i];
i++;
j++;
c.voto = atoi(t);
c.somma_voti += c.voto;
}
/*altrimenti se sono in lettere, ho bisogno di una funzione che li "converta" in numero*/
else
{
t[j] = s[i];
i++;
j++;
}
c.voto = converti_in_cifre(t);
c.somma_voti += c.voto;
}
return c;
}
int converti_in_cifre(char t[])
{
if(strcmp(t, "uno") == 0)
{
return '1';
}
else if(strcmp(t, "due") == 0)
{
return '2';
}
else if(strcmp(t, "tre")== 0)
{
return '3';
}
else if(strcmp(t, "quattro") == 0)
{
return '4';
}
else if(strcmp(t, "cinque") == 0)
{
return '5';
}
else if(strcmp(t, "sei") == 0)
{
return '6';
}
else if(strcmp(t, "sette") == 0)
{
return '7';
}
else if(strcmp(t, "otto") == 0)
{
return '8';
}
else if(strcmp(t, "nove") == 0)
{
return '9';
}
}
- e gli errori dati dal compilatore sono:
es2.c:6:55: error: array type has incomplete element type
int carica_elementi_file(FILE *fp, struct concorrente c[]);
^
es2.c:6:43: warning: ‘struct concorrente’ declared inside parameter list [enabled by default]
int carica_elementi_file(FILE *fp, struct concorrente c[]);
^
es2.c:6:43: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
es2.c:7:61: error: array type has incomplete element type
void ordina_vettore_concorrenti(int dim, struct concorrente c[]);
^
es2.c:7:49: warning: ‘struct concorrente’ declared inside parameter list [enabled by default]
void ordina_vettore_concorrenti(int dim, struct concorrente c[]);
^
es2.c:8:34: error: ‘indice_massimo’ undeclared here (not in a function)
void swap (struct concorrente *c[indice_massimo], struct concorrente *c[inizio]);
^
es2.c:8:73: error: ‘inizio’ undeclared here (not in a function)
void swap (struct concorrente *c[indice_massimo], struct concorrente *c[inizio]);
^
es2.c:8:58: warning: ‘struct concorrente’ declared inside parameter list [enabled by default]
void swap (struct concorrente *c[indice_massimo], struct concorrente *c[inizio]);
^
es2.c:9:59: error: array type has incomplete element type
void stampa_lista_concorrenti(int dim, struct concorrente c[]);
^
es2.c:9:47: warning: ‘struct concorrente’ declared inside parameter list [enabled by default]
void stampa_lista_concorrenti(int dim, struct concorrente c[]);
^
es2.c:10:60: error: array type has incomplete element type
int massimo_in_sottovettore(int inizio, struct concorrente c[], int dim);
^
es2.c:10:48: warning: ‘struct concorrente’ declared inside parameter list [enabled by default]
int massimo_in_sottovettore(int inizio, struct concorrente c[], int dim);
^
es2.c:11:51: error: array type has incomplete element type
struct concorrente estrai_riga(struct concorrente c[], char s[]);
^
es2.c: In function ‘main’:
es2.c:41:4: error: type of formal parameter 2 is incomplete
dim = carica_elementi_file(fp,c);
^
es2.c:43:4: error: type of formal parameter 2 is incomplete
ordina_vettore_concorrenti(dim, c);
^
es2.c:45:4: error: type of formal parameter 2 is incomplete
stampa_lista_concorrenti(dim, c);
^
es2.c: In function ‘ordina_vettore_concorrenti’:
es2.c:61:7: error: type of formal parameter 2 is incomplete
indice_massimo = massimo_in_sottovettore(inizio, c, dim);
^
es2.c:62:4: error: type of formal parameter 1 is incomplete
swap(&c[indice_massimo], &c[inizio]);
^
es2.c:62:4: error: type of formal parameter 2 is incomplete
es2.c: At top level:
es2.c:70:34: error: ‘indice_massimo’ undeclared here (not in a function)
void swap (struct concorrente *c[indice_massimo], struct concorrente *c[inizio])
^
es2.c:70:73: error: ‘inizio’ undeclared here (not in a function)
void swap (struct concorrente *c[indice_massimo], struct concorrente *c[inizio])
^
es2.c: In function ‘swap’:
es2.c:74:14: error: ‘indice_massimo’ undeclared (first use in this function)
temp = *c[indice_massimo];
^
es2.c:74:14: note: each undeclared identifier is reported only once for each function it appears in
es2.c:75:28: error: ‘inizio’ undeclared (first use in this function)
*c[indice_massimo] = *c[inizio];
^
es2.c: In function ‘carica_elementi_file’:
es2.c:124:7: error: type of formal parameter 1 is incomplete
c = estrai_riga(s);
^
es2.c:124:7: error: too few arguments to function ‘estrai_riga’
es2.c:11:20: note: declared here
struct concorrente estrai_riga(struct concorrente c[], char s[]);
^
es2.c: In function ‘estrai_riga’:
es2.c:134:22: error: ‘c’ redeclared as different kind of symbol
struct concorrente c;
^
es2.c:132:52: note: previous definition of ‘c’ was here
struct concorrente estrai_riga( struct concorrente c[], char s[])
^
es2.c:189:5: warning: passing argument 2 of ‘sscanf’ from incompatible pointer type [enabled by default]
sscanf("%s", &voto);
^
In file included from /usr/include/stdio.h:29:0,
from es2.c:1:
/usr/include/stdio.h:181:5: note: expected ‘const char *’ but argument is of type ‘char (*)[8]’
int _EXFUN(sscanf, (const char *__restrict, const char *__restrict, ...)
^
es2.c:41: confused by earlier errors, bailing out