Go Down

Topic: Non compilare parte del codice. (Read 955 times) previous topic - next topic

erpomata

Vorrei sapere se è possibile, ed eventualmente come, non compilare parte di un codice in base a qualcosa da impostare.

Mi spiego meglio, mettiamo che ho questo pezzo di codice:

Code: [Select]

boolean faiFunzioneX = true;

void funzioneX(){
   Serial.println("funzioneX");
}

void loop() // run over and over
{
if (faiFunzioneX)
   funzioneX();
else
   Serial.println("NO funzioneX");
}


Come potete vedere il compilatore eseguirebbe la funzioneX solo se faiFunzioneX è impostato a TRUE ma questo codice viene in ogni caso compilato anche se faiFunzioneX è FALSE. C'è modo di evitare di fare 2 sketch con e senza la funzioneX?

Spero di essere stato chiaro.

Grazie
http://www.paologiammarco.it
http://www.valentinamagni.it

LCzxk

Puoi usare #ifdef, #else, #endif. Se una costante è stata definita tramite il #define compila le operazioni tra #ifdef e #endif. Puoi usare #else per fargli compilare un'altra parte di programma nel caso la costante non sia stata definita.
Il tuo codice diventerebbe:
Code: [Select]

#define faiFunzioneX

void funzioneX(){
   Serial.println("funzioneX");
}

void loop()
{
#ifdef faiFunzioneX
   funzioneX();
#else
   Serial.println("NO funzioneX");
#endif
}

Però in questo caso funzioneX() viene compilata anche se non viene chiamata, quindi devi racchiuderla tra #ifdef e #endif
Code: [Select]

#ifdef faiFunzioneX
void funzioneX(){
   Serial.println("funzioneX");
}
#endif

Se vuoi che fuhzioneX non venga eseguita ti basta mettere // prima di #define faiFunzioneX per trasformarlo in un commento (quindi non viene interpretato dal preprocessore) oppure puoi cancellarlo

lesto

se dichiare faiFunzioneX  come costante, allora il compilatore dovrebbe essere abbastanza intelligente da capire che la funziona non la chiami mai e quindi non compilartela.

è come usagli gli ifdef, ma con il vantaggio che non "sporchi" il codice con istruzioni al precompilatore
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

erpomata

http://www.paologiammarco.it
http://www.valentinamagni.it

astrobeed


se dichiare faiFunzioneX  come costante, allora il compilatore dovrebbe essere abbastanza intelligente da capire che la funziona non la chiami mai e quindi non compilartela.


Non serve a nulla dichiararla come costante, viene sempre compilata, non viene compilata, indipendentemente da come l'ha dichiarata, se la funzione non viene mai chiamata all'interno del programma.
Però la compilazione condizionale esiste proprio per consentire di compilare determinate parti di codice in funzione della dichiarazione di un certo alias, si molto per programmi che devono gestire diverse situazioni hardware che sono installate come opzioni, cioè non è detto che siano presenti, in modo da dire al compilatore quali funzioni utilizzare in funzione della configurazione del sistema.
Un buon esempio dell'uso compilazione condizionale è MultiWii dove ne viene fatto un largo uso per via della varietà di hardware utilizzato e mantenere le dimensioni del programma contenute, inutile compilare funzioni che non servono a nulla perché manca l'hardware che devono gestire.
Diverso è il caso di software che deve gestire varie configurazioni a seconda di un setup utente, tipicamente dei valori posti nella EEPROM, in questo caso le funzioni devono essere tutte presenti e viene scelta quale usare tramite una serie di if/switch in funzione delle opzioni utente.

lesto


Non serve a nulla dichiararla come costante, viene sempre compilata, non viene compilata, indipendentemente da come l'ha dichiarata, se la funzione non viene mai chiamata all'interno del programma.


manca la faccina che si gratta la testa, non ho ben capito l'affermazione.
Se ho capito bene una funzione mai richiamata non viene compilata, quindi se "faiFunzioneX" è sempre a false il compilatore dovrebbe accorgersene e non compilare la funzione no?
mettere "faiFunzioneX"  come costante serve solo per evitare che magari la variabile vega utilizzata da qualche parte come variabile di supporto (o per errore) per poi riportare il valore a false, cosa che potrebbe mandare il "ragionamento" del compilatore in palla.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

PaoloP

Non credo che il compilatore si metta a vedere quale sarà il valore run-time della variabile. Quindi non può sapere se una variabile sarà vera o falsa.
L'affermazione di Astro riguarda il fatto che se tu crei una funzione e poi questa non ha nessun richiamo nel codice viene scartata del compilatore.

erpomata

Bè ma il richiamo alla funzione c'è non penso che il compilatore sta a vedere se c'è una if che non la fa chiamare mai.
http://www.paologiammarco.it
http://www.valentinamagni.it

astrobeed


L'affermazione di Astro riguarda il fatto che se tu crei una funzione e poi questa non ha nessun richiamo nel codice viene scartata del compilatore.


Esatto, puoi mettere nel sorgente 1000 funzioni, ma se non vengono utilizzate dal codice realmente eseguito il compilatore le scarta, cosa logica altrimenti ogni volta che includi una libreria questa verrebbe compilata completamente, con il relativo peso sull'occupazione della flash, invece di venirne compilate solo le parti realmente utilizzate.

astrobeed


Bè ma il richiamo alla funzione c'è non penso che il compilatore sta a vedere se c'è una if che non la fa chiamare mai.


Usa la compilazione condizionale con i relativi #ifdefine, non stare a inventarti cose strane che poi non funzionano e/o rendono illeggibile il programma.

erpomata

http://www.paologiammarco.it
http://www.valentinamagni.it

Go Up