web-dev-qa-db-ja.com

このプログラムが3つのC++コンパイラによって誤って拒否されたのはなぜですか?

私が書いたC++プログラムをコンパイルするのに苦労しています。

このプログラムは非常に単純で、私の知る限りではC++標準に規定されているすべての規則に準拠しています。念のため、ISO/IEC 14882:2003の全体を2回読みました。

プログラムは次のとおりです。

enter image description here

これは、Visual C++ 2010でこのプログラムをコンパイルしようとしたときに受け取った出力です。

c:\dev>cl /nologo helloworld.png
cl : Command line warning D9024 : unrecognized source file type 'helloworld.png', object file assumed
helloworld.png : fatal error LNK1107: invalid or corrupt file: cannot read at 0x5172

残念ながら、私はg ++ 4.5.2を試しましたが、それは同様に役に立たなかった:

c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status

Clang(version 3.0 trunk 127530)は、その規格への適合性が高く評価されているので、動かなければならないと考えました。残念なことに、それは私にそのきれいで、強調されたエラーメッセージのうちの1つさえ与えなかった:

c:\dev>clang++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
clang++: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

正直に言うと、これらのエラーメッセージの意味がわかりません。

他の多くのC++プログラムは .cpp 拡張子の付いたソースファイルを持っているので、おそらく私は自分のファイルの名前を変更する必要があると思いました。私はその名前を helloworld.cpp に変更しましたが、それは役に立ちませんでした。 Clangには非常に深刻なバグがあると思います。名前を変更したプログラムをコンパイルしようとすると、反転して「84の警告と20のエラーが発生しました」と表示されたためです。そして私のコンピュータのビープ音をたくさん鳴らしました!

私はここで何をしましたか。 C++標準の重要な部分を見逃したことはありますか?それとも3つのコンパイラすべてが本当に壊れていて、この単純なプログラムをコンパイルできないのでしょうか。

471
James McNellis

規格では、§2.1/ 1は次のように規定しています。

物理ソースファイルの文字は、必要に応じて、実装定義の方法で基本ソース文字セットにマッピングされます(行末インジケータ用の改行文字の導入)。

あなたのコンパイラはそのフォーマットをサポートしていません(別名 基本ソースキャラクタセット にマッピングすることはできません)、それ以降の処理段階に移行することはできません。あなたのコンパイラがimageから基本的なソース文字セットへのマッピングをサポートすることは完全に可能ですが、それは必須ではありません。

このマッピングはインプリメンテーション定義なので、それがサポートするファイルフォーマットを見るためにあなたの実装ドキュメントを見る必要があります。通常、すべての主要なコンパイラベンダは(標準的に定義された)テキストファイルをサポートしています。テキストエディタで作成されたファイル、通常は一連の文字。


C++標準はC標準(1.1/2)に基づいており、C(99)標準は1.2で次のように述べています。

この国際規格は規定していない
- データ処理システムによる使用のためにCプログラムが変換されるメカニズム。
- データ処理システムによる使用のためにCプログラムが呼び出されるメカニズム。
- 入力データがCプログラムによる使用のために変換されるメカニズム。

したがって、やはり、ソースファイルの扱いは、コンパイラのドキュメントで見つける必要があるものです。

174
GManNickG

もともと Overv @ reddit から。

576
Sven

この方法を試してください:

enter image description here

320
Benoit

あなたの<>(){}はあまり一致しないようです。よく描いてみてください。

212
Bala R

次のpythonスクリプトを試すことができます。 _ pil _ および pytesser をインストールする必要があることに注意してください。

from pytesser import *
image = Image.open('helloworld.png')  # Open image object using PIL
print image_to_string(image)     # Run tesseract.exe on image

それを使うには:

python script.py > helloworld.cpp; g++ helloworld.cpp
157
sje397

フォントとしてComic Sansを使用するのを忘れたため、エラーが発生します。

111
bl00dshooter

最後の括弧の後に改行は表示されません。

ご存じのとおり、「空でないソースファイルが改行文字で終わらない場合、...動作は未定義です」。

76
Michael Burr

このプログラムは有効です - 私はエラーを見つけることができません。

私の推測では、あなたはあなたのマシンにウイルスがあります。ドライブを再フォーマットして、オペレーティングシステムを再インストールするのが最善です。

それがどのように機能するか、または再インストールの支援が必要な場合は、Googleまでお知らせください。

