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

 
Koldun Zloy:

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

_DLLAPI void fnReplaceString(wchar_t * text, wchar_t *from, wchar_t * to)
{
   wchar_t * cp;
   
   //проверка параметров
   if(text==NULL || from==NULL || to==NULL) return;
   if(wcslen(from)!=wcslen(to))             return;
 
   //поищем подстроку
   if((cp=wcsstr(text,from))==NULL)         return;

   //заменим
   memcpy(cp,to,wcslen(to)*sizeof(wchar_t));
}
#import "MQL5DLLSamples.dll"
void fnReplaceString(string & text, string from, string to);
#import


第3.3項

 
Koldun Zloy:

2.MQLで200字の行を強調表示しました。そして、そこに164文字をコピーしたのですね。その後、MQLで文字列の大きさを調べます。200のままです。

サイズではなく、長さ!長さは文字単位、サイズはバイト単位。
確認したところ、164文字の文字列を取得した後、はい、長さは200のままです。
何か感想はありますか?

 
Roman:

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

sizeof( wchar_t* ) のことです。

 
Roman:


第3.3項

反論しないで、この記事をもっとよく読んだほうがいい。そして、そこで何が起こっているのかを把握すること。

そうすれば、何の問題も起きないでしょう。

やりたいことは、実はそんなに複雑なことではないんです。

 
Roman:

サイズではなく、長さ!長さは文字単位、サイズはバイト単位。
確認したところ、164文字の文字列を取得した後、はい、長さは200のままです。
何か感想はありますか?

なぜそうなるかは、すでに上記で説明したとおりです。

 
Koldun Zloy:

やりたいことは、実はそんなに難しくないんです。

では、そんなに難しくないか教えてください。
それとも、これが普通の行動だと思いますか?

 
Roman:

では、そんなに難しくないか教えてください。
それとも、これが普通の行動だと思いますか?

何も理解するつもりもなく、ただ出来合いのレシピを渡して終わりですか?

負担になるならプログラミングをやりたいという気持ちもわからなくはないですが、それは本人の自由です。


質問をするときに、詳細な再現性のあるコードを見せないと、誰も助けてくれないと思いませんか?

とか読まないとか、もっと詳しい人に反論するとか?


そのため、レシピが用意されているわけではありません。DLLから文字列を取得する一般的な原理を書きます。自分がプログラマーだと思えば、自分でコードを書くことができます。


1.MQLでは、ushort配列を作成します。

初期化する。

3.DLLに配列とそのサイズを渡します。

4.DLLでは、wmemcpy_s()関数を用いて、この配列に文字列をコピーしてください。

5.DLL からコピーされた文字列の長さを返します。

6.MQLでは、ShortArrayToString()関数を使用して配列から文字列を作成します。

 
このトピックに関連しないコメントは、「MQL4 MT4 MetaTrader 4初心者からの質問」に移動しました。
 

あるサーバー(MQではない)では、MT5が異常な状態になり、CPUに100%の負荷がかかり、さまざまな商品についてこれらのメッセージが集中的に記録されます。

HistoryBaseの定常的な自発的更新

チャートが点滅しています。仕事ができないのです。

それとも、サーバーがゲームを終了するのを待つしかないのでしょうか?

 
Koldun Zloy:

何も理解するつもりもなく、ただ出来合いのレシピを渡して終わりですか?

負担になるならプログラミングをやりたいという気持ちもわからなくはないですが、それは本人の自由です。

質問をするときに、詳細な再現性のあるコードを見せないと、誰も助けてくれないと思いませんか?

を読まないのか、もっと詳しい人たちと議論しないのか?

そのため、レシピが用意されているわけではありません。DLLから文字列を取得する一般的な原理を書きます。自分がプログラマーだと思えば、自分でコードを書くことができます。


1.MQLでは、ushort配列を作成します。

初期化する。

3.DLLに配列とそのサイズを渡します。

4.DLLでは、wmemcpy_s()関数を用いて、この配列に文字列をコピーしてください。

5.DLL からコピーされた文字列の長さを返します。

6.MQLでは、ShortArrayToString()を使用して、配列から文字列を作成します。

どこに論点があるんだ?これは社会人としての議論であり、傲慢なパトスで、意味を鶏小屋にねじ込む必要はないのです。
既成のものは頼まなかったんですね。ポインターで解決するのかと思いきや、そうでもないんですね。
この話題を読んでいないのはあなたです。ここではもうずっとアレイについて議論されていて、みんなよく分かっていることです。
そして、私はずっとアレイに傾いていました。しかし、mqlには文字列があるので、それを直接使うのはどうでしょう?
ここで議論しているのは、まさにこのmqlの文字列のバグ、つまりポインタをコピーしてしまうことなのです。
もっと言うと、ユーショートだけですべてが解決するわけではありません。配列には様々なオプションがあります。
しかし、私の場合、コード構造上合理的とは言い難いので、配列は使いたくありません。
直接作業できるmqlの文字列があればなおさらですが、正しく動作しなければなりません。