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


468

私が書いたC ++プログラムをコンパイルするのが難しいです。

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

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

ここに画像の説明を入力してください

このプログラムを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(バージョン3.0トランク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つのコンパイラすべてが本当に壊れているため、この単純なプログラムをコンパイルできないのでしょうか。

回答:


173

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

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

コンパイラはその形式をサポートしていないため(つまり、基本的なソース文字セットにマップできません)、それ以降の処理段階に進むことができないため、エラーが発生します。コンパイラがイメージから基本的なソース文字セットへのマッピングをサポートすることは完全に可能ですが、必須ではありません。

このマッピングは実装定義なので、実装のドキュメントを調べて、サポートされているファイル形式を確認する必要があります。通常、すべての主要なコンパイラベンダーは、テキストファイル(通常は一連の文字)によって作成された(正規に定義された)テキストファイルをサポートします。


C ++標準はC標準(§1.1/ 2)に基づいており、C(99)標準は§1.2で次のように述べていることに注意してください。

この国際標準は指定していません
— Cプログラムがデータ処理システムで使用するために変換されるメカニズム。
—データ処理システムで使用するためにCプログラムが呼び出されるメカニズム。
—入力データがCプログラムで使用するために変換されるメカニズム。

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


23
その文はせいぜい曖昧だと思う。Merriam-Webster辞書によると、テキスト、書面または印刷された作品、またはそのようなテキストを含む作品の元の単語と形式であるとのことです。このソースファイルは明らかにその定義に該当します。Core Language Working Groupに欠陥レポートを提出する必要があると思いますか?
James McNellis、2011

15
ああ; 参照されているすべてのドキュメントを読むのを完全に忘れていました。ただし、この段落は文脈から外れたものだと思うので、ISO / IEC 9899:1990の全体を読み、完全に理解したらここに投稿します。
James McNellis、2011

575

もともとはOverv @ redditから。


19
ベスト。BMP形式。仕様図。ずっと。
Tobias Kienzler、2011

49
OPエラーはbmpの代わりにpngを使用することでしたか?
subsub

1
この美しい答えに触発されて、brainf ***にも同じようなことをすることにしました。blog.dreasgrech.com/ 2011/04
Andreas


211

あなた<>(そして ){}非常によく一致していないようです。それらをよりよく描いてみてください。


44
手書きをおかしくしていただきありがとうございます。これが本当の問題である可能性があり、名前を変更したhelloworld.cppをVisual C ++でコンパイルしようとすると発生するエラーを説明します:「致命的なエラーC1004:予期しないエラーファイルが見つかりました」もう一度やり直して、すぐに報告します。ありがとう!
James McNellis、2011

37
@Jamesは、すべてのpng最適化をオフにしてください。デバッグが容易になります。
ヴィルヘルムテル、2011

5
@ジェームズ:「予期しないファイルの終わり」は、ほぼ間違いなく、それが}問題の原因であるということを意味します。{
それと

156

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

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

110

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


73
残念ながら、これは私の手がサポートする唯一のフォントです。これが原因でC ++でプログラミングできない場合、それは非常に悲しいことです。Javaはこのフォントをサポートすると思いますか?
James McNellis、2011

8
とにかく漫画を描くことを考えるときは、Comic Sansが必要になるので、ハンドのアップグレードを真剣に検討する必要があります。
シャープトゥース

8
C ++では、書道の1年間のトレーニングが必要です。時間がない場合は、Visual Basicまたはバイナリマシンコードを試してください(その場合、0と1を正しく取得する必要があります)。
フランクオスターフェルド

1
@Frank C ++ 0x§42.1/ 1は「すべての文字列はゴシックでなければならない」と規定しています。
Mateen Ulhaq

75

最後のブレースの後に改行が表示されません。

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


16
うーん。ありがたいことに、このばかげたルールはC ++ 0xで削除されました。そうは言っても、そのようなファイルをどのように改行で終了させるのでしょうか?テキストの最後に十分な余地を残したと思いました(ソースファイルを強調表示すると、余った余地が表示されます)。ヒントをありがとう!
James McNellis、2011

8
十分な空白がない場合は、システムでコンパイルしてみます。モニターが4つあるので、左端のモニターからコンパイルしてみることができます。
ブリキの男

74

このプログラムは有効です-エラーはありません。

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

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

ウイルスは嫌いです。


17
はい、Linuxをインストールしてみてください。あなたの問題はWindowsのせいです。
Raedwald、2011

62

モニターのガラスにマジックマーカーでコードを書かない方が便利ですが、実際に黒くても見栄えが良いです。画面がすぐにいっぱいになると、私にきれいなモニターをくれた人から毎週名前が呼ばれます。

何人かの従業員(私はマネージャーです)が、つまみのある赤いパッドコンピューターの1つを購入するためにチップを購入しています。彼らは、私はマーカーは必要ないだろうと言って、それがいっぱいになったときに自分で画面をきれいにすることができますが、私は慎重に振る必要があります。そのようにデリケートだと思いました。

それが私が賢い人を雇う理由です。


2
Wacom Cintiqは、マネージャーにとってはるかに適切です。それは高価であり、あなたは本当に重要だと感じさせます。社内のグラフィックデザイナーはステータスがはるかに低いため、EGAモニターを使用する必要があります。管理人はCGAモニターを使用する必要があります。プログラマーは、中古のモノクロ端末を使用する必要があります。
Steve314

7
「Life Like」モニターを長い間使用していました。泳いでいる魚のスクリーンセーバーが本物だと誓うほど現実的で、小さなダイバーの男は泳いでいるように見えました。宝箱を下から狙おうとして腕を濡らし続けました。唯一の問題は、スクリーンセーバーが常にオンになっていて、リアルな泡立つノイズが聞こえにくいことでした。ああ、彼らはメンテナンスのために毎日モニターの上にものをふりかさないとスクリーンセーバーが機能しなくなると言っていました。それは一度だけでした、そして男の子、2日後のにおいは本当に現実的でした。
ティンマン

59

File format not recognizedファイルを適切にフォーマットする必要があります。つまり、コードに適切な色とフォントを使用します。これらの色はコンパイラによって異なるため、各コンパイラの特定のドキュメントを参照してください;)


14
ああ、そういうのは理にかなっています...私は96クレヨンの箱を持っているので、正しい前景色があると確信しています。明日、色付きの画用紙をピックアップして、別の色の紙で試します。
James McNellis、2011

3
安全のために、色鉛筆と油性ペンキも用意してください。C ++が正しくフォーマットするのが非常に難しい言語であることはよく知られている事実です。
helloworld922

うん、そしてハイライトマーカーを使うことを忘れないでください。
シャープトゥース2011

6
@sharptooth-構文の強調表示はIDEの機能です。手動で行うことを意図したものではありません。そのため、ロボットアームをそのハイライトマーカーに合わせて移動してください。
Steve314、

56

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

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

8
ああ!プリプロセッサはコンパイラに含まれていると思いました!私のWindowsラップトップで動作するプリプロセッサを見つけようとします。
James McNellis、2011

3
@James McNellis:プリプロセッサはプログラムではなく、ハイライトマーカーのように見えるハードウェアです。テキストの上に移動すると、プリプロセスされます。
シャープトゥース2011

49

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

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

あなたが本当に冒険好きなら、あなたは自分のコードをワープロに書き込もうとするかもしれません。できればOCR-Aなどのフォントを使用して印刷します。次に、プリントアウトを取得してスキャンします。スキャンは、サードパーティのOCRパッケージを介して実行され、テキストフォームを生成できます。次に、テキスト形式は、多くの標準コンパイラーの1つを使用してコンパイルできます。

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


鶏と卵のジレンマ:OCRソフトウェアのC ++コードを記述して、OCRなしでコンパイルすることは可能ですか?
jweyrich、2011

5
ええと、元のOCRのアセンブリを使用します。
ケビンラッカーメント2011

@jweyrich-最初にasm / OCRツールチェーンでC ++ / OCRをブートストラップする必要があると思います。
マイケルバー

2
ああASM、はい!パンチカードのASM
jweyrich、2011

