Ошибки в MQL4

 
Я понимаю, что разработка компилятора еще не закончена, но не хотелось бы, чтобы те неприятные ошибки, с которыми я столкнулся попали в окончательную версию.

1. Нельзя инкрементировать переменную в условии:
while (offset < Bars - 1 && Time[offset++] > firstParentTime);


Компилятор сообщает:

'++' - illegal assignment use


Приходится писать:

         while (offset < Bars - 1 && Time[offset] > firstParentTime) {
            offset++;
         }




2. При цепочке условий объединенных логическим AND, даже если предудущее false, следующие все равно проверяются:

while (offset >= 0 && buf[offset][0] < nextPeriodStartTime) {
offset--;
}



При offset == -1, вместо того, чтобы выйти из цикла по невыполнению первого условия, будет выполнена проверка второго условия и произведена попытка обращения к масиву по идексу -1 с понятными последствиями :)

3. Проблемы с выделением памяти под локальные строковые переменные. Всегда возвращается значение первой локальной строковой переменной.

void test()  {
    Print("M5  period name is " + getPeriodName(PERIOD_M5));
}

string getPeriodName(int period)  {
    switch (period) {
        case PERIOD_M1: return ("M1");
        case PERIOD_M5: return ("M5");
        //...
    }
    
    return ("Unknown period " + period);
}



В результате вместо "M5 period name is M5" получается "M5 period name is M5 period name is " :)

 
1. Нельзя инкрементировать переменную в условии:
while (offset < Bars - 1 && Time[offset++] > firstParentTime);


Компилятор сообщает:

'++' - illegal assignment use


это описано на нашей странице "Операции и выражения"
Операции увеличение/уменьшение значения переменной не могут применятся в выражениях.


2. При цепочке условий объединенных логическим AND, даже если предудущее false, следующие все равно проверяются:
while (offset >= 0 && buf[offset][0] < nextPeriodStartTime) {
offset--;
}


описано там же
Логические выражения вычисляются полностью, то есть к ним не применяется схема так называемой короткой оценки.

3. Проблемы с выделением памяти под локальные строковые переменные. Всегда возвращается значение первой локальной строковой переменной.

это будем исправлять. спасибо.
 
Cпасибо за разъяснения. Еще один момент: я попробовал сделать функцию с масивом в качестве аргумента
void test(double flows[], int offset) {
 flows[0] = 10.0;
 flows[1] = 9.88;
}



Но компилятор не пропустил:


'flows' - array item cannot be assigned


Массивы не могут быть аргументами функций?

 
могут. у Вас сработала защита от записи в таймсерию. объявите массив по ссылке
void test(double& flows[], int offset)
 
Спасибо.