Erros, bugs, perguntas - página 2641

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

void OnStart()
{
  Func();
}

Existe um tal conselheiro. Lança um erro

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

Se continuar a comentar, tudo bem. Serei eu o único que pensa que isto é esquisito?

 
traveller00:

Existe um tal conselheiro. Lança um erro

Se continuar a comentar, tudo bem. Serei eu o único que pensa que é estranho?

Se uma função não for declarada como nula, deve devolver um valor:

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
  //---
  return(false);
}
 
A única saída desta função é através de i==100. Porque pensa ele que a aparência de continuação resulta numa saída adicional da função?
 
traveller00:
A única forma de sair desta função é através de i==100. Porque pensa ele que a aparência de continuar leva a uma saída adicional da função?

A produção única ou múltipla não é importante. O importante é que VOCÊ declarou uma função com um tipo diferente de vazio - o que significa que a função DEVE devolver um valor.

 

A função e devolve um valor

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

Esta é a única forma de sair da função. Ou seja, o único local onde tem de devolver um valor. E o compilador C/C++ concorda comigo. Se a MQL ainda tem as suas próprias normas sobre isto, porque é que constrói normalmente se a continuação é removida?

 
traveller00:

A função e devolve um valor

Esta é a única forma de sair da função. Ou seja, o único local onde tem de devolver um valor. E o compilador C/C++ concorda comigo. Se a MQL ainda tem as suas próprias normas sobre isto, porque é que constrói normalmente se a continuação é removida?

O compilador não sabe se o laço será processado e se o código chegará ao retorno; portanto, requer uma característica de segurança.

 
Alexey Viktorov:

O compilador não sabe se o laço será processado e se a execução do código chegará ao retorno; é por isso que requer uma precaução de segurança.

O compilador C/C++ sabe isto perfeitamente bem. O compilador MQL é baseado num dos compiladores C/C++, tal como eu o entendo. Mas também, mesmo que tenha a sua própria lógica, porque é que sabe sem continuar, mas com continuar este conhecimento desaparece?

 
traveller00:

O compilador C/C++ sabe isto perfeitamente bem. O compilador MQL é baseado num dos compiladores C/C++, tal como eu o entendo. Mas também, mesmo que tenha a sua própria lógica, porque é que sabe sem continuar, mas com continuar este conhecimento desaparece?

Provavelmente porque apenas uma pessoa à primeira vista olha para tal código

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==100)
      continue;
    if(i==100)
      return false;
  }
}
pode descobrir o que vai acontecer sem pensar. Na minha opinião, deveria ser C e C++, e não MQL. É o mql que protege contra tais erros acidentais.
 
traveller00:

A função e devolve um valor

Esta é a única forma de sair da função. Ou seja, o único local onde tem de devolver um valor. E o compilador C/C++ concorda comigo. Se a MQL ainda tem as suas próprias normas a este respeito, porque é que constrói normalmente se a continuação é removida?

Esta sua função é um insecto. Se i===100, a próxima verificação para o mesmo i===100 não irá funcionar. E terá um loop infinito.

 
Caros programadores, por favor assinalem o erro.
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
  • 2018.06.10
  • www.mql5.com
Опубликована статья Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II): Автор: Anatoli Kazharski...