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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Алексей
37
Алексей  

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


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

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) и массив нигде не используются.

---
22853
---  

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

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

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

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

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

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

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

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

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

Алексей
37
Алексей  
TheXpert >>:

ArrayResize() ?

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

Vladyslav Goshkov
2242
Vladyslav Goshkov  
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[]; - // У МАССИВА НЕТ ЭЛЕМЕНТОВ, ТОЧНЕЕ ЭТО НЕ ОБЪЯВЛЕНИЕ МАССИВА

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

Удачи.


Алексей
37
Алексей  
VladislavVG >>:

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

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

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

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

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

Удачи.



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

iiivasyaiii
49
iiivasyaiii  
Vladyslav Goshkov:

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

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

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

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

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

Удачи.


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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий