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

 
Даже если считать, что в MQL другие правила и кавычки в примере выше обрамляющие, то все равно ошибка, потому что:
#define MACRO(X)        #X
void OnStart()
{
    Print(MACRO("AB\'CD"));
}

Результат: AB\'CD

А при обрамляющих кавычках был бы такой: AB'CD

 

Добрый день

Проверьте пожалуйста правильность работы вот такой конструкции

   for(uint t=0; t>=0; t--)
     {
      Print("t="+IntegerToString(t));
     }

2023.09.05 15:13:15.584 2023.08.01 00:10:00   t=0
2023.09.05 15:13:16.829 2023.08.01 00:10:00   t=4294967295
2023.09.05 15:13:17.784 2023.08.01 00:10:00   t=4294967294
2023.09.05 15:13:18.392 2023.08.01 00:10:00   t=4294967293
2023.09.05 15:13:19.013 2023.08.01 00:10:00   t=4294967292
2023.09.05 15:13:19.690 2023.08.01 00:10:00   t=4294967291
............
 
Alexey Klenov #:

Добрый день

Проверьте пожалуйста правильность работы вот такой конструкции


Беззнаковое целое всегда больше или равно 0
 
Slava #:
Беззнаковое целое всегда больше или равно 0
Да это я понимаю, просто цикл должен был отработать всего один раз и завершиться, а не уходить в "отрицательную зону", по сути в "бесконечность"
 
   for(uint t=5; t>=0; t--)
     {
      Print("t="+IntegerToString(t));
     }
2023.09.05 15:35:09.691 2023.08.01 00:10:00   t=5
2023.09.05 15:35:10.282 2023.08.01 00:10:00   t=4
2023.09.05 15:35:10.710 2023.08.01 00:10:00   t=3
2023.09.05 15:35:11.124 2023.08.01 00:10:00   t=2
2023.09.05 15:35:11.616 2023.08.01 00:10:00   t=1
2023.09.05 15:35:12.111 2023.08.01 00:10:00   t=0
2023.09.05 15:35:12.597 2023.08.01 00:10:00   t=4294967295
2023.09.05 15:35:13.098 2023.08.01 00:10:00   t=4294967294

Возможно так будет понятнее.

Цикл не завершается

Причем это только с типом uint,  int отрабатывает правильно

   for(int t=5; t>=0; t--)
     {
      Print("t="+IntegerToString(t));
     }
   Print("Exit");
2023.09.05 15:38:29.595 2023.08.01 00:10:00   t=5
2023.09.05 15:38:30.168 2023.08.01 00:10:00   t=4
2023.09.05 15:38:30.533 2023.08.01 00:10:00   t=3
2023.09.05 15:38:30.911 2023.08.01 00:10:00   t=2
2023.09.05 15:38:31.364 2023.08.01 00:10:00   t=1
2023.09.05 15:38:31.976 2023.08.01 00:10:00   t=0
2023.09.05 15:38:32.652 2023.08.01 00:10:00   Exit
   for(ulong t=5; t>=0; t--)
     {
      Print("t="+IntegerToString(t));
     }
   Print("Exit");
2023.09.05 15:40:27.948 2023.08.01 00:10:00   t=5
2023.09.05 15:40:28.329 2023.08.01 00:10:00   t=4
2023.09.05 15:40:28.707 2023.08.01 00:10:00   t=3
2023.09.05 15:40:29.122 2023.08.01 00:10:00   t=2
2023.09.05 15:40:29.579 2023.08.01 00:10:00   t=1
2023.09.05 15:40:30.027 2023.08.01 00:10:00   t=0
2023.09.05 15:40:32.237 2023.08.01 00:10:00   t=-1
2023.09.05 15:40:33.774 2023.08.01 00:10:00   t=-2
2023.09.05 15:40:34.520 2023.08.01 00:10:00   t=-3
Тип данных ulong тоже уходит в отрицательную зону, тоесть не завершается цикл. Вывод в журнал к сожалению выводить именно со знаком так как IntegerToString

IntegerToString

Принимает long

 
Alexey Klenov #:
Да это я понимаю, просто цикл должен был отработать всего один раз и завершиться, а не уходить в "отрицательную зону", по сути в "бесконечность"

Если очень важно применить тип uint и такую конструкцию цикла, то можно сделать так

  for(uint t=1; (bool)t--;)
   {
    Print("t="+IntegerToString(t));
   }
 
Alexey Klenov #:
Да это я понимаю, просто цикл должен был отработать всего один раз и завершиться, а не уходить в "отрицательную зону", по сути в "бесконечность"

Почему цикл должен был отработать 1 раз?

Распишите хотя бы 2 итерации

 
Alexey Klenov #:

Возможно так будет понятнее.

Цикл не завершается

Причем это только с типом uint,  int отрабатывает правильно

Тип данных ulong тоже уходит в отрицательную зону, тоесть не завершается цикл. Вывод в журнал к сожалению выводить именно со знаком так как IntegerToString

IntegerToString

Принимает long

У беззнаковых целыл чисел нет "отрицательных зон". Если беззнаковое целое имеет значение "0", то его уменьшение на 1 приведёт не к отрицательному, а к максимальному для данного типа значению.
 
Alexey Klenov #:
Да это я понимаю, просто цикл должен был отработать всего один раз и завершиться, а не уходить в "отрицательную зону", по сути в "бесконечность"

Один раз отработает такой вариант:

  for(uint t = 1; t > 0; t--)
   {
    Print("t=" + IntegerToString(t));
   }
 
Ошибка при выполнении:
struct A {
    A( int i ) : i( i ) { Print( "+", i ); } //создание(+)
    ~A()                { Print( "-", i ); } //удаление(-)
    const int i;
};
void OnStart()
{
    OnStart2();
    static A a3(3);
}
void OnStart2()
{
    static A a1(1);
    static A a2(2);
}
Результат:   +1+2+3-2-1-3 //непонятный порядок
Ожидалось: +1+2+3-3-2-1 //LIFO порядок

Чем то напоминает эту ошибку, но там хотя бы обратный порядок FIFO был, а здесь вообще порядка нет
Причина обращения: