エラー、バグ、質問 - ページ 2579 1...257225732574257525762577257825792580258125822583258425852586...3185 新しいコメント 削除済み 2019.09.28 09:48 #25781 Roman:どうして空の文字列なのですか?ソケットから文字列が来る場合、他のバリエーションでは、曲がってはいるが、空ではない。 あなたのバリアントが間違っているとは言いませんが、あなたのバリアントでは、文字列の配列を使っていますね。 私の場合はポインターです。ソケット関数は、const wchar_t * へのポインタを返します。 多くのC関数を試して、ハードコアの+1や+2があったので、私はこのバグをmqlのせいにしているわけです。 ただ、うまくいかないんです。memcpy()の 後の行をファイルに並列に書き込む。もしmqlが有罪なら(引数をコピーする呼び出しの上に何らかのラッパーがある)、ファイルは空にはならないだろう、たぶん。 HH:そうですね、念のため - µlのライブラリ関数はリンクで宣言されていますよね?void fn(string& s)? Roman 2019.09.28 10:16 #25782 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からの変更から安全になるために、私は本当に配列に文字列を書くでしょう。 Vladimir Simakov 2019.09.28 10:58 #25783 でも、MQからの変更に対応するために、文字列は本当に配列で書くことになるんでしょうね。 良い点です。もちろん、stringを使いたいのですが、dllの実装や転送動作が記述された規格がないので、純粋にubです。で、short[]に文字列を入れれば、安全に配列を渡すことができます。ただ、配列を 作成したりコピーしたり するオーバーヘッドが発生します。 PS.それでも、問題はmqlではなく、あなたのコードにあるのだと思います。すべてのテストは正常に通過し、論理的には何の問題もありません。stringはwchar_t *の上、いやwstringの上の些細なラッパーであり、それを台無しにする可能性があります。 Roman 2019.09.28 11:09 #25784 Vladimir Simakov: いい言葉ですね。もちろん、stringを使いたいのですが、dllにはその実装や転送動作を記述した規格がないため、純粋にubとなります。で、short[]に文字列を入れれば、安全に配列を渡すことができます。ただ、配列を作成したりコピーしたりするオーバーヘッドが発生します。 PS.それでも、問題はmqlではなく、あなたのコードにあるのだと思います。すべてのテストは正常に通過し、論理的には何の問題もありません。stringはwchar_t *の上、いやwstringの上の些細なラッパーであり、それを台無しにする可能性があります。 私もリブには疑問を感じていました。何でもかんでも可能性があると排除するわけではありません。しかし、ソケットから受信した文字列をASCIIコードに変換してみると、正しい文字列であることが分かります。 次は簡単なコピーです。 mql が文字列ポインタを正しく受け付けない。 ファイル: 1.PNG 32 kb 削除済み 2019.09.28 11:26 #25785 Roman: 私が表示するすべてのラインは、チャートのコメント欄、または印刷端末に表示され、ラインが来るとコメント欄にすぐに表示され、それが曲がっているかどうかがわかります。 大きなタイムラグがある場合、チャートに線が出ることはほとんどなく、一方、印刷には穴があいている。 ソケットからの文字列が入ってこないという疑念が、ミリ秒単位でティックデータが入ってくるのです。 ソケットからgetData()をポインタ変数に取り込み、ポインタ変数から直ちにmqlにコピーし、ラッパーは使わない。 はい、風水で宣言しました )) 一般的に、mqlの文字列には問題があります。多くのバリエーションを試行錯誤 ソケットからの文字列はターミナルNULLで来るので、最も信頼性の高いチェック関数 は、mqlでの問題を示しています。 一般的には、とりあえずsizeof(wichar_t*)を使って、挙動を見ることになると思います。 しかし、おそらくMQからの変更から安全になるために、私は本当に配列に文字列を書くでしょう。 ファイルへの書き込み-dll側でということですが、書き込まれてもμlに入らなければ、それはもうバグクレームで重箱の隅をつつくような主張です、多分修正されると思います。 また、ご希望でなくても、MQはコード/アドレスを外部に隠蔽するラッパーがあり、すべてが直行するわけではありません。 Roman 2019.09.29 02:35 #25786 Vict: ファイルへの書き込み-DLL側でという意味ですが、ファイルへの書き込みがあってもmqlに届かないのであれば、それはもうバグの主張が強いと思います、多分修正されると思います。 そして、あなたの希望がなくてもラッパーがあり、MQは外界からコード/アドレスを隠し、すべてが直接行くわけではありません。 受信した文字列をファイルに書き出す。 ソケット関数は文字列へのポインタを返すので、文字列へのポインタをファイルに書き出し、そのポインタをmqlにコピーする。 機能を使用する wcscpy(out, data); 結果の文字列の長さは164で,mqlには200が割り当てられている。 StringInit(out, 200, 32); mqlで受信したコピーされた文字列は同じ長さであるが、コピーにずれがある。 mql スクリプトで while ループが Sleep(1) でループしている。 ファイル: 458.PNG 71 kb Roman 2019.09.29 02:51 #25787 そして、もし関数 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 削除済み 2019.09.29 06:56 #25788 Roman: 正しくは、文字列出力用のバッファを確保し、空白で初期化します。 そして、この文字列(ポインタ)をDLLに渡します。 dll の wchar_t* データは,out にコピーされ,つまりポインタでもある.論理的には何の問題もないはずです。 ヘルプによると、StringInit関数で文字列の長さを設定するように理解しました。 しかし、StringInit関数 自体にはまだ問題があります。文字列の長さを指定したのに、ポインタのサイズを指したら変なことになったのです。 マニュアルの文字列の長さの移動というのがよくわからない。 また、ポインタなしで sizeof(wchar_t) を使うと、文字列が余分な文字で浮遊し始め、パースやリークで問題が発生します。 文字列をDLLに渡すために、RenatのDLLの書き方の記事から、彼の例を使用しました。 しかし、sizeof(wchar_t)ポインタを付けずに渡すと、なぜか文字列が浮いてしまうのですが、sizeof(wchar_t*)ポインタを付けると問題ないです。 文字列をポインタとしてコピーしているのだから、型ではなくサイズをポインタに渡すのが筋だと思うのですが。 ちゃんとやっても、うまくいかないこともあるんですよ。 やり方を間違えると......うまくいくようです。 そういうときは、ちゃんとやって、別のところでエラーを探さなければならない。 削除済み 2019.09.29 07:00 #25789 Roman: 結果の文字列をファイルに書き込む。 ソケット関数は文字列へのポインタを返すので、文字列へのポインタをファイルに書き出し、そのポインタをmqlにコピーする。 機能を使用する 結果の文字列の長さは164で,mqlには200が割り当てられている。 mqlで受信したコピーされた文字列は同じ長さであるが、コピーにずれがある。 mql スクリプトで while ループが Sleep(1) でループしている。 1.MQLでは、ポインタではなく文字列がコピーされます。 2.MQLで200文字の文字列を選択しました。そして、そこに164文字をコピーしたのですね。その後、MQLで線の大きさを見ます。200のままであった。 Roman 2019.09.29 07:06 #25790 Koldun Zloy: ちゃんとやっても、うまくいかないこともあるんですよ。 やり方を間違えると......うまくいくようです。 そのような場合は、正しい方法で、他の場所でエラーを探す必要があります。 そこで、正しく動作させるために、memcpyをあきらめ、wcscpyやwcsncpyを使うことにしたのです。結果、上の投稿。 1...257225732574257525762577257825792580258125822583258425852586...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
どうして空の文字列なのですか?ソケットから文字列が来る場合、他のバリエーションでは、曲がってはいるが、空ではない。
あなたのバリアントが間違っているとは言いませんが、あなたのバリアントでは、文字列の配列を使っていますね。
私の場合はポインターです。
ソケット関数は、const wchar_t *
へのポインタを返します。 多くのC関数を試して、ハードコアの+1や+2があったので、私はこのバグをmqlのせいにしているわけです。
ただ、うまくいかないんです。
memcpy()の 後の行をファイルに並列に書き込む。もしmqlが有罪なら(引数をコピーする呼び出しの上に何らかのラッパーがある)、ファイルは空にはならないだろう、たぶん。
HH:そうですね、念のため - µlのライブラリ関数はリンクで宣言されていますよね?void fn(string& s)?memcpy()の後の行をファイルに並列に書く、μlが原因なら(引数をコピーしての呼び出しの上に何らかのラッパーがある)、ファイルは空にはならない、はずだ。
HH:そうですね、念のため - µlライブラリでは、関数は参照で宣言されていますか?void fn(string& s)?すべての文字列は、チャートのコメント欄か、プリント端末に表示しています。文字列が届くとすぐにわかりますし、コメント欄では、それが曲がっているかどうかがわかります。
一般的に、mqlの文字列には問題があります。多くのバリエーションを試行錯誤大きな時間差があると、文字列はほとんどチャートに表示されず、印刷に穴があいてしまうのです。
ソケットから文字列が入ってこないという疑念は消え、ミリ秒単位でティックデータが入ってくる。
ソケットのgetData()からはポインタ変数に取り込まれ、ポインタ変数から直接mqlにコピーされる。
はい、風水で宣言しました ))
ソケットからの文字列はターミナルNULLで来るので、最も信頼性の高いチェック関数
は、mqlでの問題を示しています。
一般的には、とりあえずsizeof(wichar_t*)を使って、挙動を見ることにします。
しかし、おそらくMQからの変更から安全になるために、私は本当に配列に文字列を書くでしょう。
良い点です。もちろん、stringを使いたいのですが、dllの実装や転送動作が記述された規格がないので、純粋にubです。で、short[]に文字列を入れれば、安全に配列を渡すことができます。ただ、配列を 作成したりコピーしたり するオーバーヘッドが発生します。
PS.それでも、問題はmqlではなく、あなたのコードにあるのだと思います。すべてのテストは正常に通過し、論理的には何の問題もありません。stringはwchar_t *の上、いやwstringの上の些細なラッパーであり、それを台無しにする可能性があります。
いい言葉ですね。もちろん、stringを使いたいのですが、dllにはその実装や転送動作を記述した規格がないため、純粋にubとなります。で、short[]に文字列を入れれば、安全に配列を渡すことができます。ただ、配列を作成したりコピーしたりするオーバーヘッドが発生します。
PS.それでも、問題はmqlではなく、あなたのコードにあるのだと思います。すべてのテストは正常に通過し、論理的には何の問題もありません。stringはwchar_t *の上、いやwstringの上の些細なラッパーであり、それを台無しにする可能性があります。
私もリブには疑問を感じていました。何でもかんでも可能性があると排除するわけではありません。
しかし、ソケットから受信した文字列をASCIIコードに変換してみると、正しい文字列であることが分かります。
次は簡単なコピーです。
mql が文字列ポインタを正しく受け付けない。
私が表示するすべてのラインは、チャートのコメント欄、または印刷端末に表示され、ラインが来るとコメント欄にすぐに表示され、それが曲がっているかどうかがわかります。
一般的に、mqlの文字列には問題があります。多くのバリエーションを試行錯誤大きなタイムラグがある場合、チャートに線が出ることはほとんどなく、一方、印刷には穴があいている。
ソケットからの文字列が入ってこないという疑念が、ミリ秒単位でティックデータが入ってくるのです。
ソケットからgetData()をポインタ変数に取り込み、ポインタ変数から直ちにmqlにコピーし、ラッパーは使わない。
はい、風水で宣言しました ))
ソケットからの文字列はターミナルNULLで来るので、最も信頼性の高いチェック関数
は、mqlでの問題を示しています。
一般的には、とりあえずsizeof(wichar_t*)を使って、挙動を見ることになると思います。
しかし、おそらくMQからの変更から安全になるために、私は本当に配列に文字列を書くでしょう。
ファイルへの書き込み-dll側でということですが、書き込まれてもμlに入らなければ、それはもうバグクレームで重箱の隅をつつくような主張です、多分修正されると思います。
また、ご希望でなくても、MQはコード/アドレスを外部に隠蔽するラッパーがあり、すべてが直行するわけではありません。
ファイルへの書き込み-DLL側でという意味ですが、ファイルへの書き込みがあってもmqlに届かないのであれば、それはもうバグの主張が強いと思います、多分修正されると思います。
そして、あなたの希望がなくてもラッパーがあり、MQは外界からコード/アドレスを隠し、すべてが直接行くわけではありません。
受信した文字列をファイルに書き出す。
ソケット関数は文字列へのポインタを返すので、文字列へのポインタをファイルに書き出し、そのポインタをmqlにコピーする。
機能を使用する
結果の文字列の長さは164で,mqlには200が割り当てられている。
mqlで受信したコピーされた文字列は同じ長さであるが、コピーにずれがある。
mql スクリプトで while ループが Sleep(1) でループしている。
すると、隙間はないのですが、コピーした行がまっすぐでなく、行末に余分な文字があるのです。
wcslen(data)+ 1を追加しても解決 しない。
肝心の、ここに書いているページの中で
mql の文字列が Dll から正しく受け取れない、文字列へのポインタをコピーした const wchar_t*.
正しくは、文字列出力用のバッファを確保し、空白で初期化します。
そして、この文字列(ポインタ)をDLLに渡します。
dll の wchar_t* データは,out にコピーされ,つまりポインタでもある.論理的には何の問題もないはずです。
ヘルプによると、StringInit関数で文字列の長さを設定するように理解しました。
しかし、StringInit関数 自体にはまだ問題があります。文字列の長さを指定したのに、ポインタのサイズを指したら変なことになったのです。
マニュアルの文字列の長さの移動というのがよくわからない。
また、ポインタなしで sizeof(wchar_t) を使うと、文字列が余分な文字で浮遊し始め、パースやリークで問題が発生します。
文字列をDLLに渡すために、RenatのDLLの書き方の記事から、彼の例を使用しました。
しかし、sizeof(wchar_t)ポインタを付けずに渡すと、なぜか文字列が浮いてしまうのですが、sizeof(wchar_t*)ポインタを付けると問題ないです。
文字列をポインタとしてコピーしているのだから、型ではなくサイズをポインタに渡すのが筋だと思うのですが。
ちゃんとやっても、うまくいかないこともあるんですよ。
やり方を間違えると......うまくいくようです。
そういうときは、ちゃんとやって、別のところでエラーを探さなければならない。
結果の文字列をファイルに書き込む。
ソケット関数は文字列へのポインタを返すので、文字列へのポインタをファイルに書き出し、そのポインタをmqlにコピーする。
機能を使用する
結果の文字列の長さは164で,mqlには200が割り当てられている。
mqlで受信したコピーされた文字列は同じ長さであるが、コピーにずれがある。
mql スクリプトで while ループが Sleep(1) でループしている。
1.MQLでは、ポインタではなく文字列がコピーされます。
2.MQLで200文字の文字列を選択しました。そして、そこに164文字をコピーしたのですね。その後、MQLで線の大きさを見ます。200のままであった。
ちゃんとやっても、うまくいかないこともあるんですよ。
やり方を間違えると......うまくいくようです。
そのような場合は、正しい方法で、他の場所でエラーを探す必要があります。
そこで、正しく動作させるために、memcpyをあきらめ、wcscpyやwcsncpyを使うことにしたのです。
結果、上の投稿。