記事「初心者からプロまでMQL5をマスターする(第2回):基本的なデータ型と変数の使用」についてのディスカッション - ページ 2

 
Oleh Fedorov #:

エヘン...恥ずかしくて聞けないんだけど...。

  • 実際の MQL5のコードでは、このような構文はどれくらいの頻度で出てくるのでしょうか?
  • "6月のインタビュー"...MQLが主な活動分野の一つである大企業に個人的に会ったことがあるということですか?(個人的には、これまで会ったことはありません)。
  • また、このコードはすべてのc-like言語で同じ結果を生むのでしょうか?

要するに、なぜ初心者がリテラルについてそこまで 深く理解する必要があるのでしょうか?


P.S.私自身は、初心者ではありませんが、一問も正解せずにあなたのテストに落ちました。JavaでもPHPでも、教科書の中で似たようなことに出会ったことがありますが、それはとても昔のことで、私が今まで読んだり書いたりしなければならなかった実践的なコードには対応していません...。私はあなたのオフィスの6月になるつもりはない。それに...なんだ?

P.P.S. リテラルについての記事を書いてくれたら、僕だけでなく、きっと役に立つと思います。;-)特に、ヘルプに載っていないような経験をシェアしてくれれば・・・。しかし、文書化されていない機能は 新しいバージョンで頻繁に変更されるため、通常、私を困らせることが多い。もしかしたら、それは本当に重要なことかもしれないし、少なくとも役に立つかもしれない。

ほらね。問題は、それがどれくらいの頻度で起こるかではなく、人々がその微妙な点を知らない、知りたがらないということなんだ。そしてタイプを持ち込むことについては、基本中の基本だから知っておく必要がある。それによって多くの痛みを得ることができる。ちなみに、このコードは型変換に関するものではありません:

enum E{
   int a;
   float b;
}

double F(E& e, int a){
   e.a = a;
   return e.b;
}

というわけで、ヘルプに基づけば、ここはすべて問題ない。ただ、個人的にはニュアンスが違う。開発者の主張によると、mqlはC++で書かれていて、C++ではそれはできない、UBなのだが、Cではすべてが合法なのだ。しかし、mqlの開発者が怖がっているかどうかはわからない。だから、私はmqlでこのようなことをするつもりはない。

 
Vladimir Simakov #:


開発者の主張によれば、mqlは C++で書かれて おり、C++ではそれはできない、UBだが、Cではすべてが合法だ。

申し訳ないが、開発者の主張によれば、MQLプログラミング言語はC++に限りなく近いものであり、C++で書かれているわけではない。))

ありがとう、ウラジミール。

 
Vladimir Simakov #:
そして型変換については、基本中の基本なので知っておく必要がある。

それについて議論するつもりもない。まったく同感だ。ただ...。すべてのCの構成要素がMQLで同じように使えるわけではないんだ!:-)

考えるべき」コードについて...私はC(の両方)に詳しくないので、このコードは私にはゲームのように見えます。ヘルプではenum 型は整数型を指していて、それが構造体だとはまったく思いませんでした。意味が全然違うんですね...。でも、ありがとう、これで知ることができたよ。個人的には何の役にも立たないけど、全然使わないよ :-)。

ヘルプによると、ここではすべて正常です。

リンクをいただけますか?

Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
  • www.mql5.com
Данные перечислимого типа enum относятся к некоторому ограниченному множеству данных. Определение перечислимого типа: Список значений представляет...
 
Oleh Fedorov #:

考える」コードについてですが...。私はC言語(両方)に詳しくないので、このコードは私にはゲームのように見えますヘルプでは enum 型は整数型を指していて、それが構造体だとは全く思いませんでした。意味が全然違うんですね...。でも、ありがとう、これでわかったよ。個人的には何の役にも立たないけど、こんなものは使わないよ :-)。

これはゲームだ。enumとunionを混ぜて天井から書いてしまった人がいるのだろう。彼の例はコンパイルできない。enumは構造体ではなく、4バイトの整数である。ユニオンを取れば、C++でもMQLでも完璧に動作する。

追記。Junのインタビューにあった最初の例と、それがどれくらいの頻度で起こるかという質問についてですが、もちろん、この例は洗練されているので、純粋な形では起こりませんが、符号付き整数と符号なし整数が混在してコードに使われることは非常によくあり、ここで問題が起こる可能性はかなり高いです。
 
