Вопросы от "чайника" - страница 123

 
papaklass:

MqlRates mrate[];//массив нулевого размера

ArrayResize и ArrayInitialize используйте. непонятно, правда для чего.

обычно с CopyRates эта структура используется.

 
papaklass:
 

Renat говорил, что лучше делать вот так:

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[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 }; не динамический массив.

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
220Volt:

double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 }; нединамический массив.

double f[] - сам по себе динамический массив. Именно он объявляется при создании. Перестаёт ли он быть динамическим после инициализации конечной инициализирующей последовательностью - не исследовал. Главное, что выяснили выше, - это то, что после инициализации объявленный массив обретает конкретный размер.

Вы хотите сказать, что динамический массив в результате явной инициализации перестаёт быть динамическим, т.е. теряет статус и свойства динамического? - Может, и так. Но сомневаюсь. Вопрос: на каком основании (почему) динамический массив double f[] перестаёт быть оным?

 
Yedelkin:

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 (объект динамического массива) и обеспечивает код для правильной инициализации". Или наличие конечной инициализирующей последовательности приравнивается к "явному указанию всех значимых размерностей массива" и приводит к созданию статического массива?

 
Yedelkin:

Вопрос от чайника: действительно ли, что если компилятор видит строчку

то изначально создаётся не динамический, а статический массив?

Есть же правило: "При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную структуры struct MqlArrayObject (объект динамического массива) и обеспечивает код для правильной инициализации". Или наличие конечной инициализирующей последовательности приравнивается к "явному указанию всех значимых размерностей массива" и приводит к созданию статического массива?

А слабо проверить? 

;)

 
MetaDriver:

А слабо проверить? 

;)

На текущий момент слабо. До терминала доберусь только вечером. В противном случае мой ответ для 220Volt звучал бы по-другому, как Вы понимаете :) В Справочнике информацию не нашёл. Может, плохо искал, но дотошно.
 
Yedelkin:
На текущий момент слабо. До терминала доберусь только вечером. В противном случае мой ответ для 220Volt звучал бы по-другому, как Вы понимаете :) В Справочнике информацию не нашёл. Может, плохо искал, но дотошно.

Ладно, отмазался. :)  Я тоже вне терминала.

Проверяется элементарно - попыткой использования ArrayResize(...)

Документация по MQL5: Операции с массивами / ArrayResize
Документация по MQL5: Операции с массивами / ArrayResize
  • www.mql5.com
Операции с массивами / ArrayResize - Документация по MQL5
Причина обращения: