「undeclared identifier」の原因は、まさかの改行コード

知人からもらったインジケーターを組み込んだEAを作ろうとした時のこと。

コーディングを無事終え、コンパイルしてみたところ、以下のエラーが発生しました。

undeclared identifier

直訳すると「宣言されていない識別子」です。

「ん?変数の宣言を忘れてたかな?」と思ってコードを見ても、異常なし。見落としがあるのかと思って、殆どのコードをコメントアウトして、からっぽに近いコードにしても変化なし。

一般的な原因は変数宣言忘れかスコープ間違い
通常はdouble valiableName;などと変数を宣言してから、valiableName = 10.5;のように値を代入しますが、double valiableName;の記述を忘れて、いきなりvaliableName = 10.5;と書いてコンパイルするとこのエラー(エラーコード:256)が表示されます。宣言しているのにこのエラーが出る場合は、変数のスコープ(有効範囲)が正しくないことが考えられます。{}で囲まれたブロックの中で宣言した変数は、その中でしか使えません。例えば、for文の中で宣言した変数をfor文の外で参照しようとすると、このエラーが発生します。この場合、for文の外で宣言すればOKです。外で宣言したものは中でも使えます。

ハマりました。

意味不明です。殆ど空のファイルで、おかしなところなんてあり得ません。試しに過去作成したMQ4ファイルをコンパイルしてみたら、ちゃんとコンパイルできました。

やっぱり、今のコードに問題があるようです。八方ふさがりで「う~ん」と悩むこと30分程。

ふと、改行コードが目に入りました。

「あれ?LFになってる…。え、もしかして!?」

改行コードをLF⇒CR+LFに変更してから再コンパイルしたら、無事コンパイル通りました!

知人が送ってくれたファイルの改行コードがLFだったのが原因でした。

デフォルトの改行コードは、OSによって異なります。

改行コードOS
LFUnix系
CR+LFWindows
CRMac

上記表から、おそらくインジケーターはUnix系OSで作られたのでしょう。Windowsを使ってる人は、普通、改行コードはCR+LFになりますから。

と言うか、多くの人は改行コードなんて意識すらしてないと思います。

同じ問題で苦しんでいる方の参考になれば幸いです。

教訓

MQ4ファイルの改行コードがLFの場合、コンパイルエラーになってしまいます。その場合、CR+LFに変換しましょう。他人からもらったMQ4ファイルは要注意です!

なかなか気づきにくいエラーです。
吹き出し

MT4の無料プログラミング講座

メルマガ登録して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG