2011年8月30日火曜日

配列のサイズ指定は絶対ArrayResizeで・・・

double lPrices[200];   ←これダメ!
ArrayResize(lPrices,200); ←これでOK!

なんなのこれ・・・。orz
lPrices[200]だと次の1回だけ何故か前回start()で回した時のサイズが入ったまま・・・

しかも、start()の中で宣言した配列なのに!

何このks仕様!!!><(仕様っていうか実装か!つーかバグだ!)

あと、
ArrayInitialize(lPrices,0);
も必須。
同じように前回のstart()の値が残ることがある。


普段ほとんどArrayResizeで指定してたから超ハマった。orz
start()内だからだいじょぶだろ、って思ってたのに。。。



他、doubleで掛け算する場合、絶対に整数化(?)してから。
double a = 0.0001*0.01*10000*100;
これで
if(1.0==a)でfalseになる。←意味不明w
double a = NormalizeDouble(0.0001*0.01*10000*100,0);
とすればOK。
でも一番は
double a = 10000*100*0.0001*0.01;
計算順で、先に整数化する。

んで、doubleを整数化したいからってintに安易に入れちゃダメ。
intは上限2147483647だから、多めのキャッシュに使うと上限越えてマイナスになる。orz←普段から気をつけてたけど、intで確実にキャッシュ!と思って今回ハマったw

ちなみにStringは255文字まで。
これもシリアライズ風にキャッシュする時不便。

start()がマルチスレッドで動いてるのかあれこれ試したけどよく分からん。
ただ、start()の中で処理が終わる前にTickが動いたらMT4がフリーズするようだ。
てことは強制シングルスレッドか。
(Sleepはインジ内では無視される)


うーん。
いろいろいまいちだよ!MT4!!><

早く全般慣れたいわぁ。
まぁ、乗り越えるとこだな。全部。

2 件のコメント:

bighope さんのコメント...

double lPrices[200];
ArrayInitialize(LPrices,0.0);
で配列を作れませんか?

double の計算は、私も苦しまされました。^^;

Roi さんのコメント...

わぁ!!!コメントありがとうございます!!!><

start()の中でdouble lPrices[200];を宣言し、
その後配列のサイズを変更(縮小)した際に、
なぜか次のtickのstart()の時に、
double lPrices[200];があるのに
配列のサイズが1tick前の縮小したサイズのまま素通りしてしまう時が稀にあって。orz

原因不明のエラーでうんうん唸った結果、
ArrayResizeで指定したらうまくいきました。
(当時の事なのでその時のソースが残ってないんですががが)

なので、それ以降配列の大きさを変更する場合は
ArrayResizeを使うようにしてます(・ω・`)

doubleの計算は鬼門ですよね^^;;
スクリプトで使ってるRubyもその辺弱くてうっかりしてるとハマりますw

コメントを投稿