Stanislav Korotky #:

これはナンセンスだ。この人は天井から書いて、enumとunionをごっちゃにしたに違いない。彼の例はコンパイルできない。enumは構造体ではなく、4バイトの整数だ。ユニオンを使えば、C++でもMQLでも完璧に動作する。

追記。Junのインタビューにあった最初の例と、それがどれくらいの頻度で起こるかという質問についてですが、もちろん、この例は洗練されているので、純粋な形では起こりませんが、符号付き整数と符号なし整数がコード内で使われることは非常に多く、ここで問題が起こる可能性はかなり高いです。

当然ユニオン)))

残りについて: https://en.cppreference.com/w/cpp/language/union

It is undefined behavior to read from the member of the union that wasn't most recently written. 

そして、次に何が書いてあるかは知っている。

Many compilers implement, as a non-standard language extension, the ability to read inactive members of a union.

ただし、msvsはこのヘルプから引用したもので、まだ誰もそれに出会っていないにもかかわらず、2番目のものを主張していない。g++とclangはそれについて何を言っているか見ていないが、ほとんど違いはない。

もしそのように使いたいのであれば、そうすればいい-それはあなたの権利であり、何かあったときの苦しみでもある)))。

 
Vladimir Simakov #:

当然だ)))

その他について:https://en.cppreference.com/w/cpp/language/union

cppreferenceは有用な情報源だが、その参照という性質上、言語仕様にしかないニュアンスをすべて含むことはできない。それらを一般化するには、stackoverflowを 見る方が簡単です。要約すると、プリミティブ型では、フィールドを読み込むときに、たとえ書き込まれていなくても、ビット単位での値の「転送」が保証されます。

Accessing inactive union member and undefined behavior?
Accessing inactive union member and undefined behavior?
  • 2012.07.07
  • Luchian Grigore Luchian Grigore 257k 66 66 gold badges 461 461 silver badges 626 626 bronze badges
  • stackoverflow.com
I was under the impression that accessing a member other than the last one set is UB, but I can't seem to find a solid reference (other than answers claiming it's UB but without any support from the standard). So, is it undefined behavior?
 
Stanislav Korotky #:

これはナンセンスだ。この人は天井から書いて、enumとunionをごっちゃにしたに違いない。彼の例はコンパイルできない。enumは構造体ではなく、4バイトの整数だ。ユニオンを使えば、C++でもMQLでも完璧に動作する。

追記。淳のインタビューにあった最初の例と、それがどれくらいの頻度で起こるかという質問についてだが、もちろん、この例は洗練されているので、純粋な形では起こらないが、符号付き整数と符号なし整数が混在したコードで使われることは非常に多く、ここで問題が起こる可能性はかなり高い。

ふぅ、世界観が戻ってきた!:-)ユニオンやその他の複雑な型については、これから仕上げるところだ(これ以上の失態がなければ、来週には公開できるだろう)。

追伸:MetaEditorは接尾辞が`u`と`ull`のリテラルをハイライトせず、コンパイルします。同時に、`f`はハイライトされるが、エラーを報告する。これはバグなのかヒントなのか?:-)

 

もしあなたが初心者で、私たちの議論に戸惑っているのであれば、C(およびC++)では数値リテラルにデータ型を変更する接尾辞を付けることができることを説明しよう。例えば、接尾辞 `u` は普通の整数(int)を符号なし整数(uint)に変えます。

Vladimir Simakovが 提案したスクリプトを少し修正して実行してみてください(数字と文字の間にスペースがない ことに注意してください:)

void OnStart()
  {
//---
    
   Print(typename(1));
   Print(typename(-1));
   Print(typename(1 ll));
   
   Print(typename(1 u));
   Print(typename(1 ull));
   
   Print(typename(-1*1 ull));
   
   Print(typename(NULL));
   
   
   Print(-1<1 u); 
   Print(-1*1 ull);
  }

このスクリプトの最初の行は、MQL5で コンパイルされているいくつかのリテラルの型名を出力します。

Cのスペシャリストが訂正してくれることを願っています。記事の資料、スクリプトの出力、そして私たちの議論に基づいて、ロジックを理解してみてください。

Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
  • 2024.06.11
  • Vladimir Simakov
  • www.mql5.com
Опубликована статья Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных : Автор: Oleh Fedorov...