Warum wird dieses Programm von drei C ++ – Compilern fälschlicherweise zurückgewiesen?

Ich habe etwas Schwierigkeit, ein C ++ Programm zu kompilieren, das ich geschrieben habe.

Dieses Programm ist sehr einfach und entspricht nach meinem besten Wissen allen Regeln des C ++ Standards. Ich habe die Gesamtheit von ISO / IEC 14882: 2003 zweimal gelesen, um sicher zu sein.

Das Programm ist wie folgt:

Bildbeschreibung hier eingeben

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 g ++ 4.5.2, aber es war ebenso wenig hilfreich:

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

Ich habe mir gedacht, 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 gegeben:

 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, ich weiß nicht wirklich was diese Fehlermeldungen bedeuten.

Viele andere C ++ – Programme haben Quelldateien mit der Erweiterung .cpp , daher dachte ich, ich müsste meine Datei umbenennen. Ich habe seinen Namen in helloworld.cpp geändert , aber das hat nicht geholfen. Ich denke, es gibt einen sehr ernsten Bug in Clang, weil, als ich es benutze, um das umbenannte Programm zu kompilieren, es ausgeklappt, “84 Warnungen und 20 Fehler erzeugt” gedruckt hat. und machte meinen Computer viel piepen!

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

Solutions Collecting From Web of "Warum wird dieses Programm von drei C ++ – Compilern fälschlicherweise zurückgewiesen?"

In der Norm spezifiziert §2.1 / 1:

Physikalische Quelldateizeichen werden in einer implementationsdefinierten Weise dem grundlegenden Quellenzeichensatz (Einführung neuer Zeilenzeichen für Zeilenende-Indikatoren) bei Bedarf zugeordnet.

Ihr Compiler unterstützt dieses Format nicht (aka kann es nicht dem grundlegenden Quellzeichensatz zuordnen ), sodass es nicht in weitere Verarbeitungsstufen verschoben werden kann, daher der Fehler. Es ist durchaus möglich, dass Ihr Compiler eine Zuordnung von Bild zu Quellcode unterstützt, aber nicht benötigt wird.

Da diese Zuordnung implementierungsdefiniert ist, müssen Sie sich die Implementierungsdokumentation ansehen, um die unterstützten Dateiformate zu sehen. In der Regel unterstützt jeder größere Compileranbieter (kanonisch definierte) Textdateien: jede Datei, die von einem Texteditor erstellt wird, typischerweise eine Reihe von Zeichen.


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

Diese Internationale Norm legt nicht fest
– der Mechanismus, mit dem C-Programme zur Verwendung durch ein Datenverarbeitungssystem umgewandelt werden;
– der Mechanismus, mit dem C-Programme zur Verwendung durch ein Datenverarbeitungssystem aufgerufen werden;
– der Mechanismus, mit dem Eingabedaten zur Verwendung durch ein C-Programm transformiert werden;

Also, die Behandlung von Quelldateien ist etwas, was Sie in Ihrer Compiler-Dokumentation finden müssen.

Ursprünglich von Overv @ reddit .

Versuche diesen Weg:

Bildbeschreibung hier eingeben

Ihr < und > , ( und ) , und < scheint nicht sehr gut zu passen; Versuche, sie besser zu zeichnen.

Sie könnten das folgende Python-Skript ausprobieren. Beachten Sie, dass Sie PIL und Pytesser installieren müssen .

 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 benutzen, mache:

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

Sie haben vergessen, Comic Sans als Schriftart zu verwenden, deshalb ist es ein Fehler.

Nach dieser letzten Klammer kann ich keine neue Zeile sehen.

Wie Sie wissen: “Wenn eine Quelldatei, die nicht leer ist, nicht in einem neuen Zeilenzeichen endet, … ist das Verhalten nicht definiert”.

Dieses Programm ist gültig – ich kann keine Fehler finden.

Ich vermute, Sie haben einen Virus auf Ihrem Rechner. Es wäre am besten, wenn Sie Ihr Laufwerk neu formatieren und das Betriebssystem neu installieren.

Lassen Sie uns wissen, wie das funktioniert, oder wenn Sie Hilfe bei der Neuinstallation benötigen.

Ich hasse Viren.

