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

 
Vict:

シャープはクリーンなフィールドに現れたと思いますか?C言語に根ざした、余計な糖分を含まないダムコンテナのような構造です。

まあ、人間は猿から進化したわけだし。しかし、だからといって人間が「余計な糖分を摂らない」間抜けな猿であることには変わりないでしょう?)実は、MQLの構造体=C#の構造体であることは既に説明しましたが、ちょっとした違いがあって、C#ではインターフェースを実装できるのです。)

なぜ、そう言い切れるのですか?他の翻訳ユニット/他のモジュール/サイクル/コンパイラの調子が悪い/...から関数を呼び出している。.オプティマイザーの能力を過信しないこと。これは、コンパイラに義務付けられているCopy elisionの最適化ではありません。もし、オプティマイザーが賢くなり、コストがかからなくなったら、次のC標準に「デフォルトの初期化ではオブジェクトを未定義の状態にしない」と書かれるでしょう。

なぜなら、最適化とは呼べないような最も些細で原始的なことだからです。 すべてのコンパイラは、Debug-modeでもデフォルトでそうしていると思います。 もっと簡単にできることは? コードパース中に、変数への アクセスを追跡する必要があるのですが、その際に、変数へのアクセスを追跡することができます。書き込み操作が繰り返され、読み出し操作がなかった場合、前のエントリを切り出す。

無視してもいいが、その場合、まともなコーダーは、関数を詰め込んだ構造を見て、糞コーダーと見るので、驚かない ように

私はむしろ、未初期化の操作に対するあなたのアプローチをクソコーディングと呼びたい。 コンピュータプログラムが持つべき主な品質は何か? 安定性だ。 同じ入力データに対して、変更できない結果を与えなければならない。 そしてあなたはそれを忘れようとする。 どこかで変数の初期化を忘れ、どこかで構造体に新しいフィールドを追加し、プログラム全体で未初期化となり、プログラムは進行していくのだ。プログラムはこう動く、ああ動く...。

C言語は、遠い昔、ハードウェアの能力が非常に貧弱だった時代に作られたので、最適化の作業の多くはプログラマーに任されていたのです。そんなにかゆいところに手が届くのなら、なぜアセンブラではなくCなのでしょうか? アセンブラでトレーディングシステムをエンコードしてください。 きっと最速で、もしかしたら市場の先を行くかもしれません )

 
Alexey Navoykov:

なぜなら、それは最適化と呼ぶには最も些細で原始的なことだからです。 すべてのコンパイラは、デバッグモードでさえデフォルトでそうしていると思います。 これより簡単なことはありますか? コードをパースしながら、変数への アクセスを監視することです。書き込み操作が繰り返され、読み出し操作がなかった場合、前のエントリを切り出す。

もし、コンパイル時に完全に予測可能なプログラムであれば、実行時に実行する必要は全くないだろう。定義上、外界から何かを受け取り、それに基づいて結果を出力するはずなのですが、それがオプティマイザーの邪魔をする不確実性なのです。もう一つの秘密は、共有ライブラリは実行時にアプリケーションとリンクされるため、オプティマイザはそこで何もトレースできないことです。あと100万件くらいは捨てられそう。(100万、カール!)

どこかで変数を初期化し忘れたり、構造体に新しいフィールドを追加したりして、プログラム全体で初期化されなくなり、プログラムが進んでしまうのです。プログラムはこう動く、ああ動く...。

どこかで3ではなく2を掛けてしまったり、fn_()ではなくfn()を呼んでしまったり・・・。.手元が狂うと大変なことになります。

C言語は、ハードウェアの性能が非常に低かった昔に作られたため、最適化の多くはプログラマーに任されていたのです。うずうずしているのなら、なぜアセンブラではなくCを参照するのですか? アセンブラで取引システムをエンコードしてください。 きっと最速で、もしかしたら市場を先取りしているかもしれませんよ。

参考:C標準(最新版、C++標準ではありません):C11、C18、C2xを準備中です。むしろ、無能の結果、これを書いたのでは?
 
Vict:

もし、コンパイル時に完全に予測可能なプログラムであれば、実行時に実行する必要は全くないだろう。定義上、外界から何かを受け取り、それに基づいて結果を出力しなければならないが、これがオプティマイザーを阻害する不確実性である。もう一つの秘密は、共有ライブラリは実行時にアプリケーションとリンクされるため、オプティマイザはそこで何もトレースできないことです。あと100万件くらいは捨てられそう。100万、カール!(笑)

外界とのデータ交換は 特殊なケースであり、特殊な解決策が必要です。 ここでは、プログラミングの話であり、コンパイラがその変数が外部から制御されていないことを知ることが保証されているケースの話をしています。 これは、大半の場合でなければなりません。そうでなければ、純粋なシステムプログラミングになってしまい、本当はCや、さらによいことにアセンブラでやったほうがいいのです。

どこかで3倍ではなく2倍、fn_()ではなくfn()と呼ばれる、、、。.手が曲がるなら、トラブル。

また、変数が初期化されていないと、うまくいくときといかないときがあり、予測不可能な結果になります。だいたい、こんな基本的なことを、経験豊富なプログラマーを装って説明すること自体、おかしな話だ。

 
Alexey Navoykov:

