błąd w tablicach

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1521
Rejestracja: 09 sie 2009, 21:27

błąd w tablicach

Nieprzeczytany post autor: personov »

Proszę o pomoc.
Przykładowy wskaźnik, który prowadzi pewne obliczenia i wykorzystuje tablice wywala błąd jeśli dodana jest linijka

Kod: Zaznacz cały

#property strict
Jeśli tej linijki nie ma to wszystko jest OK.
Jeśli natomiast kompilacja jest przez strict to wywala błąd "array out of range".

Oto przykładowy kod :

Kod: Zaznacz cały

#property strict
#property indicator_chart_window
#property indicator_buffers 1
double aaa[];      
double value[10];     
double sum=0;
///
void init(){
 aaa[0]=Close[0];
 IndicatorBuffers(1);
 SetIndexBuffer(0,aaa);
 SetIndexStyle(0,DRAW_NONE,STYLE_SOLID,1,Red);
 ArrayResize(value,25);}
///
void deinit(){}
//
void start(){
   sum=0;
   for(int i=25;i>=0;i--){ value[i+1]=Close[1]; value[i]=Close[0]; }
   for(int k=0;k<25;k++){sum=sum+value[k];}
   aaa[0]=sum/25;
   }
Proszę o pomoc. Z góry dziękuję.
Solą życia jest kasa.

Awatar użytkownika
por. Borewicz
Gaduła
Gaduła
Posty: 93
Rejestracja: 25 cze 2014, 11:58

Re: błąd w tablicach

Nieprzeczytany post autor: por. Borewicz »

Nie jestem specjalistą od MT4, ale wygląda na to, że odwołujesz się do elementu value[26] w pierwszej iteracji pętli w funkcji start, a więc wykraczasz poza zakres tablicy value. Spróbuj zwiększyć wielkość tablicy do 27 i zobacz czy to pomoże.

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1521
Rejestracja: 09 sie 2009, 21:27

Re: błąd w tablicach

Nieprzeczytany post autor: personov »

Niestety to nie to. Tym bardziej, że podczas kompilacji nie ma żadnych błędów.
Błędy są w zakładce strategie przy ładowaniu wskaźnika na wykres.
Wskazywana jest linijka błędu pierwszą linijkę w init(), czyli na

Kod: Zaznacz cały

 aaa[0]=Close[0];
W załączniku dodaję plik mq4.

-- Dodano: śr 22-08-2018, 18:51 --

A może to jednak to ??
W takim razie pytanie by brzmiało jak przepisać wartości value na nowym ticku ( wartość starsza zastępowana jest nową ).
np. w momencie nadejścia nowego ticku value[25]=value[24]; value[24]=value[23] itd. a value[0]=Bid;
Pomijam już warunek nadejścia nowego ticku, chodzi o to jaką pętlę zastosować, żeby wartość 25 była zastąpiona wartością 24 itd.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Solą życia jest kasa.

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Re: błąd w tablicach

Nieprzeczytany post autor: LowcaG »

tak na szybko patrząc to

robisz resieze na 25 czyli max index masz 24 (bo numerujemy od zera)
a "i" zaczynasz od 25 czyli przekroczenie zakresu

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1521
Rejestracja: 09 sie 2009, 21:27

Re: błąd w tablicach

Nieprzeczytany post autor: personov »

Dobra - sprawa załatwiona.
Wystarczyło w pętli for dać zamiast 25 dać 23.

Kod: Zaznacz cały

for(int i=23;i>=0;i--){ value[i+1]=Close[1]; value[i]=Close[0]; }
Dziękuję za podpowiedź.
Solą życia jest kasa.

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Re: błąd w tablicach

Nieprzeczytany post autor: LowcaG »

a co do kopiowania takich wartośći to może ArrayCopy by wystarczyło, no i szybsze wykonanie kodu.

ODPOWIEDZ