私はウイルスが嫌いです。

75
Jerry Asher

私はそれが本当に黒くなるといいように見えても、それは私のモニターのガラスの上に魔法のマーカーで私のコードを書かないのを助けているのを見つけました。画面がいっぱいになり過ぎると、きれいなモニターをくれる人から毎週私の名前が呼ばれます。

私の従業員の何人か(私はマネージャーです)が、つまみ付きのこれらの赤いパッドのコンピューターの1つを私に買ってくれています。彼らは私がマーカーを必要としない、そして私がそれが一杯になったとき私は自分でスクリーンをきれいにすることができると言ったが、私は慎重にそれを振る必要がある。私はそれがそのように繊細だと思いました。

だからこそ私は賢い人々を雇います。

63
the Tin Man

File format not recognizedファイルを正しくフォーマットする必要があります。それはあなたのコードに正しい色とフォントを使うことを意味します。これらの色はコンパイラによって異なりますので、各コンパイラの具体的な説明を参照してください。

60
helloworld922

あなたはプリプロセッサを忘れました。これを試して:

pngtopnm helloworld.png | ocrad | g++ -x 'c++' -
57
Andrew Cooper

プログラムを手書きしてからコンピュータにスキャンしましたか?それが "helloworld.png"によって暗示されていることです。その場合、C++標準は(最新版でも)光学式文字認識を必要としないことに注意する必要があります。残念ながら、現在のコンパイラにはオプション機能として含まれていません。

グラフィックをテキスト形式に置き換えることを検討してください。任意のプレーンテキストエディタを使用できます。ワープロを使用すると、きれいなプリントアウトを生成できますが、スキャンしようとしたときと同じエラーが発生する可能性があります。

あなたが本当に冒険好きなら、あなたはあなたのコードをワープロに書き込もうとするかもしれません。できれば OCR-A のようなフォントを使って印刷してください。次に、印刷物を取り出してスキャンします。その後、スキャンをサードパーティのOCRパッケージを介して実行し、テキストフォームを生成できます。テキストフォームはその後、多くの標準的なコンパイラのうちの1つを使ってコンパイルされるかもしれません。

ただし、デバッグ段階でこれが発生することになる多額の紙のコストに注意してください。

49

以下のようにインクルードしてコンパイルします。

#include <ChuckNorris>

私は彼が構文エラーをコンパイルできると聞きます...

46
Grofit

残念ながら、C++だけでなく、すべてが複数の言語をサポートする3つのコンパイラを選択しました。彼らは皆あなたが使ったプログラミング言語を推測しなければなりません。ご存知のとおり、PNG形式はC++だけでなく、すべてのプログラミング言語に適しています。

通常、コンパイラは言語自体を把握できます。たとえば、PNGが明らかにクレヨンで描かれている場合、コンパイラはそれにVisual Basicが含まれていることを認識します。シャープペンシルで描いたように見える場合は、作業中のエンジニアを見分けるのは簡単で、FORTRANコードを書きます。

この場合、この2番目のステップでもコンパイラは役に立ちません。 CとC++は見た目が似すぎて、#includeになります。したがって、コンパイラが実際にどの言語であるかを判断するのを手助けしなければなりません。今、あなたは非標準的な方法を使うことができます。たとえば、Visual Studioコンパイラは /TCおよび/ TP コマンドライン引数を受け入れます。または、プロジェクトファイルで "Compile as:C++"オプションを使用することもできます。 GCCとCLangには独自のメカニズムがありますが、私は知りません。

したがって、次のコードがC++であることをコンパイラに伝えるために、代わりに標準の方法を使用することをお勧めします。あなたが今までに発見したように、C++コンパイラはそれらが受け入れるものについて非常にうるさいです。したがって、C++を識別するための標準的な方法は、脅迫プログラマがC++コードに追加することです。例えば、次の行はあなたのコンパイラに続くものがC++であることを明確にするでしょう(そして彼は文句なしにそれをコンパイルした方がいいです)。

// To the compiler: I know where you are installed. No funny games, capice?
41
MSalters

コンパイラはエキスパートモードに設定されていますか。そうであれば、コンパイルするべきではありません。現代のコンパイラは "Hello World!"にうんざりしています。

33
zamanbakshi

これを試してください。

Do you see the dinosaur in the space shuttle?

