エラー、バグ、質問 - ページ 2243

 
Vitaly Murlenko:

mql4インジケーターのコードが動かなくなりました。

エディターが 'ObjectSetInteger' と表示 -関数 呼び出しに適用できるオーバーロードが1つもない

何年も使えていたのに、突然使えなくなった。しかし、残念なことです。


else{// Иначе стрелка создана. Задаём её свойства
 ObjectSetInteger(ChartID(),Open_name,OBJPROP_ARROWCODE,OpenArrowCode);//код стрелки 232 // или 0 вместо ChartID() для текущего графика 
 ObjectSet(Open_name,OBJPROP_COLOR,ObjColor);//цвет стрелки
}

しかし、なぜ2つのスタイルをミックスしたのでしょうか?1行目で矢印コードを指定した場合は、2行目も同じスタイルで指定します。

ObjectSetInteger(0,Open_name,OBJPROP_COLOR,ObjColor); //цвет стрелки
 

新バージョンのインジケータを マーケットにアップロードしようとしたところ、テストがエラーで終了しました。付録の画像にあるように、以下の内容でエラー報告をします。

test on EURUSD,H1 (netting) test on XAUUSD,D1 (netting) test on GBPUSD,M30 (netting) test on EURUSD,M1 (netting) 2016.05.31 21:45:00 アクセス違反 at 0x00007FF7FD1CA04B read to 0xFFFFFFFFFFF 2016.05.01.31 21:45:00 00 00007FF7FD1CA010 4885D2 test rdx, rdx 2016.05.31 21:45:00 00007FF7FD1CA013 747B jz 0x7ff7fd1ca090 2016.05.31 21:45:00 00007FF7FD1CA015 53 push rbx 2016.05.31 21:45:00 00 00007FF7FD1CA016 4883EC20 sub rsp, 0x20 2016.05.31 21:45:00 00007FF7FD1CA01A 48897C2430 mov [rsp+0x30], rdi 2016.05.3131 21:45:00 00007FF7FD1CA01F 488BD9 mov rbx, rcx 2016.05.31 21:45:00 00007FF7FD1CA022 488B7AF8 mov rdi, [rdx-0x8] 2016.05.31 21:45:00 00007FF7FD1CA026 4881FF00004000 cmp rdi, 0x400000 2016.05.31 21:45:00 00 00008FF1CA026 2016.05.31 21:45:00 00 00007FD1CA022 488B8CA022 2016.05.31 21:45:00 00 00007FD1CA01F 488BD9 mov rbx, rcx05.31 21:45:00 00 00007FF7FD1CA02D 730B jae 0x7ff7fd1ca03a 2016.05.31 21:45:00 00007FF7FD1CA02F 4883E980 sub rcx, 0x80 2016.05.31 21:45:00 00007FF7FD1CA033 E88852CAFF call 0x7fffce6f2c0 ; #2504 (metatester64.exe) 2016.05.31 21:45:00 00007FF7FD1CA038 EB37 jmp 0x7ff7fd1ca071 2016.05.31 21:45:00 00007FF7FD1CA03A 488D4AE8 lea rcx, [rdx-0x18] 2016.05.31 21:45:00 00 00007FF7FD1CA03E 488B52E8 mov rdx, [rdx-0x18] 2016.05.31 21:45:00 00 00007FF7FD1CA042 4885D2 test rdx, rdx 2016.05.3131 21:45:00 00 00007FF7FD1CA045 7408 jz 0x7ff7fd1ca04f 2016.05.31 21:45:00 00 007FF7FD1CA047 488B4108 mov rax, [rcx+0x8]
テスターに問題があるのかも?
ファイル:
 
Artyom Trishkin:

ただ、なぜ2つのスタイルをミックスしたのでしょうか?1行目でアローコードを設定した場合は、2行目も同じスタイルで使用します。

ありがとうございます、助かりました。

2つのスタイル?スタイルについては知りませんでした。ただ、以前はこの部分はそのようにしかできなかったんです。変化があったのです。私は10年以上MQL4でプログラミングをしています。そして今、開発者が言語を変更したため、私のコードの多くが動かなくなりました。とても残念です。その変化は、決して良い方向には向かわない。膨大な量のコードを作り直さなければならないということです。古いものでも、たくさん使っていました。

 
Gennadiy Stanilevych:

新バージョンのインジケータを マーケットにアップロードしようとしたところ、テストがエラーで終了しました。付録の図に示すようなエラー報告で、内容は次のとおりです。

テスターに問題があるのでは?

servicedeskにリクエストを作成してください。


UPD: リクエストが見つかりました。
 
Artyom Trishkin:

任意の動的配列のバッファを解放し、0次元のサイズを0に設定する。

スクリプトやインジケータを作成する場合、使用したメモリはすぐに解放されるため、ArrayFree()関数を使用する必要はほとんどありません。カスタムインジケータでは、配列の主な作業は、ターミナルの実行サブシステムによって自動的に管理されているインジケータバッファへのアクセスによって表されます。

プログラムの中で複雑な動的条件でメモリを管理する必要がある場合、ArrayFree()関数を使用すると、不要になった動的配列が占有するメモリを明示的かつ即座に解放 することができるようになります。

ほらね?不要です。

当然ながら、いったんそこからメモリを解放し、配列にサイズを割り当てて再びメモリを確保しても、誰もその中身を保証することはできない。

配列の初期化:ArrayInitialize()を使用する。

誰も中身を保証してくれないってどういうこと?メモリが解放されたのなら、もうないんだから、どうやってゴミを入れるんだ?それとも、メモリをクリアすることは、そのメモリをプログラムの別の部分で使用する許可を与えることを意味し、実際には全くクリアしていないのでしょうか?

 
Aleksey Vyazmikin:

誰も中身を保証してくれないってどういうこと?メモリがクリアされたのなら、もうそこにはないのだから、どうしてゴミが入るのだろう?それとも、メモリをクリアすることは、そのメモリをプログラムの別の部分で使用する許可を与えることを意味し、実際には全くクリアしていないのでしょうか?

ArrayResizeはメモリを掃除しないので、前の「消費者」からのゴミが含まれているのです。

これは、配列にメモリが割り当て られた後、99.99(9)%の場合、ユーザーが自分のデータでそれを「埋める」ため、高速化のために行われます。


 
Vitaly Murlenko:

ありがとうございます、助かりました。

2つのスタイル?スタイルについては知りませんでした。ただ、以前はこの部分はそのようにしかできなかったんです。変化があったのです。私は10年以上MQL4でプログラミングをしています。そして今、開発者が言語を変更したため、私のコードの多くが動かなくなりました。とても残念です。その変化は、決して良い方向には向かわない。膨大な量のコードを作り直さなければならないということです。古くても、車一台分くらいは便利だったんですよ。

mql4 ObjectSetXXX-functionsが導入される以前のアローコードの設定方法ではないでしょうか?

ObjectSet(Open_name,OBJPROP_ARROWCODE,OpenArrowCode);

私もmqlで書き始めて10年ほどになります(もっとかもしれませんが......時の流れは早いものです)。

 
Ilyas:

ArrayResizeはメモリをクリアしないので、前の「消費者」からのゴミが含まれているのです。

これは、配列にメモリを 割り当てた後、99.99(9)%の場合、ユーザーが自分のデータでそれを「埋める」ため、高速化のために行われるものです。


では、なぜ端末を再起動しても数値が「ゴミ」のような定数になってしまうのでしょうか?

個人的には、別の配列のセルの内容を単純に合計することに行き詰ってしまい、ずっと頭を悩ませていたのです。

      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=3;s<56+1; s++)
           {               
            SummArrA[s]=SummArrA[s]+ArrTest[i,s];
           }
        }     
 
Aleksey Vyazmikin:

では、なぜ端末を再起動しても数値が「ゴミ」のような定数になってしまうのでしょうか?

個人的には、別の配列のセルの内容を単純に合計しただけで火傷してしまい、何がいけないのか長い間悩みました。

初期化されていない配列にどんなデータが入っていても、いつデータが変わってもおかしくない、誰もその値を保証してくれないのです。
そのため、初期化されていない変数(読み取りメモリ)を使用すると、時として原因究明に時間がかかる事態が発生します。

  1. 片方のコンピュータで動作し、もう片方では動作しない
  2. ターミナルでは動作するが、テスターでは動作しない
  3. ターミナル/OSがアップデート され、プログラムの動作が異なる。
  4. Added Printが動作しなくなった。
  5. など

アドバイスしかできませんが。
常にデータを初期化する習慣を身につけると、将来、初期化不足に関連するエラーを探すのに多くの時間を浪費することがなくなります。

Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
 
Aleksey Vyazmikin:

誰も中身を保証してくれないってどういうこと?メモリがクリアされたのなら、もうそこには ないのだから、どうしてゴミが入るのだろう?それとも、メモリをクリアすることは、そのメモリをプログラムの別の部分で使用する許可を与えることを意味し、実際には全くクリアしていないのでしょうか?

ダメってどういうこと?マザーボードスロットからメモリースティックを取り出さない。そして、もしメモリが存在し、それが解放される(値で初期化されるのではなく、解放される)なら、それは他のプログラムの必要性に使用されていることになります。