[Risolto] Dubbio programmazione modulare in C

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[Risolto] Dubbio programmazione modulare in C

Messaggioda Dr_Bass » venerdì 10 marzo 2017, 16:34

Salve a tutti.
Per esercitarmi, ho scritto un programma che usa delle funzioni di ordinamento degli array (bubblesort, insertion sort...): le funzioni le ho scritte nel file func.c e il loro prototipo in array.h; quando vado a compilare, gcc mi da questo errore:
Codice: Seleziona tutto
alessandro@lenovo:~/Scrivania/progetto$ gcc main.c func.c -o progetto.out
main.c: In function ‘main’:
main.c:10:8: warning: implicit declaration of function ‘time’ [-Wimplicit-function-declaration]
  srand(time(NULL));
        ^
func.c: In function ‘bubble’:
func.c:48:10: warning: implicit declaration of function ‘ordinato’ [-Wimplicit-function-declaration]
  while (!ordinato(array,lim))
          ^
func.c: At top level:
func.c:64:16: error: conflicting types for ‘ordinato’
 unsigned short ordinato(int *array,int lim)
                ^
func.c:48:10: note: previous implicit declaration of ‘ordinato’ was here
  while (!ordinato(array,lim))
          ^


Il compilatore non mi da errore se scambio così di posizione le due funzioni:
Codice: Seleziona tutto
unsigned short ordinato(int *array,int lim)
{
   int i;
   for(i=0;i<lim-1;i++)
   {
      if (array[i]>array[i+1])
         return 0;
   }
   return 1;
}

void bubble(int *array,int lim)
{
   int i, T;
   while (!ordinato(array,lim))
   {
      for(i=0;i<lim-1;i++)
      {
         if (array[i]>array[i+1])
         {
            T = array[i];
            array[i] = array[i+1];
            array[i+1] = T;
         }
      }
   }
}


Vorrei sapere perché gcc mi da errore se scrivo prima la funzione bubble e poi la funzione ordinato?
Ciò non accade se dichiaro le due funzioni nello stesso file della main.
Ultima modifica di Dr_Bass il venerdì 10 marzo 2017, 23:49, modificato 1 volta in totale.
Avatar utente
Dr_Bass
Prode Principiante
 
Messaggi: 24
Iscrizione: febbraio 2017
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile

Re: Dubbio programmazione modulare in C

Messaggioda telperion » venerdì 10 marzo 2017, 17:32

il compilatore legge dall'inizio, se trova qualcosa che non è definito, nel suo piccolo s'incazza.
Devi dichiarare il prototipo prima se la metti dopo il main.
Qualcosa tipo

Codice: Seleziona tutto
    unsigned short ordinato(int *array,int lim);

    void bubble(int *array,int lim)
    {
       int i, T;
       while (!ordinato(array,lim))
       {
          for(i=0;i<lim-1;i++)
          {
             if (array[i]>array[i+1])
             {
                T = array[i];
                array[i] = array[i+1];
                array[i+1] = T;
             }
          }
       }
    }

   unsigned short ordinato(int *array,int lim)
    {
       int i;
       for(i=0;i<lim-1;i++)
       {
          if (array[i]>array[i+1])
             return 0;
       }
       return 1;
    }


se non ricordo male (ormai uso solo python)

https://en.wikipedia.org/wiki/Function_prototype
Avatar utente
telperion
Rampante Reduce
Rampante Reduce
 
Messaggi: 5205
Iscrizione: luglio 2006

Re: Dubbio programmazione modulare in C

Messaggioda Dr_Bass » venerdì 10 marzo 2017, 23:08

Quando scrivo codice in un solo file, metto sempre tutti i prototipi delle funzioni prima della main e infatti non ho problemi.
Il problema è che, ora che sto iniziando a programmare con i moduli, i prototipi delle funzioni li metto nell'header file (che poi includo in main.c) e le definizioni delle funzioni in func.c (come mi ha detto il mio prof di programmazione). Visto che in func.c non ci stanno i prototipi, ci sta un modo (oltre quello di scambiare di posizione bubble e ordinato) per evitare che il compilatore mi dia errore di conflitto?
Avatar utente
Dr_Bass
Prode Principiante
 
Messaggi: 24
Iscrizione: febbraio 2017
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile

Re: Dubbio programmazione modulare in C

Messaggioda telperion » venerdì 10 marzo 2017, 23:37

Dr_Bass Immagine ha scritto:Quando scrivo codice in un solo file, metto sempre tutti i prototipi delle funzioni prima della main e infatti non ho problemi.
Il problema è che, ora che sto iniziando a programmare con i moduli, i prototipi delle funzioni li metto nell'header file (che poi includo in main.c) e le definizioni delle funzioni in func.c (come mi ha detto il mio prof di programmazione). Visto che in func.c non ci stanno i prototipi, ci sta un modo (oltre quello di scambiare di posizione bubble e ordinato) per evitare che il compilatore mi dia errore di conflitto?


e ma allora func.h lo devi includere anche in func.c (almeno cosi mi pare)
Avatar utente
telperion
Rampante Reduce
Rampante Reduce
 
Messaggi: 5205
Iscrizione: luglio 2006

Re: Dubbio programmazione modulare in C

Messaggioda Dr_Bass » venerdì 10 marzo 2017, 23:48

Ho incluso l'header file (array.h) in func.c come mi hai detto tu e ha funzionato :D
gcc non mi ha dato errori.
Grazie mille per l'aiuto :D
P.S. Ora metto [Risolto] alla domanda.
Avatar utente
Dr_Bass
Prode Principiante
 
Messaggi: 24
Iscrizione: febbraio 2017
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 4 ospiti