Ich habe herausgefunden, dass es hilfreich ist, meinen Code nicht mit einem magischen Marker auf das Glas meines Monitors zu schreiben, obwohl er gut aussieht, wenn er wirklich schwarz ist. Der Bildschirm füllt sich zu schnell und die Leute, die mir einen sauberen Monitor geben, rufen mich jede Woche an.

Ein paar meiner Angestellten (ich bin ein Manager) hacken ein, um mir einen dieser roten Pad-Computer mit den Knöpfen zu kaufen. Sie sagten, dass ich keine Marker brauche und ich kann den Bildschirm selbst reinigen, wenn er voll ist, aber ich muss vorsichtig sein, ihn zu schütteln. Ich nehme an, dass es so heikel ist.

Deshalb stelle ich die klugen Leute an.

File format not recognized Sie müssen Ihre Datei richtig formatieren. Das bedeutet, dass Sie die richtigen colors und Schriften für Ihren Code verwenden müssen. Siehe die spezifischen Dokumentationen für jeden Compiler, da diese colors zwischen den Compilern variieren;)

Sie haben den Preprozessor vergessen. Versuche dies:

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

Haben Sie das Programm handgeschrieben und dann in den Computer eingelesen? Das ist, was “helloworld.png” impliziert. Wenn dies der Fall ist, müssen Sie beachten, dass der C ++ – Standard (auch in seiner neuesten Ausgabe) keine optische Zeichenerkennung erfordert und leider nicht als optionale function in einem aktuellen Compiler enthalten ist.

Möglicherweise möchten Sie die Grafiken in ein Textformat transponieren. Jeder Klartext-Editor kann verwendet werden; Die Verwendung eines Textverarbeitungsprogramms, das einen hübschen Ausdruck erzeugen kann, führt höchstwahrscheinlich zu dem gleichen Fehler, der beim Scannen auftritt.

Wenn Sie wirklich abenteuerlustig sind, können Sie versuchen, Ihren Code in ein Textverarbeitungsprogramm zu schreiben. Drucken Sie es, vorzugsweise mit einer Schriftart wie OCR-A . Dann nehmen Sie Ihren Ausdruck und scannen ihn wieder ein. Der Scan kann dann durch ein OCR-Paket eines Drittanbieters ausgeführt werden, um ein Textformular zu generieren. Die Textform kann dann unter Verwendung eines von vielen Standard-Compilern kompiliert werden.

Beachten Sie jedoch die hohen Kosten für Papier, die während der Debugging-Phase anfallen.

Zeichnen Sie das folgende Include, um es kompilieren zu lassen:

 #include  

Ich höre, er kann Syntaxerrors kompilieren …

Leider haben Sie drei Compiler ausgewählt, die alle mehrere Sprachen unterstützen, nicht nur C ++. Sie alle müssen die verwendete Programmiersprache erraten. Wie Sie wahrscheinlich schon wissen, ist das PNG-Format für alle Programmiersprachen geeignet, nicht nur für C ++.

Normalerweise kann der Compiler die Sprache selbst herausfinden. Zum Beispiel, wenn das PNG offensichtlich mit Buntstiften gezeichnet wird, wird der Compiler wissen, dass es Visual Basic enthält. Wenn es aussieht, als wäre es mit einem mechanischen Bleistift gezeichnet, ist es einfach, den Ingenieur bei der Arbeit zu erkennen und FORTRAN-Code zu schreiben.

Dieser zweite Schritt hilft auch in diesem Fall dem Compiler nicht. C und C ++ sehen einfach zu ähnlich aus, bis auf #include . Daher müssen Sie dem Compiler bei der Entscheidung helfen, welche Sprache er wirklich ist. Jetzt könnten Sie Nicht-Standard-Mittel verwenden. Der Visual Studio-Compiler akzeptiert beispielsweise die Befehlszeilenargumente / TC und / TP oder Sie können die Option “Kompilieren als: C ++” in der Projektdatei verwenden. GCC und CLang haben ihre eigenen Mechanismen, die ich nicht kenne.

Daher würde ich empfehlen, stattdessen die Standardmethode zu verwenden, um Ihrem Compiler mitzuteilen, dass sich der folgende Code in C ++ befindet. Wie Sie inzwischen herausgefunden haben, sind C ++ – Compiler sehr wählerisch, was sie akzeptieren. Daher besteht die Standardmethode zur Identifizierung von C ++ darin, dass die Einschüchterungsprogramme ihren C ++ – Code hinzufügen. Zum Beispiel wird die folgende Zeile Ihrem Compiler verdeutlichen, dass C ++ folgt (und er sollte es besser ohne Beschwerden kompilieren).

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

