Т.е. этот нормальный компилятор вот это пропустит? Вы, как я понял, им пользуетесь? Как отработает эта прога, если введёте с консоли минус 5?
Что-то вы не то говорите. Если компилятор и допускает переменную в качестве размера массива, то он хотя бы должен проверить её тип, чтобы она была целочисленной и беззнаковой, не?
Как отработает эта прога, если введёте с консоли минус 5?
Возьмёт ascii код символа '-' и создаст массив с таким количеством элементов. Но вы о другом, вероятно: "что если размер массива отрицательный?". А кто кроме вас узнает, что он отрицательный? Массив ждёт unsigned, вот и будет работать как с положительным. Защита от дурака - от не о С/С++, программист должен быть думающим, а если нужна защита, то делайте её сами.
Т.е. если переменная отрицательна, то берётся её модуль? Брр... Как говорится, happy debugging! ))
Про отрицательный остаток не понял.
voidOnStart()
{
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: Не будет, если массив не нулевой. Не понимаете - зачем хаять?
Да не хаю я. И всё там понятно. Просто если у массива размером 7 по ошибке обращаемся к индексу -2, а прога спокойно возвращает содержимое 5-го элемента и продолжает работать, то где этот баг потом вылезет и как его потом фиксить совсем в другом месте кода... Одно дело, если вы специально пишете этот код (для кольцевого буфера, например) - тогда вы знаете, что делаете. А вот когда у обычных массивов на уровне компилятора нет контроля при создании, это уже дыра.
Т.е. если переменная отрицательна, то берётся её модуль? Брр... Как говорится, happy debugging! ))
Про отрицательный остаток не понял.
Т.е. этот нормальный компилятор вот это пропустит? Вы, как я понял, им пользуетесь? Как отработает эта прога, если введёте с консоли минус 5?
Что-то вы не то говорите. Если компилятор и допускает переменную в качестве размера массива, то он хотя бы должен проверить её тип, чтобы она была целочисленной и беззнаковой, не?Как отработает эта прога, если введёте с консоли минус 5?
Т.е. если переменная отрицательна, то берётся её модуль? Брр... Как говорится, happy debugging! ))
Про отрицательный остаток не понял.
Но вы о другом, вероятно: "что если размер массива отрицательный?". А кто кроме вас узнает, что он отрицательный?
Да, именно. Вот в моём примере никто не знает, каким он будет. И программист - тоже. Понятно, что программист в этом примере должен объявить "а" как unsigned int, но странно, что компилятор такое пропускает.
Но за расширение кругозора спасибо.
// При любом индексе (и не целочисленном) ВСЕГДА (кроме нуля - если размер массива ноль) будет выполняться без ошибок.Это компилироваться будет без ошибок. А вот выполняться может с ой какими логическими ошибками. И поди их вылови.
Это компилироваться будет без ошибок. А вот выполняться может с ой какими логическими ошибками. И поди их вылови.
Не будет, если массив не нулевой. Не понимаете - зачем хаять?
А вот когда у обычных массивов на уровне компилятор нет контроля при создании, это уже дыра.
Не понял.
https://www.mql5.com/ru/forum/95351/page3#comment_2819563
https://www.mql5.com/ru/forum/95351/page3#comment_2819563