Проблемма с большими массивами (или вообще с массивами) 3.78-3.79

 
Проблемма с большими массивами (или вообще с массивами) 3.78-3.79
Странную ситуацию наблюдаю.
создаю массив например MyArray[100000]
Заполняю его в индикаторе различными коэффициентами.

И поллучается такая вещь (например):
var = 111222;
MyArray[var] = 10
MyArray[var+1] = 20

Вывожу с помошью функции Print содержимое массива
Print(MyArray[var],MyArray[111222]);

и получается после каждого запуска расчета индикатора:
.... 20,10
.... 20,10
.... 10,10
.... 10,10
.... 20,10

Т.е. доступ по абсолютному значению индекса массива всегда постоянен, доступ по значению переменной плавает.
Причем я не нашел никакой закономерности.
Господа разработчики, гляньте плиз свой код.
 
Поточнее чуть
Странную ситуацию наблюдаю.
создаю массив например MyArray[100000]
Заполняю его в индикаторе различными коэффициентами.

И поллучается такая вещь (например):
var = 11122;
MyArray[var] = 10;
MyArray[var+1] = 20;

Вывожу с помошью функции Print содержимое массива
Print(MyArray[var],",",MyArray[11122]);

и получается после каждого запуска расчета индикатора:
.... 20,10
.... 20,10
.... 10,10
.... 10,10
.... 20,10

Т.е. доступ по абсолютному значению индекса массива всегда постоянен, доступ по значению переменной плавает.
Причем я не нашел никакой закономерности.
Господа разработчики, гляньте плиз свой код.
 
по коду
Если взять за пример такой код:

array: MyArray[100000](0);
var: myvar(11122);
myvar=11122;
MyArray[myvar] = 10;
MyArray[myvar+1] = 20;
Print(MyArray[myvar],",",MyArray[11122]);


то все работает правильно, выдает
10,10


Проверьте Ваш код - возможно где то ошибка. Или пришлите свой код для проверки на stringo@metaquotes.ru

 
Отправил пример кода на указанный Вами ящик.
subj.
Жду результатов проверки.
Спасибо.
 
ответ ушёл по указанному Вами адресу
 
!!! Пожалуйста отнеситесь серьезнее к проблемме !!!
Вот выжимка для тестирования.
Тест проводить на eurusd5
Посмотрите плиз на линию индикатора - это не правильно!!!!
Все подтверждается логами функции Print.

/*[[
Name := Test_array12100
Author := Copyright © 2003, MetaQuotes Software Corp.
Link := https://www.metaquotes.net/
Notes := Sample Custom Indicator program
Separate Window := No
First Color := Red
First Draw Type := Line
First Symbol := 217
Use Second Data := Yes
Second Color := Blue
Second Draw Type := Line
Second Symbol := 218
]]*/
Vars : CurrentBar(0),shift(0),BeginBar(0),nAccountedBars(0),prevBars(0),LastAccBar(0);
Vars : LoopCount(0);
Vars : MinUp(0),MinDn(0);
Vars : Up(0),Dn(0),i(0),j(0),CentrBar(0);
Vars : File(0);
Vars : VarTest(12100);
Arrays : PriceL[100000](1);

//
SetLoopCount(0);
if BeginBar = 0 then
{
BeginBar = Bars - 500;
};
//
If BeginBar-1 = Bars-1 Then
{
Exit;
};
//
LoopCount = 0;
//
For CurrentBar = BeginBar To Bars-1
{
LastAccBar = LastAccBar + 1; // êîëè÷åñòâî ïðîñ÷èòàííûõ áàðîâ
shift = Bars - 1 - CurrentBar;
Dn = L[shift]/Point;
// print(" Dn=",Dn);
PriceL[VarTest] = VarTest;
//
if Dn > VarTest+1 then
{
//
i = Dn;
// ïðîñòî èùó êîãäà PriceL[12100] áóäåò ðàâåí 12100
While true
{
i--;
if (PriceL[i]= VarTest) then Break;
};
MinDn = i;
print(TimeToStr(Time[shift])," PriceL[",MinDn,"]=",PriceL[MinDn]," PriceL[",VarTest,"]= ",PriceL[VarTest]," PriceL[12101]= ",PriceL[12101]," Dn= ",Dn, " shift= ", shift, " i= ",i);
};
//
// SetIndexValue(shift, MinUp*Point);
SetIndexValue2(shift, MinDn*Point);
BeginBar = CurrentBar+1;
};
 
разберёмся
 
разобрались
для того, чтобы приводить числа с плавающей точкой(цены) к целым числам (индексам массива) используйте функцию Normalize
то есть вместо строки :
Dn = L[shift]/Point;
обязательно используйте :
Dn = Normalize(L[shift]/Point,0);
или
Dn = Round(L[shift]/Point);

Получилось вот что - число типа 12100.9999999999999999999999 любым принтом будет выведено как 12101.0
но если это число использовать в качестве индекса, то будет взята только целая часть, то есть 12100
 
Спасибо :)
Причина обращения: