web-dev-qa-db-fra.com

Pourquoi ce programme est-il rejeté par erreur par trois compilateurs C ++?

J'ai quelques difficultés à compiler un programme C++ que j'ai écrit.

Ce programme est très simple et, à ma connaissance, est conforme à toutes les règles énoncées dans la norme C++. J'ai lu deux fois l'intégralité de l'ISO/CEI 14882: 2003 pour en être sûr.

Le programme est le suivant:

enter image description here

Voici le résultat que j'ai reçu en essayant de compiler ce programme avec 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

Découragé, j'ai essayé g ++ 4.5.2, mais c'était également inutile:

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

J'ai pensé que Clang (version 3.0 tronc 127530) devait fonctionner, car il est très apprécié pour sa conformité aux normes. Malheureusement, il ne m'a même pas donné l'un de ses jolis messages d'erreur mis en évidence:

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)

Pour être honnête, je ne sais pas vraiment ce que ces messages d'erreur signifient.

Beaucoup d'autres programmes C++ ont des fichiers sources avec une extension . Cpp, alors j'ai pensé qu'il me fallait peut-être renommer mon fichier. J'ai changé son nom en helloworld.cpp, mais cela n'a pas aidé. Je pense qu'il y a un bug très sérieux dans Clang car lorsque j'ai essayé de l'utiliser pour compiler le programme renommé, il s'est retourné et a imprimé "84 avertissements et 20 erreurs générées". et fait beaucoup biper mon ordinateur!

Qu'est-ce que j'ai mal fait ici? Ai-je oublié une partie essentielle de la norme C++? Ou les trois compilateurs sont-ils vraiment tellement endommagés qu'ils ne peuvent pas compiler ce programme simple?

470
James McNellis

Dans la norme, le § 2.1/1 spécifie:

Les caractères du fichier source physique sont mappés, de manière définie par l'implémentation, au jeu de caractères source de base (introduisant des caractères de nouvelle ligne pour les indicateurs de fin de ligne) si nécessaire.

Votre compilateur ne prend pas en charge ce format (il est impossible de le mapper sur le jeu de caractères source de base), il ne peut donc pas passer à d'autres étapes de traitement, d'où l'erreur. Il est tout à fait possible que votre compilateur prenne en charge un mappage de l'image au jeu de caractères source de base, mais ce n'est pas obligatoire.

Ce mappage étant défini par l'implémentation, vous devez consulter la documentation de votre implémentation pour connaître les formats de fichiers qu'il prend en charge. En règle générale, tous les principaux fournisseurs de compilateur prennent en charge les fichiers texte (définis canoniquement): tout fichier généré par un éditeur de texte, généralement une série de caractères.


Notez que la norme C++ est basée sur la norme C (§1.1/2) et que la norme C(99) dit, au § 1.2:

La présente Norme internationale ne spécifie pas
- le mécanisme par lequel les programmes C sont transformés pour être utilisés par un système de traitement de données;
- le mécanisme par lequel les programmes C sont appelés pour être utilisés par un système de traitement de données;
- le mécanisme par lequel les données d'entrée sont transformées pour être utilisées par un programme C;

Donc, encore une fois, le traitement des fichiers source est quelque chose que vous devez trouver dans la documentation de votre compilateur.

174
GManNickG

Originaire de Overv @ reddit .

576
Sven

Essayez de cette façon:

enter image description here

320
Benoit

Votre < et >, ( et ), { et } ne semblent pas très bien correspondre; Essayez de mieux les dessiner.

212
Bala R

Vous pouvez essayer le script python suivant. Notez que vous devez installer PIL et pytesser .

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

Pour l'utiliser, faites:

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

Vous avez oublié d'utiliser Comic Sans en tant que police, c'est pourquoi elle est erronée.

111
bl00dshooter

Je ne peux pas voir une nouvelle ligne après cette dernière accolade.

Comme vous le savez: "Si un fichier source non vide ne se termine pas par un caractère de nouvelle ligne, ... le comportement est indéfini".

76
Michael Burr

Ce programme est valide - je ne trouve aucune erreur.

Je suppose que vous avez un virus sur votre ordinateur. Il serait préférable de reformater votre lecteur et de réinstaller le système d'exploitation.

Dites-nous comment cela fonctionne ou si vous avez besoin d'aide pour la réinstallation.

Je déteste les virus.

75
Jerry Asher

J'ai trouvé utile de ne pas écrire mon code sur la vitre de mon moniteur avec un marqueur magique, même s'il a l'air sympa quand il est vraiment noir. L'écran se remplit trop vite et ensuite, les personnes qui me fournissent un moniteur propre m'appellent chaque semaine par leur nom.

Un ou deux de mes employés (je suis un responsable) m'achètent un de ces ordinateurs à clavier rouge munis de boutons. Ils ont dit que je n'aurais pas besoin de marqueurs et que je pourrais nettoyer l'écran moi-même quand il serait plein mais je devais faire attention en le secouant. Je suppose que c'est délicat comme ça.

C'est pourquoi j'engage les personnes intelligentes.

63
the Tin Man

File format not recognized Vous devez formater correctement votre fichier. Cela signifie que vous devez utiliser les bonnes couleurs et polices pour votre code. Voir les documentations spécifiques pour chaque compilateur car ces couleurs varient d'un compilateur à l'autre;)

60
helloworld922

Vous avez oublié le pré-processeur. Essaye ça:

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

Avez-vous écrit le programme à la main puis l’analyser dans l’ordinateur? C'est ce que sous-entend "helloworld.png". Si tel est le cas, vous devez savoir que la norme C++ (même dans sa dernière édition) ne nécessite pas la reconnaissance optique de caractères et qu'elle n'est malheureusement pas incluse en tant que fonctionnalité optionnelle dans les compilateurs actuels.

Vous voudrez peut-être envisager de transposer les graphiques en un format textuel. Tout éditeur de texte brut peut être utilisé; L'utilisation d'un traitement de texte, tout en étant capable de générer une jolie impression, entraînera très probablement la même erreur que celle que vous obtenez en essayant de numériser.

Si vous êtes vraiment aventureux, vous pouvez essayer d'écrire votre code dans un traitement de texte. Imprimez-le, de préférence avec une police de caractères telle que OCR-A . Prenez ensuite votre impression et ré-numérisez-la. Cette numérisation peut ensuite être exécutée dans un package OCR tiers afin de générer un formulaire texte. Le formulaire texte peut ensuite être compilé à l'aide de l'un des nombreux compilateurs standard.

Attention, toutefois, au coût élevé du papier que cela va engendrer pendant la phase de débogage.

49
Kevin Lacquement

Dessinez l'inclus ci-dessous pour le compiler:

#include <ChuckNorris>

J'entends qu'il peut compiler des erreurs de syntaxe ...

46
Grofit

Malheureusement, vous avez sélectionné trois compilateurs qui prennent tous en charge plusieurs langages, pas seulement le C++. Ils doivent tous deviner le langage de programmation que vous avez utilisé. Comme vous le savez probablement déjà, le format PNG convient à tous les langages de programmation, pas seulement C++.

Habituellement, le compilateur peut comprendre le langage lui-même. Par exemple, si le fichier PNG est évidemment dessiné avec des crayons, le compilateur saura qu'il contient Visual Basic. Si cela ressemble à un dessin au crayon mécanique, il est facile de reconnaître l'ingénieur au travail, en écrivant le code FORTRAN.

Cette deuxième étape n'aide pas non plus le compilateur, dans ce cas. C et C++ se ressemblent beaucoup trop, jusqu'au #include. Par conséquent, vous devez aider le compilateur à décider de quelle langue il s'agit réellement. Maintenant, vous pouvez utiliser des moyens non standard. Par exemple, le compilateur Visual Studio accepte les arguments de ligne de commande / TC et/TP , ou vous pouvez utiliser l'option "Compiler en tant que: C++" dans le fichier projet. GCC et CLang ont leurs propres mécanismes, ce que je ne connais pas.

