Ошибки, баги, вопросы - страница 3317

Ошибка при выполнении:
int i1 = 0; int f1( int i ) { i1++; return 0; }
int i2 = 0; int f2( int i ) { i2++; return i; }
void OnStart()
{
    int i = 3;
    do
        while(f1(i--));
    while(f2(i--));
    printf("%d:%d",i1,i2);
}
Результат:    1:3
Ожидалось:  2:2
A100 #:
Ошибка при выполнении:
Результат:    1:3
Ожидалось:  2:2

Вроде, правильно с результатом.

fxsaber #:

Вроде, правильно с результатом.

Да?! А почему тогда в C\С++ другой результат? Уже простейший пример не можете разобрать. Заменил Print на printf для желающих проверить

Для тех, кто не понял суть ошибки в предыдущем - еще проще пример:
void OnStart()
{
    do
        while( 0 ) {} //Error: '{' - semicolon expected
    while( 0 );
}
A100 #:
Ошибка при выполнении:
Результат:    1:3
Ожидалось:  2:2
Очевидно, MQL связал первый while с предшествующим do.
Очень странное поведение компилятора.
A100 #:
Для тех, кто не понял суть ошибки в предыдущем - еще проще пример:
Да уж.
A100 #:

Да?! А почему тогда в C\С++ другой результат? Уже простейший пример не можете разобрать.

Какой-то эмоциональный высер.


Вы это:

void OnStart()
{
  do
  while(0);
  
  while(0);
}


Приравниваете к этому:

void OnStart()
{
  do
  {
    while(0);
  }  
  while(0);
}


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

A100, 2023.05.22 09:58

Для тех, кто не понял суть ошибки в предыдущем - еще проще пример:
void OnStart()
{
    do
        while( 0 ) {} //Error: '{' - semicolon expected
    while( 0 );
}

Здесь ошибка. С предыдущим связь спорна.


ЗЫ На тему макросов вспомнился хороший комментарий.

Forum on trading, automated trading systems and testing trading strategies

Libraries: Benchmark

amrali, 2023.04.24 17:50

Using do{} while loop allows you to treat a function-like macro that has many lines as a single statement which can be terminated by semicolon. Using brackets only gives logical errors if inside nested if/else or switch() case constructs. 

If using brackets alone, you should be aware of the errors due to semicolons.

See https://stackoverflow.com/questions/154136/why-use-apparently-meaningless-do-while-and-if-else-statements-in-macros

Саб, надо успокоиться, мы все любим тебя и надо чтобы так и оставалось
fxsaber #:


Вы это:


Приравниваете к этому:



Конструкция цикла do while подразумевает наличие тела. 
Sergey Gridnev #:
Конструкция цикла do while подразумевает наличие тела. 

Тогда почему не перейти к сути?

void OnStart()
{
  do
  while(0); // Компилируется, когда не должен.    
}