外部とのデータ交換は特殊なケースであり、特殊な解決策が必要です。 しかし、ここではプログラミングについて話しているのであって、コンパイラがその変数が外部から制御されていないことを知ることが保証されているケースです。 これが大半のケースでしょう。 さもなければ、純粋なシステムプログラミングになってしまい、本当はCや、さらに言えばアセンブラでやった方が良いのです。

どんなプログラムでも、外部とのコミュニケーションは欠かせません。繰り返しになりますが、そうでなければ、コンパイル時に把握することができます。例えば、コンパイラはここで初期化をカットするのでしょうか?

int i = 54;
if (read_socket() == SIGNAL) {
   fn(i);
}
i = 100;
...

// естественно, что никто не пишет такой бред:
int q = 3;
q = 7;
q = 9;
fq(q);

明らかに、read_socket()が何を返すか見当もつきません。プログラム全体が、外の世界との交流によって「浸透」していくのです。+ ここに外部モジュールの呼び出しを追加する....

また、初期化されていない変数では、時々動作するものとしないものがあり、予測できない結果になることがあります。むしろ、経験豊富なプログラマーを気取っているあなたに、そんな基本的なことを説明する方がおかしいのです。

いいですか、安定したエラーを出したいなら、スタックを初期化するのはとても簡単なことなんです。

int main() {
    if (true)
        int init_stack[10000] {0};
}

HIPからのメモリ初期化も楽勝です。何らかの表現の罠にはまると、まったくコアダンプが出なくなる。

もう一度言いますが、もしオプティマイザーが非常に賢ければ、一部のC11ではまだ必要に応じてコンパイラによる初期化命令の挿入でdefault initとvalue initを同一視するでしょうが、残念なことに。誰も強制しない、嫌ならTをval{}にしろ;初歩的なことを説明するのは疲れる。

 
Vict:

もう一度言いますが、もしオプティマイザが非常に賢ければ、C11の一部でコンパイラが必要に応じて初期化命令を挿入して、デフォルトのinitと値のinitを同一視するでしょうが、残念なことに。誰も強制しない、いらないならT val{}にしろ;初歩的なことを説明するのは疲れる。

というのも、私の理解では、C++の標準は、文脈を考慮せずに非常に形式的に規則を記述しています。 つまり、初期化は常に行われるか、決して行われないかです。 比較として、C#では初期化なしで変数を宣言できますが、コードの後半では必ず初期化する必要があります。つまり、コンパイラは現在のコマンドだけでなく、その後に続くコードも解析する。 これは言語規則に定められている。 しかし、C++では規格上、解析の対象とはなっていない。だから、初期化を強制されると、「全部自分で制御して初期化したい!」と文句を言われることになる。)

 
Alexey Navoykov:

なぜなら、C++の標準は、私の理解では、文脈を考慮せずに非常に形式的にルールを記述しているからです。 つまり、常に初期化するか、決して初期化しないかのどちらかです。 それに比べて、C#では初期化せずに変数を宣言できますが、コード内でさらに必ず初期化する必要があります。つまり、コンパイラは現在のコマンドだけでなく、その後に続くコードも解析する。 これは言語規則に定められている。 しかし、C++では規格上、解析の対象とはなっていない。だから、初期化を強制されると、「全部自分で制御して初期化したい!」と文句を言われることになる。)

ただ、試行錯誤の末にたどり着いたもので、そのままうまくいくのであれば、多くの場合、不要なオーバーヘッドが発生し、誰もそれを取り入れないでしょう。 例えば、c++17では、コンパイラがコピーエリジョンを行うことが必須であると規格で定めている。

 

テーマは「バグ、バグ、質問」です。

MQL vs C#,C++など、構文やコンパイラ、精神鍛錬に関することを議論するトピックを作ってください。

あなたがスレッドを散らかし、他の質問やユーザーのメッセージがあなたの議論に溺れているのです。

どこで質問したらいいかと聞かれ、ここに案内されると、「おじさんたちはそこで100ページも議論しているから、私は口出ししない、あとは無意味だ」と答える.

 
const int DEFAULT_INT_VALUE   = 147;
input int thisIsAnInput       = DEFAULT_INT_VALUE;
'NoConstForInput.mq5' NoConstForInput.mq5 1 1
DEFAULT_INT_VALUE' - 定数が必要 NoConstForInput.mq5 13 33
エラー1件、警告0件 2 1

ビルド2361と2390

 
Alain Verleyen:
'NoConstForInput.mq5' NoConstForInput.mq5 1 1
DEFAULT_INT_VALUE' - 定数が必要 NoConstForInput.mq5 13 33
エラー1件、警告0件 2 1

ビルド2361と2390

#define  DEFAULT_INT_VALUE 147
 
Vict:

いいですか、安定したエラーを出したいなら、スタックを初期化するのはとても簡単なんです。

HIPからメモリを初期化するのも楽勝です。もし、何らかの表現の罠にはまれば、完全にコアダンプされます。

最後に一言、モデレーターに怒らないでください))。

スタックの値が呼び出しごとに異なる理由を明らかにする必要があります。https://ru.wikipedia.org/wiki/ASLR を守るためであって、先ほど言ったように、何もイナリーズする必要は全くないのです。私の場合、ソフトウェアをgdb(デバッガ)で実行すると、実行するたびに同じアドレスに配置されます。つまり、スタックが「ランダムな」リターンアドレスで汚染されることはありません。