Par conséquent, je recommanderais plutôt d'utiliser la méthode standard pour indiquer à votre compilateur que le code suivant est en C++. Comme vous l'avez déjà découvert, les compilateurs C++ sont très pointilleux sur ce qu'ils acceptent. Par conséquent, le moyen standard d'identifier le C++ est d'intimider les programmeurs en ajoutant à leur code C++. Par exemple, la ligne suivante expliquera à votre compilateur que ce qui suit est du C++ (et qu'il ferait mieux de le compiler sans se plaindre).

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

Est-ce que votre compilateur est en mode expert?! Si oui, il ne faut pas compiler. Les compilateurs modernes en ont assez de "Hello World!"

33
zamanbakshi

Essaye celui-là:

Do you see the dinosaur in the space shuttle?

33
Chris Cudmore

OCR dit:

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

Ce qui est sacrément bon, pour être juste.

27
Robin Duckett

helloworld.png: fichier non reconnu: fichier format non reconnu

Évidemment, vous devriez formater votre disque dur.

Vraiment, ces erreurs ne sont pas si difficiles à lire.

26
Chris Cudmore

J'ai converti votre programme de PNG en ASCII, mais il ne compile pas encore. Pour votre information, j'ai essayé avec une largeur de trait de 100 et 250 caractères, mais les deux ont donné des résultats comparables.

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

Le premier problème est que vous essayez de renvoyer une valeur incorrecte à la fin de la fonction principale. La norme C++ indique que le type de retour de main () est int, mais que vous essayez plutôt de renvoyer l'ensemble vide.

L’autre problème est, du moins avec g ++, que le compilateur déduit le langage utilisé à partir du suffixe du fichier. De g ++ (1):

Pour tout fichier d'entrée donné, le suffixe du nom de fichier détermine le type de compilation effectué:

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

Code source C++ qui doit être prétraité. Notez que dans .cxx, les deux dernières lettres doivent être littéralement x. De même, .C fait référence à un capital littéral C.

Leur correction devrait vous laisser avec une application Hello World pleinement opérationnelle, comme le montre la démo ici .

16
Antti Laine

Votre police de caractères craint, comment un analyseur devrait-il pouvoir lire cela? Suivez un cours de calligraphie.

15
Frank Osterfeld

Vos compilateurs attendent ASCII, mais ce programme est évidemment écrit en utilisant EBCDIC .

13
oosterwal

Vous essayez de compiler une image.

Tapez ce que vous avez écrit à la main dans un document appelé main.cpp, exécutez ce fichier avec votre compilateur, puis exécutez le fichier de sortie.

8
William

Vous devez spécifier la précision de votre sortie précédée de deux points immédiatement avant l'accolade finale . Puisque la sortie n'est pas numérique, la précision est de zéro, vous avez donc besoin de cela.

: 0}

7
MikeJ-UK

ajouter :

using namespace std;

juste après inclure: P: D

6
Spyros

Il semble que votre compilateur ne supporte pas les fichiers dans un tel encodage hmm .... Essayez de le convertir en ASCII.

6

Vous pouvez essayer différentes couleurs pour les crochets, peut-être qu'un peu de vert ou de rouge pourrait vous aider? Je pense que votre compilateur ne peut pas reconnaître l’encre noire: P

5
lothar

Suis-je le seul à ne pas pouvoir reconnaître le caractère entre "retour" et le point-virgule? Ça pourrait être ça!

5
techolic

Essayez de changer d'interface d'entrée. C++ s'attend à ce qu'un clavier soit branché sur votre ordinateur, pas à un scanner. Il peut y avoir des problèmes de conflit de périphériques ici. Je n'ai pas vérifié dans ISO Standard si l'interface de saisie au clavier est obligatoire, mais cela est vrai pour tous les compilateurs que j'ai utilisés. Mais peut-être que l'entrée du scanner est maintenant disponible dans C99, et dans ce cas, votre programme devrait en effet fonctionner. Sinon, vous devrez attendre la prochaine version standard et mettre à jour les compilateurs.

5
kriss

Le problème réside dans la définition de la syntaxe. Essayez d’utiliser une règle et un compas pour une description plus classique!

À votre santé,

5
quarkonium

Exécutez le compilateur via OCR. Cela pourrait résoudre le problème de compatibilité.

4
James P.