Errori da risolvere

di il
20 risposte

Errori da risolvere

Ciao, compilando gcc mi da i seguenti errori, dove devo agire?

1) error: array type has incomplete element type
2) ‘struct xxx’ declared inside parameter list [enabled by default]

20 Risposte

  • Re: Errori da risolvere

    Devi agire sul codice.
    Se non sai come fare mostracelo che ti aiutiamo noi
    gcc dovrebbe indicarti la linea in cui c'è l'errore, bisogna partire da lì
  • Re: Errori da risolvere

    Regola principale: devi SEMPRE mostrare il codice in cui si manifesta l'errore.
  • Re: Errori da risolvere

    Si scusate, ecco il codice: in pratica dovrebbe leggere un file.txt in cui legge in ogni riga: cognome, nome, dei voti (alcuni in lettere altri in numeri ) e ne fa la somma totale. alla fine viene stampata una lista in ordine decrescente di somma.
    #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 stampa_lista_concorrenti(int dim, struct concorrente c[]);
    int massimo_in_sottovettore(int inizio, struct concorrente c[], int dim);
    struct concorrente estrai_riga(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>");
    	  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;
    }
    
    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_file(s);
    	  i++;
       }
       
       return i;
       
    }
    
    struct concorrente estrai_riga( 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, "%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(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';
    	}
    	
    }
    
  • Re: Errori da risolvere

    1) La funzione carica_elementi_file prevede un array di struct concorrente, ma tu non passi un array quando la chiami nel main.

    2) La funzione swap non esiste

    3) La funzione estrai_riga_file non esiste

    4) Nella sscanf bonus è un char ma la funzione si attende un char *

    5) int converti_in_cifre(t[]) ... manca il tipo di t[]
  • Re: Errori da risolvere

    Pensavo che la funzione swap fosse inclusa nella libreria stdio.h. devo quindi scriverla io?
  • Re: Errori da risolvere

    Dove l'avevi letto questa cosa?
  • Re: Errori da risolvere

    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
  • Re: Errori da risolvere

    Non capisco cosa manca, sono disperato!
  • Re: Errori da risolvere

    Ci passi un esempio di file dei dati?
  • Re: Errori da risolvere

    Del Rovere, Mario: due quattro 3 2 cinque (bonus 8)
    Bianchi, Pier Luigi: 8 sette 8 otto sei (bonus due)
    Dei Rossi, Anna Maria: sei 7 7 5 4 (bonus cinque)

    un file .txt con informazioni in questa formattazione
  • Re: Errori da risolvere

    Grazie. Ora posso fare delle prove.
    Una cosa che avevo notato già prima è che passi a carica_elementi_file() una struct concorrente. Secondo me faresti meglio a demandare a carica_elementi_file() l'allocazione della memoria per contenere i dati, quindi fare restituire come valore di ritorno il puntatore alla memoria allocata. Per sapere quanti elementi sono stati caricati potresti passare come parametro un puntatore a int (o a size_t) dove la funzione potrebbe collocare il dato. Tipo...

    struct concorrente *carica_elementi_file( FILE *f, int *qEl );

    L'idea potrebbe essere che se la funzione ha successo restituisce un puntatore valido, se fallisce restituisce NULL.
  • Re: Errori da risolvere

    Prima di fare altro hai letto l'elenco degli errori? Li hai corretti? Ho visto il primo ed è ancora lì, quello che ti ho detto di correggere non l'hai fatto...
  • Re: Errori da risolvere

    Mmmm preferirei se possibile continuare sulla mia strada, vorrei capire come risolvere quegli errori. Grazie per l'aiuto, sei gentilissimo
  • Re: Errori da risolvere

    Mi sto divertendo a (cercare di) risolvere l'esercizio.

    Per comodità invece di portarmi dietro struct concorrente ho fatto un typedef, per cui ora uso più sinteticamente il tipo Concorrente (che è comunque la tua struct concorrente).

    Poi ho modificato la funzione carica_elementi_file() in modo che operi sul nome del file anziché su un puntatore allo stream FILE, così: Concorrente *carica_elementi_file( const char *nf, int *qEl );

    In questo modo nel main mi troverò una chiamata molto compatta a c = carica_dati( argv[1], &dim );
    Se c risulterà NULL significa che non è stato possibile caricare i dati e buonanotte al secchio; diversamente, in c mi ritroverò un array allocato dinamicamente con i dati sui quali "lavorare" (occorre ricordarsi di deallocare la memoria prima di lasciare il programma).

    Per caricare i dati, la prima cosa che m'è venuto in mente di fare è contare quante sono le righe nel file, perché mi serve quell'informazione per potere allocare la memoria nella quantità necessaria. Per questo ho preparato una funzione int conta_righe_file( const char *nf ); che viene chiamata dalla funzione carica_dati() (in caso d'errore restituisce -1).

    Quando conosco la quantità delle righe, alloco un array di capacità adeguata, quindi (con una funzione carica_riga_file) carico una ad una le righe in formato di testo così da poterle analizzare con comodo per estrarne i dati da inserire in ciascuno degli elementi dell'array.

    Al momento ho pronto il ciclo che estrae le righe una ad una. Torno a giocare, devo preparare la funzione che analizza le righe!
Devi accedere o registrarti per scrivere nel forum
20 risposte