Errori, bug, domande - pagina 2641

 
bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
}

void OnStart()
{
  Func();
}

Esiste un tale consigliere. Lancia un errore

'}' - not all control paths return a value      Test.mq5        10      1

Se commentate in continuazione, va bene. Sono l'unico che pensa che questo sia strano?

 
traveller00:

Esiste un tale consigliere. Lancia un errore

Se commentate in continuazione, va bene. Sono l'unico che pensa che sia strano?

Se una funzione non è dichiarata come nulla, deve restituire un valore:

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
  //---
  return(false);
}
 
L'unica uscita da questa funzione è attraverso i==100. Perché pensa che l'apparizione di continue comporti un'uscita supplementare dalla funzione?
 
traveller00:
L'unico modo per uscire da questa funzione è attraverso i==100. Perché pensa che l'apparizione di continue porti a un'ulteriore uscita dalla funzione?

L'uscita singola o multipla non è importante. L'importante è che TU abbia dichiarato una funzione con un tipo diverso da void - il che significa che la funzione DEVE restituire un valore.

 

La funzione e restituisce un valore

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
}

Questo è l'unico modo per uscire dalla funzione. Cioè, l'unico posto dove deve restituire un valore. E il compilatore C/C++ è d'accordo con me. Se MQL ha ancora i suoi standard su questo, perché costruisce normalmente se continua viene rimosso?

 
traveller00:

La funzione e restituisce un valore

Questa è l'unica uscita dalla funzione. Cioè, l'unico posto dove deve restituire un valore. E il compilatore C/C++ è d'accordo con me. Se MQL ha ancora i suoi standard su questo, perché costruisce normalmente se continua viene rimosso?

Il compilatore non sa se il ciclo sarà elaborato e se il codice raggiungerà il ritorno; pertanto, richiede una funzione di sicurezza.

 
Alexey Viktorov:

Il compilatore non sa se il ciclo sarà processato e se l'esecuzione del codice raggiungerà il ritorno; ecco perché richiede una precauzione di sicurezza.

Il compilatore C/C++ lo sa perfettamente. Il compilatore MQL è basato su uno dei compilatori C/C++, come ho capito. Ma d'altra parte, anche se ha una sua logica, perché sa senza continuare, ma con il continuare questa conoscenza non c'è più?

 
traveller00:

Il compilatore C/C++ lo sa perfettamente. Il compilatore MQL è basato su uno dei compilatori C/C++, come ho capito. Ma d'altra parte, anche se ha una sua logica, perché sa senza continuare, ma con il continuare questa conoscenza non c'è più?

Probabilmente perché solo una persona a prima vista guarda tale codice

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==100)
      continue;
    if(i==100)
      return false;
  }
}
può capire cosa succederà senza pensare. Secondo me, dovrebbe essere C e C++, non MQL. È mql che protegge da questi errori accidentali.
 
traveller00:

La funzione e restituisce un valore

Questo è l'unico modo per uscire dalla funzione. Cioè, l'unico posto dove deve restituire un valore. E il compilatore C/C++ è d'accordo con me. Se MQL ha ancora i suoi standard a questo proposito, perché si costruisce normalmente se il continuo viene rimosso?

Questa vostra funzione è un bug. Se i==100, il prossimo controllo per lo stesso i==100 non funzionerà. E otterrete un ciclo infinito.

 
Cari sviluppatori, per favore segnalate l'errore.
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
  • 2018.06.10
  • www.mql5.com
Опубликована статья Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II): Автор: Anatoli Kazharski...