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

削除済み  
Roman:

どうして空の文字列なのですか?ソケットから文字列が来る場合、他のバリエーションでは、曲がってはいるが、空ではない。
あなたのバリアントが間違っているとは言いませんが、あなたのバリアントでは、文字列の配列を使っていますね。
私の場合はポインターです。

ソケット関数は、const wchar_t *
へのポインタを返します。 多くのC関数を試して、ハードコアの+1や+2があったので、私はこのバグをmqlのせいにしているわけです。
ただ、うまくいかないんです。

memcpy()の 後の行をファイルに並列に書き込む。もしmqlが有罪なら(引数をコピーする呼び出しの上に何らかのラッパーがある)、ファイルは空にはならないだろう、たぶん。

HH:そうですね、念のため - µlのライブラリ関数はリンクで宣言されていますよね?void fn(string& s)?
 
Vict:

memcpy()の後の行をファイルに並列に書く、μlが原因なら(引数をコピーしての呼び出しの上に何らかのラッパーがある)、ファイルは空にはならない、はずだ。

HH:そうですね、念のため - µlライブラリでは、関数は参照で宣言されていますか?void fn(string& s)?

すべての文字列は、チャートのコメント欄か、プリント端末に表示しています。文字列が届くとすぐにわかりますし、コメント欄では、それが曲がっているかどうかがわかります。
大きな時間差があると、文字列はほとんどチャートに表示されず、印刷に穴があいてしまうのです。
ソケットから文字列が入ってこないという疑念は消え、ミリ秒単位でティックデータが入ってくる。
ソケットのgetData()からはポインタ変数に取り込まれ、ポインタ変数から直接mqlにコピーされる。
はい、風水で宣言しました ))

#import "ExampleDll.dll"
   void Func(string task, string & out);
#import
一般的に、mqlの文字列には問題があります。多くのバリエーションを試行錯誤
ソケットからの文字列はターミナルNULLで来るので、最も信頼性の高いチェック関数
wcscpy(out, data);
или
wcsncpy(out, data, wcslen(data));  //wcslen(data)+1
は、mqlでの問題を示しています。

一般的には、とりあえずsizeof(wichar_t*)を使って、挙動を見ることにします。
しかし、おそらくMQからの変更から安全になるために、私は本当に配列に文字列を書くでしょう。
 
でも、MQからの変更に対応するために、文字列は本当に配列で書くことになるんでしょうね。

良い点です。もちろん、stringを使いたいのですが、dllの実装や転送動作が記述された規格がないので、純粋にubです。で、short[]に文字列を入れれば、安全に配列を渡すことができます。ただ、配列を 作成したりコピーしたり するオーバーヘッドが発生します。

PS.それでも、問題はmqlではなく、あなたのコードにあるのだと思います。すべてのテストは正常に通過し、論理的には何の問題もありません。stringはwchar_t *の上、いやwstringの上の些細なラッパーであり、それを台無しにする可能性があります。

 
Vladimir Simakov:

いい言葉ですね。もちろん、stringを使いたいのですが、dllにはその実装や転送動作を記述した規格がないため、純粋にubとなります。で、short[]に文字列を入れれば、安全に配列を渡すことができます。ただ、配列を作成したりコピーしたりするオーバーヘッドが発生します。

PS.それでも、問題はmqlではなく、あなたのコードにあるのだと思います。すべてのテストは正常に通過し、論理的には何の問題もありません。stringはwchar_t *の上、いやwstringの上の些細なラッパーであり、それを台無しにする可能性があります。

私もリブには疑問を感じていました。何でもかんでも可能性があると排除するわけではありません。
しかし、ソケットから受信した文字列をASCIIコードに変換してみると、正しい文字列であることが分かります。
次は簡単なコピーです。
mql が文字列ポインタを正しく受け付けない。

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

私が表示するすべてのラインは、チャートのコメント欄、または印刷端末に表示され、ラインが来るとコメント欄にすぐに表示され、それが曲がっているかどうかがわかります。
大きなタイムラグがある場合、チャートに線が出ることはほとんどなく、一方、印刷には穴があいている。
ソケットからの文字列が入ってこないという疑念が、ミリ秒単位でティックデータが入ってくるのです。
ソケットからgetData()をポインタ変数に取り込み、ポインタ変数から直ちにmqlにコピーし、ラッパーは使わない。
はい、風水で宣言しました ))

