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

 
Vict:

あなたの例はおかしい、すべてを削除した、UB(文字列リテラル修正)を残した、誰もがテレパシーをしなければならないのです。賢いアドバイスを期待するならば、最小限の動作するコード(2面)を与えなさい、さもなければただのゴミです。

この例では、問題が発生する場所、すなわち、wchar_t*ポインタをmqlの文字列にコピーする際に問題が発生することを示しています。
残りのコードは、データがあるかどうかをチェックし、次に読み込むだけなので、問題とは関係なく、役に立ちません。
簡略化したコードでも、多くの人は何が問題なのか理解できないのに、なぜ例題に書いて問題の本質を汚してしまうのでしょう。
getData() は、FrameOpcode を読み込み、受け取ったデータを const wchar_t * 型の文字列へのポインタとして返すネットワーク関数 であることを理解してください。

単純な関数wcscpy(out, data) が,const wchar_t * 文字列をwchar_t *文字 列にコピー し,自動的に文字数をカウントして null const wchar_t * を終端 することは誰でも知っています.
ここでエラーに遭遇、mqlの文字列は正しくコピーされた文字列wchar_t *を受け入れない 、だからなぜ ですか?
Renatの記事で、memcpyで文字列をコピーすると、バイトサイズエラーが発生します。
このように、memcpyは 文字 列のコピーには向かないだけでなく、pass bytesのサイズエラーで、データがギザギザになってしまうのです。
文字列のコピーには、他にもwcscpy、wcsncpyなど、特殊なC関数があります。
とRenat自身はすぐに完全に文字列で動作するように作り直されることをスレッドの一つに書いた、どうやら問題は知られているが、何らかの理由で沈黙のために私が示した問題に応答している。

以下は,wchar_t* ポインタと単純なwchar_t 型の バイトサイズの比較です。

ファイル:
1.PNG  83 kb
削除済み  
Roman:

もちろん、getData()を何かに置き換えて、普通に再現性のあるテストをするよりも、レスポンスでごちゃごちゃ書く方が簡単です。UB on UBで結論が間違ってたらどうするんだ。

memcpy(cp,to,wcslen(to)*sizeof(wchar_t));  //в этой строке должен быть указатель sizeof(wchar_t *)

は、すべてそこにある。文字列に関する考え方が何かおかしい、だからスプロール化する。

 
Vict:

もちろん、getData()を何かに置き換えて、普通に再現性のあるテストをするよりも、レスポンスでごちゃごちゃ書く方が簡単です。UB on UBで結論が間違ってたらどうするんだ。

は、すべてそこにある。文字列の概念がおかしいので、エラーになるのです。

サードパーティのライブラリを使用したDLLであることをご自身で理解されているので、再現性のあるコードを提供する方法はありません。
なぜ例に誤りがあると思ったかというと,
memcpy(cp,to,wcslen(to)*sizeof(wchar_t));//この文字列にはポインタ sizeof(wchar_t *) が含まれていなければ ならないからです.

ポインタがない状態で関数を使用すると

memcpy(out, data, wcslen(data) * sizeof(wchar_t));

を使用すると、文字列の末尾が不要な文字で埋まってしまいます。画像の文字列の末尾をご覧ください。
また、文字列のwchar_t *をポインタとしてコピーする場合、型のサイズではなく、ポインタのサイズを渡すのが論理的である。

また、ポインターを使用した場合

memcpy(out, data, wcslen(data) * sizeof(wchar_t*));

の場合、文字列は余分な文字がなく、明瞭である。
問題ないでしょうが、どちらの場合もパースにさらに問題があり、つまり文字列が漏れたりスキップされたりします。

そして、この関数を使うと、何も漏れず、すべてのパースがうまくいき、ただ一文字、改行の最後に余分な文字が現れ、そして消えます。

wcsncpy(out, data, wcslen(data));

そこで、いろいろとオプションを調べているのですが、sizeofへのポインタを指定せずにmemcpyを使用すると、スクリーンショットのような結果になります。

受信したwchar_t * 文字列の末尾にnullがあるかどうかをチェックしたい。
どうすればいいのでしょうか。

ファイル:
削除済み  
ポインターを持たない関数を使用する。

というのは、最後に"㊙"が付かないからです。

そして、ポインターを使用すると

徒然なるままに

この関数を使うと、何も漏れず、すべてうまくパースされます。ただ、文字列の最後に一文字、余分な文字が表示されたり消えたりするだけです。

を、またもや "無 "で出す。ドキュメントを見る

wcsncpy, wcsncpy_s

...

文字列 src 全体がコピーされる前に count に達した場合、結果のワイド文字配列はヌル終端ではな い。

...

HH: 多分、文字列を全くいじらないのでしょう。配列をwchar_tに保存して実行し、必要ならµlの中で文字列に変換します。https://www.mql5.com/ru/docs/convert/shortarraytostring

 
Vict:

ZS: 多分、文字列を全くいじらないのでしょう。配列をwchar_tで保存して実行し、必要ならµlの中で文字列に変換します。

あ、wcsncpyがゼロをトリミングしてくれるという情報、ありがとうございます))。
はい配列は最後に残しました、ポインタがダメなら配列を使います。

 

フォーラムエンジンでは、1枚の画像から投稿を行うことはできません。テキストの入力が必要です。

スペースを入れなければならない。

 
fxsaber:

フォーラムエンジンでは、1枚の画像から投稿を行うことはできません。テキストの入力が必要です。

スペースを入れなければならない。

ここはフォーラムであり、メインは文章である、というのは理にかなっているように思います。一度にどれだけの量を撮影したかを添付した写真。ここは映像の墓場ではありません。

 

MT4/5で動作するコードを完成させましたが、ちょっとびっくりしたことがあります。

MQL4でTesterStop()を置き換えるにはどうしたらよいですか?

?

 
Igor Makanu:

MQL4でTesterStop()を置き換えるにはどうすればよいですか?

ExpertRemove です。

 
fxsaber:

ExpertRemoveです。

このバリアントですが、ExpertRemove(0)がMarketのExpert Advisorに使えないという報告を見たことがあるのですが、どうなんでしょうか?

一般的にTesterStop()を使うのは、次の2つの場合です。

- INIT_PARAMETERS_INCORRECT の代わりに、オプティマイザのログを隠蔽するために

- 注文を出すのに十分な資金が ない場合、注文を出さずにテストを終了し、より速く最適化します。