//Найти первое 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? :)
감독자! 도움이 될 것 같습니다! :)
나는 엉뚱한 곳에서 항상 초기화를 수행합니다! 몇 줄 후에 변수에 값을 할당하더라도. 나는 스스로 철칙을 세웠다 -변수를 선언 할 때 0이나 빈 문자열로 초기화하는 것은 어리석은 일이다. :)
편집증에 대해 절대적으로 옳습니다!
메타드라이버, 당신은 주술사입니다!
감독자! 도움이 될 것 같습니다! :)
나는 엉뚱한 곳에서 항상 초기화를 수행합니다!
난 믿지 않아! 이번에는 확실히 놓쳤습니다. :)
// 다시 한 번 확인해 보세요. 전체 코드를 이 각도에서 보세요.
// 자신의 하품에 대한 인식을 걸러낼 수 있는 것은 "나는 항상...!!"이기 때문입니다. :))
:)
난 믿지 않아! 이번에는 확실히 놓쳤습니다. :)
// 다시 한 번 확인해 보세요. 전체 코드를 이 각도에서 보세요.
// 자신의 하품에 대한 인식을 걸러낼 수 있는 것은 "나는 항상...!!"이기 때문입니다. :))
샤먼이라고 해요! 주말 동안 모든 어드바이저 파일(수천 줄)을 확인했습니다. 실제로 오래된 라이브러리에서 초기화되지 않은 변수를 2~3개 찾았습니다.
내 규칙은 함수 본문 의 시작 부분에 모든 변수를 선언하고(이는 항상 그랬음) 즉시 초기화하는 것입니다(작년에는 아마도)
나는 나 자신을 찻주전자라고 생각하지 않습니다 - 백 개 이상의 다른 색인/스크립트/고문들이 작성되었습니다 :)
그런 다음 나는 얼음 위의 물고기처럼 싸웁니다. 현지화할 수 없습니다! 자, 총을 쏴라!
그건 그렇고, 코드는 다음과 같습니다.
//Найти первое 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 다음에 확인하십시오; 배열이 범위를 벗어난 경우 출력한 다음 Print(만세! 작동했습니다!);
이 같은
알다시피, 나는이 형식으로 이름을 편집하려고 시도했지만 끔찍합니다.
' PositionGetInteger ' - 상수 예상 order.mq5 65 44 상수라는 단어가 보입니다. 그러나 그는 무엇을 필요로합니까? 첫 번째 줄의 함수에 있습니다.
그리고 다른 모든 변수 선언에 대해 이와 같이 하지만 도움말에 따라 함수를 선언했습니까?
'가격' - 매개변수 order.mq5 65 92에 대한 기본값 누락