Serial.println("stringa") non funziona se interna a void

Sto usando un Arduino Mega 2560 con IDE 2.1.0.
Chiedo se è normale che quando richiamo una funzione void al cui interno si trova una istruzione Serial.println quest'ultima non venga eseguita, vedi il semplice sketch:

void setup() 
{
  Serial.begin(2400);
}

void loop() {
  Serial.println("Loop1");
  accetta;
  }

void accetta()
{  
 Serial.println("Funzione accetta  ");
}

sul Serial Monitor mi compare solo:
Loop1
Loop1
Loop1
........
E' un comportamento documentato o sbaglio qualcosa ?

Benvenuto, tandem_admin!
Presentati nella discussione delle presentazioni
https://forum.arduino.cc/t/re-presentazioni-nuovi-iscritti-fatevi-conoscere-da-tutti-part-2/1018420/10000
e leggi il regolamento, che poi te lo dico! :slight_smile:

Grazie della risposta DATman, e soprattutto del link.
Ho fatto la presentazione ma in quanto al regolamento che vedo citato in molti messaggi di altri iscritti , anche se ho capito che ha almeno 15 punti, lo leggerei volentieri ma non riesco a trovarlo.

Ooops... forse è questo :
[REGOLAMENTO] Come usare questa sezione del forum ?

Sì, è quello, compresa la parte di gpb01, Guglielmo.

Quando chiami una funzione, devi mettere le parentesi, che possono contenere dei parametri se la funzione li richiede.

Mi sono svegliato... Provo a continuare a dormire! :sleeping:

Aaargh!... un vero errore da pivello.
Grazie Guglielmo !

Essendo un principiante su questo linguaggio mi fidavo del compilatore per la segnalazione di eventuali sciocchezze.

Purtroppo nelle preferenze della IDE avevo lasciato il default come livello di segnalazione dei warning.
Adesso ho impostato "Tutti" e in effetti ora il compilatore avvisa che il codice ha un problema:

C:\..........\prova\prova.ino: In function 'void loop()':
C:\.........\prova\prova.ino:14:10: warning: statement is a reference, not call, to function 'accetta' [-Waddress]
   accetta;
          ^
C:\..........\prova\prova.ino:14:10: warning: statement has no effect [-Wunused-value]

Adesso però dovrò andarmi a studiare la differenza tra una reference e una call a una funzione :upside_down_face:

gpb01 è Guglielmo!

Gianluca

Un potenziale problema. Infatti, con o senza i warning abilitati, la compilazione va a buon fine, non ci sono errori sintattici e il codice è perfettamente eseguibile.

In questo specifico caso il problema c'era, ma per un errore di semantica, cioè credere che una certa istruzione faccia qualcosa mentre in realtà fa altro.

Il fatto è che nel linguaggio ci sono le "cose", e ci sono i riferimenti alle cose, banalmente gli indirizzi di memoria dove si trovano le cose. Di questi indirizzi normalmente non c'è bisogno di occuparsi, ma se serve si gestiscono tramite puntatori.

Sintatticamente un nome di funzione senza parentesi di chiamata indica il riferimento alla funzione, che in alcuni casi specifici e non terra terra può essere salvato in un puntatore per richiamare la funzione in modo indiretto.

Ad esempio potremmo avere un array di puntatori a funzione per chiamare una funzione specifica in modo indiretto tramite un indice:

arrayRiferimenti[indice]();
2 Likes

Grazie anche a Claudio per l'ulteriore chiarimento.

Per incoraggiarti ti posso assicurare che dal C/C++ puoi aspettarti di mooolto peggio che questo banale errore.
Quindi non prenderlo sotto gamba, anzi consideralo come il linguaggio
più bastardo che ci sia e che si prende gioco principalmente del principiante, ma ottiene buoni risultati anche con il programmatore maturo, che finisce per prendere fischi per fiaschi.
:crazy_face:

Ciao beeeeenvenuto a bordo.

1 Like

:rofl: :rofl: :rofl:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.