//Найти первое adblArray_Short х adblArray_Long ПОСЛЕ (позже) intShift_PastSearch (поиск от intShift_PastSearch до нулевого бара) void FindCrossArrays_PastThisShift(structS & structSled) { datetime adtmDTM[]; int intShift=0;
▼ - вот здесь ошибка- array out of range in '_indMyAO_from_SetPeriod.mq5' (390,37) while(structSled.adblArray_Short[intShift]==structSled.adblArray_Long[intShift] && intShift>1) {intShift--;}
散発的なエラーの95%は、初期化エラーやその不足に関連しています。 ですから、コードの断片は 役に立ちませんし、コード全体が偏執的であるため、役に立ちません ;-)。
原因は顕在化した場所から非常に遠いところに求めるべきであり、それはアフタにとってつまらないことです。開発者が撃たれることを要求する方が簡単なのです。必ず役に立ちます。
// 本当に助かりますよね、falkovさん。)
素晴らしい役立つはず!と思える。:)
私はぶっきらぼうに初期化 EVERYWHERE AND ALWAYS!数行後に変数に値を代入しても。変数を宣言 するときは、nullか空文字列で初期化する、という鉄則を作ったところです :)
パラノイアについて......まったくその通りです。
メタドライバーさん、シャーマンなんですねー。
素晴らしい助かるような気がする!:)
イニシャライズはバカエベンキ!
信じられない! 今回は見逃したに違いない :)
// 本当にもう一度、この角度からコード全体に目を通して確認してください。
// 「私はいつでも...!」という自分のあくびに対する認識をフィルターするのは、「いつでも、いつでも」という信念かもしれません:))
:)
信じられない!今回は確実に見逃した(笑) :)
// 本当にもう一度、この角度からコード全体に目を通してみてください。
// 「I ALWAYS...!」のために、自分のあくびに対する認識をフィルターすることができるのは、「EVERYWHERE and EVERYWHERE」の信念です:)) 。
シャーマン!って言ってるんですよ。週末に、すべてのEAファイル(数千行)をチェックしました。それに、古いライブラリで初期化されていない変数が2つも3つもあったのは事実です。
私のルールは、関数本体の 最初にすべての変数を宣言し(これはずっとそうでした)、すぐに初期化することです(昨年、おそらく)。
私は自分のことをダミーだとは思っていません - 私は100種類以上のインデックス/スクリプト/アドバイザーを書いてきました :)
そして今、私は氷上の魚のように悪戦苦闘しています。自分を撃つこともできるんだ!
ちなみにコードはこんな感じです。
//Найти первое adblArray_Short х adblArray_Long ПОСЛЕ (позже) intShift_PastSearch (поиск от intShift_PastSearch до нулевого бара)
void FindCrossArrays_PastThisShift(structS & structSled) {
datetime adtmDTM[];
int intShift=0;
if(structSled.intShift_PastSearch>_cintBarsAmountForCalc) {return;}
else if(structSled.intShift_PastSearch<=0) {return;}
ArrayResize(adtmDTM,structSled.intBarsAmountForCalc);
ArrayInitialize(adtmDTM,0);
ArraySetAsSeries(adtmDTM,true);
CopyTime(structSled.strSymbol,structSled.enumTF,0,structSled.intShift_PastSearch+1,adtmDTM);
intShift=structSled.intShift_PastSearch;
▼ - вот здесь ошибка - array out of range in '_indMyAO_from_SetPeriod.mq5' (390,37)
while(structSled.adblArray_Short[intShift]==structSled.adblArray_Long[intShift] && intShift>1) {intShift--;}
if(structSled.adblArray_Short[intShift]>structSled.adblArray_Long[intShift]) {
while(structSled.adblArray_Short[intShift]>structSled.adblArray_Long[intShift] && intShift>0) {intShift--;}
if(intShift>0) {
structSled.intRet_FindingDirection=-1;
structSled.intRet_FindingShift=intShift;
}
else {
structSled.intRet_FindingDirection=0;
structSled.intRet_FindingShift=intShift;
}
}
else if(structSled.adblArray_Short[intShift]<structSled.adblArray_Long[intShift]) {
while(structSled.adblArray_Short[intShift]<structSled.adblArray_Long[intShift] && intShift>0) {intShift--;}
if(intShift>0) {
structSled.intRet_FindingDirection=1;
structSled.intRet_FindingShift=intShift;
}
else {
structSled.intRet_FindingDirection=0;
structSled.intRet_FindingShift=intShift;
}
}
structSled.dtmRet_FindingDTM=adtmDTM[structSled.intRet_FindingShift];
return;
}
//-------------------------------------------------------------------------------------------------
うーん、配列の オーバーランをチェックしないのはなぜだろう intShift=structSled.intShift_PastSearch;
intShiftが配列の境界から外れている場合 while(structSled.adblArray_Short[intShift]==structSled.adblArray_Long[intShift] && intShift>1) {intShift--;}.
は、コードが左から右に実行され、structSled.adblArray_Short[intShift]への参照が && intShift>1 の前に発生するので、すぐにエラーが発生します。
intShift=structSled.intShift_PastSearch; の後にチェックを入れて、配列外の exit であれば出力 Print(Hurray! It worked!)
このように
この形でコンパイルしてみたんだ、怖いね。
'PositionGetInteger' - constant expected.mq5 65 44 constant という単語を見かけました。しかし、何が必要なのか?関数の1行目にあります。
そして、他の変数の宣言もこんな感じですが、関数はヘルプ通りに宣言しましたよね?
'price' - パラメータ order.mq5 のデフォルト値がありません 65 92