Ist dein Compiler im Expertenmodus ?! Wenn ja, sollte es nicht kompilieren. Moderne Compiler haben genug von “Hello World!”

Probier diese:

Siehst du den Dinosaurier im Space Shuttle?

OCR sagt:

 N lml_ e  

Was ist verdammt gut, um fair zu sein.

helloworld.png: Datei nicht erkannt: Dateiformat nicht erkannt

Offensichtlich sollten Sie Ihre Festplatte formatieren.

Wirklich, diese Fehler sind nicht so schwer zu lesen.

Ich habe Ihr Programm von PNG nach ASCII konvertiert, aber es kompiliert noch nicht. Zu Ihrer Information habe ich es mit Zeilenbreiten von 100 und 250 Zeichen versucht, aber beide ergeben vergleichbare Ergebnisse.

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

Das erste Problem ist, dass Sie versuchen, einen falschen Wert am Ende der Hauptfunktion zurückzugeben. Der C ++ – Standard schreibt vor, dass der Rückgabetyp von main () int ist, Sie aber stattdessen versuchen, die leere Menge zurückzugeben.

Das andere Problem ist – zumindest mit g ++ -, dass der Compiler aus dem Dateisuffix die verwendete Sprache ableitet. Von g ++ (1):

Für jede gegebene Eingabedatei bestimmt das Dateinamensuffix, welche Art von Kompilierung durchgeführt wird:

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

C ++ – Quellcode, der vorverarbeitet werden muss. Beachten Sie, dass in .cxx die letzten beiden Buchstaben beide buchstäblich x sein müssen. In ähnlicher Weise bezieht sich .C auf ein buchstäbliches Kapital C.

Wenn Sie diese beheben, sollten Sie eine voll funktionsfähige Hello World-Anwendung erhalten, wie Sie der Demo hier entnehmen können.

Deine Schrift ist schlecht, wie sollte ein Parser das jemals lesen können? Nimm einen Kalligraphie-Kurs.

Ihre Compiler erwarten ASCII , aber dieses Programm wird offensichtlich mit EBCDIC geschrieben .

Sie versuchen, ein Bild zu kompilieren.

Geben Sie aus, was Sie manuell in ein Dokument namens main.cpp geschrieben haben, führen Sie diese Datei über Ihren Compiler aus, und führen Sie die Ausgabedatei aus.

Sie müssen die Genauigkeit Ihrer Ausgabe angeben, der ein Doppelpunkt unmittelbar vor der abschließenden geschweiften Klammer vorausgeht. Da die Ausgabe nicht numerisch ist, ist die Genauigkeit gleich Null.

: 0}

hinzufügen :

 using namespace std; 

gleich danach: P: D

Scheint, dass dein Compiler keine Dateien in dieser hmm … -Verschlüsselung unterstützt. Versuchen Sie es in ASCII zu konvertieren.

Das Problem liegt in der Syntaxdefinition. Versuchen Sie, Lineal und Zirkel für eine klassische Beschreibung zu verwenden!

Prost,

Versuchen Sie, die Eingangsschnittstelle zu wechseln. C ++ erwartet, dass eine Tastatur an Ihren Computer angeschlossen wird, kein Scanner. Hier kann es zu Konflikten zwischen den Peripherien kommen. Ich habe den ISO-Standard nicht überprüft, wenn die Tastatureingabe obligatorisch ist, aber das gilt für alle Compiler, die ich jemals benutzt habe. Aber vielleicht ist die Scannereingabe jetzt in C99 verfügbar, und in diesem Fall sollte Ihr Programm tatsächlich funktionieren. Wenn nicht, müssen Sie auf die nächste Standardversion und das Upgrade von Compilern warten.

Du könntest verschiedene colors für Klammern ausprobieren, vielleicht hilft etwas Grün oder Rot? Ich denke, dein Compiler kann schwarze Tinte nicht erkennen: P

Bin ich der Einzige, der den Charakter zwischen “Rückkehr” und dem Semikolon nicht erkennen kann? Das könnte es sein!