Проблема с присваиванием значений массиву типа double

 

Столкнулся с такой проблемой. собственно сначала покажу необходимый код, чтобы нагляднее сразу было:


--в глобальных переменных

double OrderLotSize[];

int j;

...

--в start()

...

MinLot = MarketInfo(Symbol(),MODE_LOTSTEP);

LotCost = MarketInfo(Symbol(), MODE_MARGINREQUIRED);

AvailableMargin = AccountFreeMargin();

OrderSize = MaxOrderValue*0.01*AvailableMargin;

AvailableLots = MathFloor((OrderSize/LotCost)/MinLot)*MinLot;


Print("AvailableLots:", AvailableLots);


if(AvailableLots <= 10)

{

j=0;

OrderLotSize[j]=AvailableLots;

Print("OrderLotSize:", OrderLotSize[j]);

}

...

-------------------------------

Так вот, при любом значении AvailableLots в массив пишется 0ю. например, если AvailableLots рассчиталось как 1.15, то в массив в ячейку с нулевым индексом запиештся 0, а не это число.


Попробовал посмотреть что происходит, когда записываю в массив в этом коде просто вещественное число - записывается опять же 0:

...

if(AvailableLots <= 10)

{

j=0;

OrderLotSize[j]=2.34;

Print("OrderLotSize:", OrderLotSize[j]);

}

...

Кто сталкивался с подобным, в чём тут может быть проблема? До этого момента в коде этот счётчик (j) и массив нигде не используются.

 

однозначно у вас проблемы в коде. на компилятор тут уже нет нареканий.

проверяйте какой тип AvailableLots.

также учитывайте, что

Функция MathFloor() возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x.
 
sergeev >>:

однозначно у вас проблемы в коде. на компилятор тут уже нет нареканий.

проверяйте какой тип AvailableLots.

также учитывайте, что

Функция MathFloor() возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x.

AvailableLots типа double, рассчитывается корректно. Да и я специально же пробовал присвоить массиву просто фиксированное значение, а не значение переменной - результат один и тот же. Сама не понимаю, что за мистика...

 
TheXpert >>:

ArrayResize() ?

Хмм, а поподробнее можно? Никогда раньше ещё не приходилось использовать эту функцию. Намёк на то, что после присвоения значения массив остался нулевого размера?

 
av.onuchin >>:

AvailableLots типа double, рассчитывается корректно. Да и я специально же пробовал присвоить массиву просто фиксированное значение, а не значение переменной - результат один и тот же. Сама не понимаю, что за мистика...

Да нет никакой мистики. Немцы говорят : "Если у Вас что-либо не получилось с 3-го раза - прочтите наконец то инструкцию". 

https://book.mql4.com/ru/variables/arrays

Массивы размещать надо - то есть выделять память под элементы массива. 

double OrderLotSize[];

int Start()
{
int N=10;
................
ArrayResize(OrderLotSize,N);
}

//==============================================================

или так :

double OrderLotSize[10];

- Вы же только указатель( в терминах языка С) на массив объявили

double OrderLotSize[]; - // У МАССИВА НЕТ ЭЛЕМЕНТОВ, ТОЧНЕЕ ЭТО НЕ ОБЪЯВЛЕНИЕ МАССИВА

, память не выделили ( память не выделена, соответственно записывать значения некуда. С-шная прога с крешем свалила бы терминал, а так свой менеджер памяти - позволяет всякие вольности). 

Удачи.


 
VladislavVG >>:

Да нет никакой мистики. Немцы говорят : "Если у Вас что-либо не получилось с 3-го раза - прочтите наконец то инструкцию".

https://book.mql4.com/ru/variables/arrays

Массивы размещать надо - то есть выделять память под элементы массива.

- Вы же только указатель( в терминах языка С) на массив объявили

, память не выделили ( память не выделена, соответственно записывать значения некуда. С-шная прога с крешем свалила бы терминал, а так свой менеджер памяти - позволяет всякие вольности).

Удачи.



Спасибо огромное за детальный ответ, моя ошибка, просмотрел. Теперь работает отлично.

 
Vladyslav Goshkov:

Да нет никакой мистики. Немцы говорят : "Если у Вас что-либо не получилось с 3-го раза - прочтите наконец то инструкцию". 

https://book.mql4.com/ru/variables/arrays

Массивы размещать надо - то есть выделять память под элементы массива. 

- Вы же только указатель( в терминах языка С) на массив объявили

, память не выделили ( память не выделена, соответственно записывать значения некуда. С-шная прога с крешем свалила бы терминал, а так свой менеджер памяти - позволяет всякие вольности). 

Удачи.


Дай бог тебе здоровья, добрый молодец! Полночи вчера протупил, весь яндекс излазил, а на твою последнюю ссылку и не нажал в отчаянии, а сегодня взял-таки и добил её, и вот оно решение! :)

Причина обращения: