Pages: [1]   Go Down
Author Topic: Non compilare parte del codice.  (Read 877 times)
0 Members and 1 Guest are viewing this topic.
Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
Logged


Mantova
Offline Offline
Jr. Member
**
Karma: 2
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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:
#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
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

proverò
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9687
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7188
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9687
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9687
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quoto
Logged


Pages: [1]   Go Up
Jump to: