Объявление массива на языке MQL4 - не получается задать количество элементов, передавая значение переменной (и даже константы). - страница 3

 

Т.е. если переменная отрицательна, то берётся её модуль? Брр... Как говорится, happy debugging! ))

Про отрицательный остаток не понял.  

 
Sergei Vladimirov:

Т.е. этот нормальный компилятор вот это пропустит? Вы, как я понял, им пользуетесь? Как отработает эта прога, если введёте с консоли минус 5?

Что-то вы не то говорите. Если компилятор и допускает переменную в качестве размера массива, то он хотя бы должен проверить её тип, чтобы она была целочисленной и беззнаковой, не?
А какие проблемы с целочисленным типом char?


Как отработает эта прога, если введёте с консоли минус 5?

Возьмёт ascii код символа '-' и создаст массив с таким количеством элементов. Но вы о другом, вероятно: "что если размер массива отрицательный?". А кто кроме вас узнает, что он отрицательный? Массив ждёт unsigned, вот и будет работать как с положительным. Защита от дурака - от не о С/С++, программист должен быть думающим, а если нужна защита, то делайте её сами.
 
Sergei Vladimirov:

Т.е. если переменная отрицательна, то берётся её модуль? Брр... Как говорится, happy debugging! ))

Про отрицательный остаток не понял.  

void OnStart()
{
  double Index = -345.23;
  double Size = -432.98;
  
  double Array[];
    
  // При любом размере (и не целочисленном) будет работать
  ArrayResize(Array, (int)Size < 0 ? (int)MathAbs(Size) : (int)Size);
  
// При любом индексе (и не целочисленном) ВСЕГДА (кроме нуля - если размер массива ноль) будет выполняться без ошибок.
// Таким образом массив становится бесконечной копией самого себя в обе стороны
  Array[(int)Index < 0 ? ArraySize(Array) + ((int)Index % ArraySize(Array)) : (int)Index % ArraySize(Array)] = 1;
}
 
pavlick_:
Но вы о другом, вероятно: "что если размер массива отрицательный?". А кто кроме вас узнает, что он отрицательный?

Да, именно. Вот в моём примере никто не знает, каким он будет. И программист - тоже. Понятно, что программист в этом примере должен объявить "а" как unsigned int, но странно, что компилятор такое пропускает.

Но за расширение кругозора спасибо. 

 
fxsaber:
// При любом индексе (и не целочисленном) ВСЕГДА (кроме нуля - если размер массива ноль) будет выполняться без ошибок.

Это компилироваться будет без ошибок. А вот выполняться может с ой какими логическими ошибками. И поди их вылови.

 
Sergei Vladimirov:

Это компилироваться будет без ошибок. А вот выполняться может с ой какими логическими ошибками. И поди их вылови.

Не будет с размером никогда проблем. С индексом - только если массив нулевой. Но в таком случае и обычный подход выдаст ошибку.
 
fxsaber:
Не будет, если массив не нулевой. Не понимаете - зачем хаять?
Да не хаю я. И всё там понятно. Просто если у массива размером 7 по ошибке обращаемся к индексу -2, а прога спокойно возвращает содержимое 5-го элемента и продолжает работать, то где этот баг потом вылезет и как его потом фиксить совсем в другом месте кода... Одно дело, если вы специально пишете этот код (для кольцевого буфера, например) - тогда вы знаете, что делаете. А вот когда у обычных массивов на уровне компилятора нет контроля при создании, это уже дыра.
 
Sergei Vladimirov:
А вот когда у обычных массивов на уровне компилятор нет контроля при создании, это уже дыра.
Не понял.
 
Объявление массива на языке MQL4 - не получается задать количество элементов, передавая значение переменной (и даже константы).
Объявление массива на языке MQL4 - не получается задать количество элементов, передавая значение переменной (и даже константы).
  • отзывов: 3
  • www.mql5.com
Почему-то, при объявлении массива следующим образом: Появляется ошибка: '[' - invalid index value Хотя, на C++ этот код нормально компилируется и...
 
Не увидел проблем, от слова совсем. Но не будем терять время на обсуждение пустого.