MqlRates mrate[] = {0}; //структура для хранения информации о ценах, объемах и спреде.
Попробуем разобраться. Насколько я помню, Ренат говорил про инициализацию простой переменной, а не массива. С боями подобные примеры появились в Справочнике:
//--- инициализация всех полей структуры нулевым значениемMqlTradeRequest request={0};
У Вас же предпринимается попытка проинициализировать при объявлении массив, а не простую переменную. На этот счёт нашёл в Справочнике вот такой пример:
double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 };
Если размер инициализируемого массива не указан, то он
определяется компилятором, исходя из размера инициализирующей последовательности.
Здесь массив инициализируется конечным числом значений, и, судя по пояснению, компилятор определяет размер такого массива исходя именно из количества этих значений. Проверять лень - скорее всего, размер массива f[] из примера будет равен 6.
В Вашем примере размер инициализирующей последовательности {0} равен 1. Соответственно, компилятор, скорее всего, и определяет размер массива mrate[] как 1. Вот, ради интереса, укажите так:
MqlRates mrate[] = {0,0,0,0,0,0,0,0,0,0,0,0}; //структура для хранения информации о ценах, объемах и спреде.
papaklass: Я перепутал. Swan четко объяснил. Я взял не ту структуру. Ее вообще не нужно инициализировать, т.к. она принимает значения. Нужно инициализировать те, которые отдают свои значения. Я был не прав.
Ну, главное разобрались. Сам по себе вопрос про Рената оказался интересным, так что и я кое в чём разобрался.
double f[] - сам по себе динамический массив. Именно он объявляется при создании. Перестаёт ли он быть динамическим после инициализации конечной инициализирующей последовательностью - не исследовал. Главное, что выяснили выше, - это то, что после инициализации объявленный массив обретает конкретный размер.
Вы хотите сказать, что динамический массив в результате явной инициализации перестаёт быть динамическим, т.е. теряет статус и свойства динамического? - Может, и так. Но сомневаюсь. Вопрос: на каком основании (почему) динамический массив double f[] перестаёт быть оным?
double f[] - сам по себе динамический массив. Именно он объявляется при создании. Перестаёт ли он быть динамическим после инициализации конечной инициализирующей последовательностью - не исследовал. Главное, что выяснили выше, - это то, что после инициализации объявленный массив обретает конкретный размер.
Вы хотите сказать, что динамический массив в результате явной инициализации перестаёт быть динамическим, т.е. теряет статус и свойства динамического? - Может, и так. Тогда вопрос: почему?
Все дело в том что мы в МКЛ немного "изолированы" от реальных дел )), за нас в такой ситуации решает компилятор. Если видит:
double f[5];
double f[] = {0, 1, 3};
создает статический масив (без возможности изменять размер). Если видит:
double f[];
создает структуру struct MqlArrayObject (она и ведет себя как динамический массив), в глобальной памяти. Поэтому нельзя инициализировать массив после объявления ( double f[]; f = {6};)
P.S: все написанное мое ИМХО, могу где-то ошибаться.
Вопрос от чайника: действительно ли, что если компилятор видит строчку
double f[] = {0, 1, 3};
то изначально создаётся не динамический, а статический массив?
Есть же правило: "При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную структуры struct MqlArrayObject (объект динамического массива) и обеспечивает код для правильной инициализации". Или наличие конечной инициализирующей последовательности приравнивается к "явному указанию всех значимых размерностей массива" и приводит к созданию статического массива?
Вопрос от чайника: действительно ли, что если компилятор видит строчку
то изначально создаётся не динамический, а статический массив?
Есть же правило: "При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную структуры struct MqlArrayObject (объект динамического массива) и обеспечивает код для правильной инициализации". Или наличие конечной инициализирующей последовательности приравнивается к "явному указанию всех значимых размерностей массива" и приводит к созданию статического массива?
На текущий момент слабо. До терминала доберусь только вечером. В противном случае мой ответ для 220Volt звучал бы по-другому, как Вы понимаете :) В Справочнике информацию не нашёл. Может, плохо искал, но дотошно.
Yedelkin: На текущий момент слабо. До терминала доберусь только вечером. В противном случае мой ответ для 220Volt звучал бы по-другому, как Вы понимаете :) В Справочнике информацию не нашёл. Может, плохо искал, но дотошно.
MqlRates mrate[];//массив нулевого размераArrayResize и ArrayInitialize используйте. непонятно, правда для чего.
обычно с CopyRates эта структура используется.
Renat говорил, что лучше делать вот так:
Попробуем разобраться. Насколько я помню, Ренат говорил про инициализацию простой переменной, а не массива. С боями подобные примеры появились в Справочнике:
У Вас же предпринимается попытка проинициализировать при объявлении массив, а не простую переменную. На этот счёт нашёл в Справочнике вот такой пример:
Здесь массив инициализируется конечным числом значений, и, судя по пояснению, компилятор определяет размер такого массива исходя именно из количества этих значений. Проверять лень - скорее всего, размер массива f[] из примера будет равен 6.
В Вашем примере размер инициализирующей последовательности {0} равен 1. Соответственно, компилятор, скорее всего, и определяет размер массива mrate[] как 1. Вот, ради интереса, укажите так:
Будет выдавать ошибку?Я перепутал. Swan четко объяснил. Я взял не ту структуру. Ее вообще не нужно инициализировать, т.к. она принимает значения. Нужно инициализировать те, которые отдают свои значения. Я был не прав.
Ну, главное разобрались. Сам по себе вопрос про Рената оказался интересным, так что и я кое в чём разобрался.
double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 }; не динамический массив.
double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 }; нединамический массив.
double f[] - сам по себе динамический массив. Именно он объявляется при создании. Перестаёт ли он быть динамическим после инициализации конечной инициализирующей последовательностью - не исследовал. Главное, что выяснили выше, - это то, что после инициализации объявленный массив обретает конкретный размер.
Вы хотите сказать, что динамический массив в результате явной инициализации перестаёт быть динамическим, т.е. теряет статус и свойства динамического? - Может, и так. Но сомневаюсь. Вопрос: на каком основании (почему) динамический массив double f[] перестаёт быть оным?
double f[] - сам по себе динамический массив. Именно он объявляется при создании. Перестаёт ли он быть динамическим после инициализации конечной инициализирующей последовательностью - не исследовал. Главное, что выяснили выше, - это то, что после инициализации объявленный массив обретает конкретный размер.
Вы хотите сказать, что динамический массив в результате явной инициализации перестаёт быть динамическим, т.е. теряет статус и свойства динамического? - Может, и так. Тогда вопрос: почему?
Все дело в том что мы в МКЛ немного "изолированы" от реальных дел )), за нас в такой ситуации решает компилятор. Если видит:
создает статический масив (без возможности изменять размер). Если видит:
double f[];создает структуру struct MqlArrayObject (она и ведет себя как динамический массив), в глобальной памяти. Поэтому нельзя инициализировать массив после объявления ( double f[]; f = {6};)
P.S: все написанное мое ИМХО, могу где-то ошибаться.
Вопрос от чайника: действительно ли, что если компилятор видит строчку
то изначально создаётся не динамический, а статический массив?
Есть же правило: "При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную структуры struct MqlArrayObject (объект динамического массива) и обеспечивает код для правильной инициализации". Или наличие конечной инициализирующей последовательности приравнивается к "явному указанию всех значимых размерностей массива" и приводит к созданию статического массива?
Вопрос от чайника: действительно ли, что если компилятор видит строчку
то изначально создаётся не динамический, а статический массив?
Есть же правило: "При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную структуры struct MqlArrayObject (объект динамического массива) и обеспечивает код для правильной инициализации". Или наличие конечной инициализирующей последовательности приравнивается к "явному указанию всех значимых размерностей массива" и приводит к созданию статического массива?
А слабо проверить?
;)
А слабо проверить?
;)
На текущий момент слабо. До терминала доберусь только вечером. В противном случае мой ответ для 220Volt звучал бы по-другому, как Вы понимаете :) В Справочнике информацию не нашёл. Может, плохо искал, но дотошно.
Ладно, отмазался. :) Я тоже вне терминала.
Проверяется элементарно - попыткой использования ArrayResize(...)