33
Chris Cudmore

OCRは言う:

N lml_�e <loJ+_e__}

.lnt Mk.,n ( ln+ _rSC Lhc_yh )
h_S_
_l

s_l . co__ <, " H llo uo/_d ! '` << s l� . ena_ .
TP__rn _ |
_|

公正であるために、これはかなり気のいいことです。

27
Robin Duckett

helloworld.png:ファイルが認識されない:ファイル フォーマット 認識されない

明らかに、あなたはあなたのハードドライブをフォーマットするべきです。

本当に、これらのエラーはそれほど難しくありません。

26
Chris Cudmore

あなたのプログラムをPNGからASCIIに変換しましたが、まだコンパイルされていません。あなたの情報のために、私は100と250文字の線幅で試してみましたが、どちらも匹敵する結果をもたらします。

   `         `  .     `.      `         ...                                                         
   +:: ..-.. --.:`:. `-` .....:`../--`.. `-                                                         
           `      `       ````                                                                      
                                                                      `                             
   ` `` .`       ``    .`    `.               `` .      -``-          ..                            
   .`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :                            
   .`         ` `    ` .`         ````:``  -                  ` ``-.`  `                            
   `-                                ..                           ``                                
    .       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `       
           `:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `     
            ``  `       ```.      ``    ````    `       `     `        `    `         `   `   .     
            : -...`.- .` .:/ `                                                                      
    -       `             `` .                                                                      
    -`                                                                                              
    `                                                                                               
21
Yves

最初の問題は、メイン関数の最後に誤った値を返そうとしているということです。 C++標準では、main()の戻り型はintであると規定されていますが、代わりに空のセットを返そうとしています。

もう1つの問題は、少なくともg ++では、コンパイラがファイル接尾辞から使用されている言語を推測することです。 g ++(1)から:

どの入力ファイルに対しても、ファイル名の接尾辞によって、どのような種類のコンパイルが行われるかが決まります。

file.cc file.cp file.cxx file.cpp file.CPP file.c ++ file.C

前処理が必要なC++ソースコード。 .cxxでは、最後の2文字は両方とも文字通りxでなければならないことに注意してください。同様に、.Cは文字の首都Cを表します。

これらを修正すると、デモ here からわかるように、完全に機能するHello Worldアプリケーションが残るはずです。

16
Antti Laine

あなたのフォントは吸う、パーサーはこれをどのように読むことができるはずですか?書道コースを受講する。

15
Frank Osterfeld

あなたのコンパイラは _ ascii _ を期待していますが、そのプログラムは 明らかに _ ebcdic _ を使って書かれています。

13
oosterwal

あなたは画像を編集しようとしています。

あなたが手書きで書いたものをmain.cppと呼ばれる文書にタイプし、あなたのコンパイラを通してそのファイルを実行し、そして出力ファイルを実行してください。

8
William

コロン最後の閉じ括弧の直前で始まる出力の精度を指定する必要があります。出力は数値ではないため、精度はゼロであるため、これが必要です-

:0}

7
MikeJ-UK

追加:

using namespace std;

その直後:P:D

6
Spyros

あなたのコンパイラはそのようなhmm ...エンコーディングのファイルをサポートしていないようです。それをASCIIに変換してみてください。

角かっこの色を変えてみることもできますが、多少の緑か赤が役に立つでしょうか。あなたのコンパイラは黒インクを認識できないと思います:P

5
lothar

'return'とセミコロンの間の文字を認識できないのは私だけですか?それはそれかもしれません!

5
techolic

入力インターフェースを切り替えてみてください。 C++では、スキャナではなくキーボードがコンピュータに接続されていると想定しています。ここで周辺機器の競合の問題があるかもしれません。キーボード入力インタフェースが必須であるかどうか私はISO規格にチェックインしませんでした、しかしそれは私が今まで使ったことがあるすべてのコンパイラに当てはまります。しかし、C99でスキャナ入力が利用可能になっているかもしれません。この場合、あなたのプログラムは実際に動作するはずです。そうでなければ、コンパイラの次の標準リリースとアップグレードを待つ必要があります。

5
kriss

問題は構文の定義にあります。もっと古典的な説明をするためには、支配者とコンパスを使ってみてください。

乾杯、

5
quarkonium

OCRを介してコンパイラを実行します。それは互換性の問題を解決するかもしれません。

4
James P.