dichiarare una funzione

mi ricordo che sul C++ per dichiarare una funzione esterna al main si faceva così:

int funzione();

void main()
{
  int a = funzione();
}

int funzione()
{
   return 5;
}

è necessario dichiarare la funzione anche sull'IDE di arduino in questo modo?

int funzione();
int i;

void setup()
{
     i = 0;
}

void loop()
{
    int a = funzione();
    i++
}

int funzione()
{
    return i;
}

plrmntonio: mi ricordo che sul C++ per dichiarare una funzione esterna al main si faceva così:

La dichiarazione della funzione va fatta prima del main(), quindi a seconda dello stile di scrittura o si utilizza un file .h dedicato, contenente solo le dichiarazione e incluso nel programma assieme alle varie dichiarazioni generali, oppure si scrivono le funzioni prima della main. Personalmente preferisco la notazione con la main(), loop() nel caso di Arduino, come prima funzione del listato con a seguire tutte le altre funzioni con l'utilizzo del file .h per la dichiarazione dei prototipi delle funzioni, trovo che in questo modo il sorgente sia più ordinato e leggibile, però è una cosa soggettiva e non un obbligo.

se non erro la dichiarazione della funzione pre-main ora non è più necessaria, non so se per standar o parametro al compilatore

appena testato questo sketch

int i;
int funzione();

void setup()
{
  i=0;
}


void loop()
{
  int a = funzione();
  i++;
}

int funzione()
{
  return i;
}

e questo sketch

int i;

void setup()
{
  i=0;
}


void loop()
{
  int a = funzione();
  i++;
}

int funzione()
{
  return i;
}

entrambi compilati danno 492byte presumo che il compilatore inserisca implicitamente la dichiarazione di quella funzione

Non so cosa faccia la nuova versione dell'ide, ma in generale è una questione di visibilità. Se richiami una funzione alla quale non c'è un riferimento "prima" nel codice (quindi o prototipo della funzione o la funzione stessa) dovrebbe ritornare errore, ma ripeto non so come funzioni esattamente il nuovo ide. Ciao G

GWolf: Non so cosa faccia la nuova versione dell'ide, ma in generale è una questione di visibilità. Se richiami una funzione alla quale non c'è un riferimento "prima" nel codice (quindi o prototipo della funzione o la funzione stessa) dovrebbe ritornare errore, ma ripeto non so come funzioni esattamente il nuovo ide. Ciao G

Non sono d'accordo. Il C non è un interprete, è un compilatore. Va a cercare la funzione in tutto il codice e nei file #include. Se non la trova restituisce errore. Il "prima" che indichi tu vale solo per le direttive del compilatore (#define e #include) che devono essere messe in cima al listato.

Anche sulla 0022 la compilazione di questo sketch non dà errori. Uno sketch non è il file main del programma finale, lo sketch è solo una specie di funzione inclusa nel file main del firmware che verrà compilato.Quindi mettere una funzione prima o dopo la coppia setup/loop è indifferente secondo me perché voi tutto viene incluso nell'altro file.

vero, probabilmente l'ide aggancia il main "in coda" a tutto il resto del .pde (o .ino)

PaoloP:

GWolf: Non so cosa faccia la nuova versione dell'ide, ma in generale è una questione di visibilità. Se richiami una funzione alla quale non c'è un riferimento "prima" nel codice (quindi o prototipo della funzione o la funzione stessa) dovrebbe ritornare errore, ma ripeto non so come funzioni esattamente il nuovo ide. Ciao G

Non sono d'accordo. Il C non è un interprete, è un compilatore. Va a cercare la funzione in tutto il codice e nei file #include. Se non la trova restituisce errore. Il "prima" che indichi tu vale solo per le direttive del compilatore (#define e #include) che devono essere messe in cima al listato.

guarda qui http://bytes.com/topic/c/answers/517784-implicit-declaration

Considera che ad esempio nei test che ho fatto per verificare, se non c'è un prototipo prima mi ritorna un warning, poi magari il codice viene eseguito correttamente, ma il compilatore (parliamo di linguaggio C) se ne accorge, se chiami una funzione che non è dichiarata prima come prototipo o che non è stata implementata prima della chiamata. Per cui penso sia corretto, dichiarare sempre prima i prototipi, anche se ripeto, non so come lavori il compilatore di arduino.