[Risolto] Dubbio programmazione modulare in C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Dr_Bass
Prode Principiante
Messaggi: 47
Iscrizione: martedì 28 febbraio 2017, 17:56
Desktop: GNOME 3.28.2
Distribuzione: Ubuntu 18.04.4 LTS x86_64
Sesso: Maschile

[Risolto] Dubbio programmazione modulare in C

Messaggio da Dr_Bass »

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, 22:49, modificato 1 volta in totale.
Avatar utente
telperion
Rampante Reduce
Rampante Reduce
Messaggi: 5407
Iscrizione: lunedì 10 luglio 2006, 18:20

Re: Dubbio programmazione modulare in C

Messaggio da telperion »

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
Dr_Bass
Prode Principiante
Messaggi: 47
Iscrizione: martedì 28 febbraio 2017, 17:56
Desktop: GNOME 3.28.2
Distribuzione: Ubuntu 18.04.4 LTS x86_64
Sesso: Maschile

Re: Dubbio programmazione modulare in C

Messaggio da Dr_Bass »

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
telperion
Rampante Reduce
Rampante Reduce
Messaggi: 5407
Iscrizione: lunedì 10 luglio 2006, 18:20

Re: Dubbio programmazione modulare in C

Messaggio da telperion »

Dr_Bass [url=http://forum.ubuntu-it.org/viewtopic.php?p=4965289#p4965289][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] 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
Dr_Bass
Prode Principiante
Messaggi: 47
Iscrizione: martedì 28 febbraio 2017, 17:56
Desktop: GNOME 3.28.2
Distribuzione: Ubuntu 18.04.4 LTS x86_64
Sesso: Maschile

Re: Dubbio programmazione modulare in C

Messaggio da Dr_Bass »

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.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 15 ospiti