467 Stimmen

Warum wird dieses Programm von drei C++-Compilern fälschlicherweise abgelehnt?

Ich habe Schwierigkeiten beim Kompilieren eines C++-Programms, das ich geschrieben habe.

Dieses Programm ist sehr einfach und entspricht, soweit ich weiß, allen Regeln des C++-Standards. Ich habe die gesamte ISO/IEC 14882:2003 zweimal durchgelesen, um sicherzugehen.

Das Programm sieht folgendermaßen aus:

enter image description here

Hier ist die Ausgabe, die ich erhielt, als ich versuchte, dieses Programm mit Visual C++ 2010 zu kompilieren:

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

Enttäuscht versuchte ich es mit g++ 4.5.2, aber auch das war nicht hilfreich:

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

Ich dachte mir, dass Clang (Version 3.0 trunk 127530) funktionieren muss, da es für seine Standardkonformität so hoch gelobt wird. Leider hat es mir nicht einmal eine seiner hübschen, hervorgehobenen Fehlermeldungen angezeigt:

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)

Um ehrlich zu sein, weiß ich nicht wirklich, was diese Fehlermeldungen bedeuten.

Viele andere C++-Programme haben Quelldateien mit einer .cpp Erweiterung, also dachte ich, dass ich meine Datei vielleicht umbenennen müsste. Ich änderte ihren Namen in helloworld.cpp aber das hat nicht geholfen. Ich glaube, es gibt einen sehr schwerwiegenden Fehler in Clang, denn als ich versuchte, das umbenannte Programm damit zu kompilieren, flippte es aus, gab "84 Warnungen und 20 Fehler generiert" aus und ließ meinen Computer viel piepen!

Was habe ich hier falsch gemacht? Habe ich einen kritischen Teil des C++-Standards übersehen? Oder sind alle drei Compiler wirklich so kaputt, dass sie dieses einfache Programm nicht kompilieren können?

575voto

Sven Punkte 2927

Ursprünglich von Overv @ reddit .

19 Stimmen

Beste. BMP-Format. Spezifische Illustration. Immer.

1 Stimmen

Inspiriert von dieser schönen Antwort habe ich beschlossen, etwas Ähnliches für brainf*** zu machen: blog.dreasgrech.com/2011/04/

320voto

Benoit Punkte 72929

Versuchen Sie es auf diese Weise:

enter image description here

211voto

Bala R Punkte 104615

Ihr < et > , ( et ) , { et } scheinen nicht sehr gut zusammenzupassen; versuchen Sie, sie besser zu zeichnen.

44 Stimmen

Obwohl ich es nicht schätze, dass Sie sich über meine Handschrift lustig machen, könnte dies das eigentliche Problem sein und würde den Fehler erklären, den ich erhalte, wenn ich versuche, die umbenannte helloworld.cpp mit Visual C++: "fatal error C1004: unexpected end-of-file found" Ich werde es noch einmal versuchen und bald berichten. Danke!

37 Stimmen

@James stellen Sie sicher, dass Sie alle png-Optimierungen ausschalten. Das erleichtert die Fehlersuche.

5 Stimmen

@James: "Unerwartetes Ende der Datei" bedeutet mit ziemlicher Sicherheit, dass es sich um Ihre } die das Problem verursacht. Versuchen Sie, das mit dem {

173voto

GManNickG Punkte 476445

In der Norm wird in §2.1/1 spezifiziert:

Die physischen Zeichen der Quelldatei werden auf eine implementierungsdefinierte Weise auf den grundlegenden Quellzeichensatz abgebildet (wobei gegebenenfalls neue Zeilenumbruchzeichen für Zeilenende-Indikatoren eingeführt werden).

Ihr Compiler unterstützt dieses Format nicht (d.h. er kann es nicht auf die Grundlegender Quellzeichensatz ) und kann daher nicht weiterverarbeitet werden, daher der Fehler. Es ist durchaus möglich, dass Ihr Compiler eine Abbildung vom Bild auf den Basiszeichensatz unterstützt, dies ist jedoch nicht erforderlich.

Da diese Zuordnung implementierungsabhängig ist, müssen Sie in der Dokumentation Ihrer Implementierung nachsehen, welche Dateiformate sie unterstützt. In der Regel unterstützt jeder größere Compilerhersteller (kanonisch definierte) Textdateien: jede Datei, die von einem Texteditor erzeugt wird, typischerweise eine Reihe von Zeichen.


Beachten Sie, dass der C++-Standard auf dem C-Standard basiert (§1.1/2), und der C(99)-Standard sagt in §1.2:

Diese Internationale Norm legt nicht fest
- der Mechanismus, mit dem C-Programme für die Verwendung durch ein Datenverarbeitungssystem umgewandelt werden System umgewandelt werden;
- der Mechanismus, mit dem C-Programme zur Verwendung durch eine Datenverarbeitungsanlage aufgerufen werden System aufgerufen werden;
- der Mechanismus, mit dem Eingabedaten zur Verwendung durch ein C-Programm umgewandelt werden;

Auch hier gilt, dass Sie die Behandlung von Quelldateien in der Dokumentation Ihres Compilers nachlesen müssen.

23 Stimmen

Ich denke, dieser Satz ist bestenfalls zweideutig. Das Merriam-Webster-Wörterbuch sagt, dass Text es der ursprüngliche Wortlaut und die Form eines geschriebenen oder gedruckten Werks o ein Werk, das einen solchen Text enthält . Diese Quelldatei fällt eindeutig unter diese Definition. Sollte ich Ihrer Meinung nach einen Fehlerbericht bei der Core Language Working Group einreichen?

0 Stimmen

@James: Ich habe meine Antwort korrigiert.

15 Stimmen

Oh, ich habe ganz vergessen, alle Dokumente zu lesen, auf die verwiesen wird. Ich denke aber, dass dieser Absatz aus dem Zusammenhang gerissen ist. Ich werde also die gesamte ISO/IEC 9899:1990 lesen und hier wieder posten, sobald ich sie vollständig verstanden habe.

156voto

sje397 Punkte 40297

Sie können das folgende Python-Skript ausprobieren. Beachten Sie, dass Sie Folgendes installieren müssen PIL y pytesser .

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

Um es zu verwenden, tun Sie:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X