46

以下のインクルードを描画してコンパイルします。

#include <ChuckNorris>

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


46
個人的には好き#include <JonSkeet>です。
Icode4food 2011

40

残念ながら、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?

10
#pragmaコンパイラに「メッセージを送る」には正しい方法だと思いましたか?
Lev Bishop

33

これを試してください:

スペースシャトルで恐竜を見ましたか?


4
タイプミスがあると思います- (1)endlではなくend1(L)でなければなりません。しかし、+ 1はうまくいきました!
Rupの

44
私はこれを3時間見つめていましたが、恐竜やスペースシャトルはまだ見えません。:-(
oosterwal

32

コンパイラはエキスパートモードに設定されていますか?はいの場合は、コンパイルできません。最近のコンパイラーは「Hello World!」に飽きています。


27

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 _ |
_|

公平に言うと、これはかなり良いです。


4
うわー、筆跡をスキャンしてみたところ、OCRが向上しました(何時間もかけて直筆に書きました)。
James P.

40
Perlタグを追加する必要があると思います。
MSalters 2011

26

helloworld.png:ファイルが認識されない:ファイル形式が認識されない

もちろん、ハードドライブをフォーマットする必要があります。

本当に、これらのエラーは読みにくいものではありません。


20

プログラムをPNGからASCIIに変換しましたが、まだコンパイルできません。参考までに、100と250文字の線幅で試しましたが、どちらも同等の結果が得られます。

   `         `  .     `.      `         ...                                                         
   +:: ..-.. --.:`:. `-` .....:`../--`.. `-                                                         
           `      `       ````                                                                      
                                                                      `                             
   ` `` .`       ``    .`    `.               `` .      -``-          ..                            
   .`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :                            
   .`         ` `    ` .`         ````:``  -                  ` ``-.`  `                            
   `-                                ..                           ``                                
    .       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `       
           `:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `     
            ``  `       ```.      ``    ````    `       `     `        `    `         `   `   .     
            : -...`.- .` .:/ `                                                                      
    -       `             `` .                                                                      
    -`                                                                                              
    `                                                                                               

8
代わりにおそらく80列または72列を使用する必要があります
Tobias Kienzler

16

最初の問題は、メイン関数の最後に誤った値を返そうとしていることです。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を指します。

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


3
ゼロはヌルセットではないので、スラッシュをゼロの桁に通した場合、宿題や試験のポイントを誰が取るのかというときに、教授が戻ってきました。彼はこの答えをいただければ幸いです。
Michael Burr


13

コンパイラはASCIIを期待していますが、そのプログラムは明らかにEBCDICを使用して書かれています。


最後に、C ++ではプログラムをASCII、UTF-8などで記述する必要があるとは規定されていないと聞きました。
エイドリアンラトナパラ2011年

8

画像をコンパイルしようとしています。

main.cppというドキュメントに手書きで入力した内容を入力し、そのファイルをコンパイラーで実行してから、出力ファイルを実行します。


23
PCで日付を確認します。
James P.

14
はは、でもやっと簡単な答えが見つかる!
Cody Grey

10
これはばかげています。コンパイラーが空白を最適化し、非常に圧縮された黒スペースのみを残してすべて1にして、エラーとして返されるバイナリ1に圧縮することは誰でも知っています。コードは0にコンパイルされ、エラーを返さないホワイトアウトを使用して記述する必要がありました。
ティンマン

7

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

:0}


5

追加 :

using namespace std;

インクルードの直後:P:D


5
いつもタイプアウトstdする方が好きです。取得しないように通知します。
Mateen Ulhaq


5

問題は構文定義にあります。定規とコンパスを使用して、より古典的な説明を試してください!

乾杯、


5

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


5

ブラケットに異なる色を試すことができますが、緑や赤が役立つでしょう。あなたのコンパイラは黒インクを認識できないと思います:P


5

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


4
これは、大文字のOであり、「diameter」と呼ばれる特別な行を持っています。これは、コンパイラに中点サークルアルゴリズムを使用するように指示します。目を離さない方がいいと思います。
Mateen Ulhaq
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.