一般的に、mqlの文字列には問題があります。多くのバリエーションを試行錯誤
ソケットからの文字列はターミナルNULLで来るので、最も信頼性の高いチェック関数
は、mqlでの問題を示しています。

一般的には、とりあえずsizeof(wichar_t*)を使って、挙動を見ることになると思います。
しかし、おそらくMQからの変更から安全になるために、私は本当に配列に文字列を書くでしょう。

ファイルへの書き込み-dll側でということですが、書き込まれてもμlに入らなければ、それはもうバグクレームで重箱の隅をつつくような主張です、多分修正されると思います。

また、ご希望でなくても、MQはコード/アドレスを外部に隠蔽するラッパーがあり、すべてが直行するわけではありません。

 
Vict:

ファイルへの書き込み-DLL側でという意味ですが、ファイルへの書き込みがあってもmqlに届かないのであれば、それはもうバグの主張が強いと思います、多分修正されると思います。

そして、あなたの希望がなくてもラッパーがあり、MQは外界からコード/アドレスを隠し、すべてが直接行くわけではありません。

受信した文字列をファイルに書き出す。
ソケット関数は文字列へのポインタを返すので、文字列へのポインタをファイルに書き出し、そのポインタをmqlにコピーする。
機能を使用する

wcscpy(out,  data);

結果の文字列の長さは164で,mqlには200が割り当てられている。

StringInit(out, 200, 32);

mqlで受信したコピーされた文字列は同じ長さであるが、コピーにずれがある。
mql スクリプトで while ループが Sleep(1) でループしている。

ファイル:
458.PNG  71 kb
 
そして、もし関数
wcsncpy(out, data, wcslen(data));
すると、隙間はないのですが、コピーした行がまっすぐでなく、行末に余分な文字があるのです。
wcslen(data)+ 1を追加しても解決 しない。

肝心の、ここに書いているページの中で
mql の文字列が Dll から正しく受け取れない、文字列へのポインタをコピーした const wchar_t*.
ファイル:
w6b.PNG  74 kb
qjv2.PNG  73 kb
09i3.PNG  6 kb
削除済み  
Roman:

正しくは、文字列出力用のバッファを確保し、空白で初期化します。
そして、この文字列(ポインタ)をDLLに渡します。

dll の wchar_t* データは,out にコピーされ,つまりポインタでもある.論理的には何の問題もないはずです。
ヘルプによると、StringInit関数で文字列の長さを設定するように理解しました。
しかし、StringInit関数 自体にはまだ問題があります。文字列の長さを指定したのに、ポインタのサイズを指したら変なことになったのです。
マニュアルの文字列の長さの移動というのがよくわからない。

また、ポインタなしで sizeof(wchar_t) を使うと、文字列が余分な文字で浮遊し始め、パースやリークで問題が発生します。
文字列をDLLに渡すために、RenatのDLLの書き方の記事から、彼の例を使用しました。
しかし、sizeof(wchar_t)ポインタを付けずに渡すと、なぜか文字列が浮いてしまうのですが、sizeof(wchar_t*)ポインタを付けると問題ないです。
文字列をポインタとしてコピーしているのだから、型ではなくサイズをポインタに渡すのが筋だと思うのですが。

ちゃんとやっても、うまくいかないこともあるんですよ。

やり方を間違えると......うまくいくようです。

そういうときは、ちゃんとやって、別のところでエラーを探さなければならない。

削除済み  
Roman:

結果の文字列をファイルに書き込む。
ソケット関数は文字列へのポインタを返すので、文字列へのポインタをファイルに書き出し、そのポインタをmqlにコピーする。
機能を使用する

結果の文字列の長さは164で,mqlには200が割り当てられている。

mqlで受信したコピーされた文字列は同じ長さであるが、コピーにずれがある。
mql スクリプトで while ループが Sleep(1) でループしている。

1.MQLでは、ポインタではなく文字列がコピーされます。

2.MQLで200文字の文字列を選択しました。そして、そこに164文字をコピーしたのですね。その後、MQLで線の大きさを見ます。200のままであった。

 
Koldun Zloy:

ちゃんとやっても、うまくいかないこともあるんですよ。

やり方を間違えると......うまくいくようです。

そのような場合は、正しい方法で、他の場所でエラーを探す必要があります。

そこで、正しく動作させるために、memcpyをあきらめ、wcscpyやwcsncpyを使うことにしたのです。
結果、上の投稿。