汎用クラスライブラリ - バグ、説明、質問、使用上の特徴、提案 - ページ 27

 
Artyom Trishkin:
  1. 私は、あなたが作成したすべてのオブジェクトの端末サブシステムによる自動削除とリストへのポインタを置くことを松葉杖と呼び、あなたはそれを行うためにオブジェクトの手動処理と松葉杖の作成を松葉杖と見なさないという意味で言ったのです。
  2. それは1.で言ったこととは別で、私があなたに言った最大の理由です。
  3. それも、同じ理由で。

何のためにコレクションを作るのか、コレクションとオブジェクトの自動削除のためか)手動操作のことはまったく言っていないんです。どこから持ってきたんだよ(笑)

STLを勉強すれば、私の言っていることが理解できるはずです。

 
Igor Makanu:

どのように正しくコピーするか、このテンプレートの例を教えてください。

ヘルプを参考にAddValueメソッドを書いてみたhttps://www.mql5.com/ru/docs/basis/types/classes

頭を悩ませましたが、私の例で書いた以外の解決策はMQLにはないようです

正しいデータ保存の実装を見せてください。

あなたの場合、そういうことです。
void  AddValue (const T &value)  { Tptr = new T(value); mlist.Add(Tptr); }

しかし、この解決策はとにかく間違っている。通常の解決策としては、STLのようなものを使用します。あなたの場合、std::listです。

MQL5では制限されないと思うのですが。同じVSのSTLソースをMQLにトランスレートしてみることができます

 
昔のモデレーターには、少なくとも2人のプロのプログラマーがいましたが、今は誰もいませんし、とても目立ちますね )
 
Andrey Pogoreltsev:
あなたの場合は、そういうことですね。

しかし、それはやはり間違った解決策です。通常のソリューションでは、STLのようなものを使用します。あなたの場合、std::listです。

MQL5では制限していないと思うのですが。STLソースコードをVSからMQLに変換することができます。

もう一度言いますが、MQLはC++ではありません。

であり、MQLにおけるオブジェクトへのポインタは実際にはハンドルであり、C++におけるポインタは物理メモリアドレスである。

C++のライブラリをMQLに移植する意義は?

 
Igor Makanu:

もう一度言いますが、MQLはC++ではありません。

であり、MQLにおけるオブジェクトへのポインタは実際にはハンドルであり、C++におけるポインタは物理メモリアドレスである

C++のライブラリをMQLに移植する意義は?

ジェネリックスを使用して潜在的な問題を発生させるのではなく、デザイン パターンを適切に実装すること。

驚かれたでしょうが、OSのポインタも仮想なんです。それでも物理的なものに変換する必要がありますが、これはポインタとは全く別次元の作業です。

に1を移植することはできないでしょうが、ストリップダウンされたC++03を移植することはできるようになると思います。テンプレートやオペレーターのサポートが可能です。

 
Andrey Pogoreltsev:

1.意外かもしれませんが、OS用のポインタも仮想です。それでも物理的なものに変換する必要がありますが、それはポインターの扱いとは全く別の次元の話です。

2.に1を移植することはできませんが、ストリップダウンされたC++03を移植することはできます。テンプレートやオペレーターのサポートもあります。

1.驚かない

2.まあ、ここからが本題なのですが、C++から集まって移植をしたとしても、疑問は残りますが、なぜ本家通りではないのでしょうか?- なんぼのもんじゃい

MQLの標準ライブラリが あり、それを使用することで、少なくとも将来的に開発者によってサポートが提供されるという何らかの保証があります。 私はすでに2回ほど火傷しました - 私は数年前に書かれた記事からグラフィックコンポーネントを使用しました、それはDelphiコンポーネントでの作業と同じように使いやすいです、しかし私がより深刻なプロジェクトを実装しようと始めたとき、多くの質問と記事の作成者からの応答が得られなかったのです

著名なプログラマーの誰が言ったか覚えていないが、次のようなことを言った。「コードは美しくても、読みやすくてもいけない。

私の記憶違いでなければ、あなたはデータをリストに格納する構造を希望していました。- MQLプログラムのランタイムエラーを引き起こすか?- 話の流れで知りたくなりました

 

Andrey Pogoreltsev:

C++03は可能だと思います。テンプレートやオペレータのサポートが可能です。

そうですね、頑張ってください ))

 
Igor Makanu:

コードはきれいであったり、読みやすかったりする必要はなく、仕事をするために必要なものです。

これは、あくまでも絞り込むまでの話です。

 

CLinkedListクラスのこのバグはすでに指摘したとおりだが、もう一度説明する。 リストの始点と終点は互いに閉じており、最後のノードのNextは最初のノードを指し、最初のノードのPreviousは最後のノードを指す。 その結果、標準の検索ループは無限ループに変わってしまうのである。

#include <Generic\LinkedList.mqh>

void OnStart()
{
  CLinkedList<string> list;
   
  list.AddLast("One");
  list.AddLast("Two");
  list.AddLast("Three");
  int i=0;
  for (CLinkedListNode<string> *node= list.First();  node!=NULL;  node=node.Next())  // Цикл бесконечно бегает по кругу
    { }
} 

C#では,当然ながらこのようなことはない. 最後のノードのNextは0であり,最初のノードのPreviousも 同じである.

開発者が考案した「機能」なのかどうかはわかりませんが(その有用性はわかりませんが)、いずれにせよ、ライブラリの動作はオリジナルのものに対応するはずです。

 
Alexey Navoykov:

CLinkedListクラスのこのバグはすでに指摘したとおりだが、もう一度説明する。 リストの始点と終点は互いに閉じており、最後のノードのNextは最初のノードを指し、最初のノードのPreviousは最後のノードを指す。 その結果、標準の検索ループは無限ループに変わってしまうのである。

C#では、当然のことながら、そのような無意味なことはありません。 最後のノードのNextは、最初のノードのPreviousと 同様、0です。

これが開発者が考案した「機能」なのかどうかはわかりませんが(私には何のメリットも感じられませんが)、いずれにせよライブラリの動作はオリジナルと一致するはずです。

また、一体どうなっているんだ?LinkedListの投稿を完全に削除している。ちょうど、ヨーロッパのどこかで、匿名のモデレーターが悪意を持って鼻で笑いながら、憎きロシア人の投稿を削除しているところです。なんだこのゴミ、書きたくなくなるじゃないか。