¿Por qué este programa es rechazado erróneamente por tres compiladores de C++?


Estoy teniendo algunas dificultades para compilar un programa C++ que he escrito.

Este programa es muy simple y, a mi leal saber y entender, se ajusta a todas las reglas establecidas en el Estándar C++. He leído sobre la totalidad de ISO/IEC 14882: 2003 dos veces para estar seguro.

El programa es El siguiente:

introduzca la descripción de la imagen aquí

Aquí está la salida que recibí al intentar compilar este programa con 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

Consternado, probé g++ 4.5.2, pero fue igualmente inútil:

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

Pensé que Clang (versión 3.0 trunk 127530) debe funcionar, ya que es muy elogiado por su conformidad con los estándares. Desafortunadamente, ni siquiera me dio uno de sus mensajes de error bonitos y resaltados:

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)

Para ser honesto, realmente no sé qué significa ninguno de estos mensajes de error.

Muchos otros programas C++ tienen archivos fuente con un .cpp extensión, así que pensé que tal vez necesitaba cambiar el nombre de mi archivo. Cambié su nombre a helloworld.cpp , pero eso no ayudó. Creo que hay un error muy grave en Clang porque cuando intenté usarlo para compilar el programa renombrado, se volteó, imprimió " 84 advertencias y 20 errores generados."e hizo que mi computadora sonara mucho!

¿Qué he hecho mal aquí? ¿Me he perdido alguna parte crítica del estándar C++? ¿O los tres compiladores están realmente tan rotos que no pueden compilar este sencillo programa?

Author: James McNellis, 2011-04-01

30 answers

En la norma, §2.1/1 especifica:

Los caracteres de archivo de origen físico se asignan, de una manera definida por la implementación, al conjunto de caracteres de origen básico (introduciendo caracteres de nueva línea para los indicadores de final de línea) si es necesario.

Su compilador no soporta ese formato (también conocido como no puede asignarlo al conjunto de caracteres de origen básico ), por lo que no puede pasar a otras etapas de procesamiento, de ahí el error. Es completamente posible que su compilador soporte un asignación de la imagen al conjunto de caracteres de origen básico, pero no es necesario.

Dado que esta asignación está definida por la implementación, deberá consultar la documentación de implementaciones para ver los formatos de archivo que admite. Normalmente, todos los principales proveedores de compiladores admiten archivos de texto (definidos canónicamente): cualquier archivo producido por un editor de texto, normalmente una serie de caracteres.


Tenga en cuenta que el estándar C++ se basa en el estándar C (§1.1/2), y el estándar C(99) dice, en §1.2:

Esta Norma Internacional no especifica
- el mecanismo por el cual los programas C se transforman para su uso por un sistema;
- el mecanismo por el cual los programas C son invocados para su uso por un sistema;
- el mecanismo por el que se transforman los datos de entrada para su utilización por un programa C;

Así que, de nuevo, el tratamiento de los archivos fuente es algo que necesita encontrar en la documentación de sus compiladores.

 174
Author: GManNickG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 01:45:09

Originalmente de Overv @ reddit .

 576
Author: Sven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-16 09:31:00

Intente de esta manera:

introduzca la descripción de la imagen aquí

 320
Author: Benoit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 13:55:50

Su < y >, ( y ), { y } no parecen coincidir muy bien, trata de dibujar mejor.

 212
Author: Bala R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-03 01:44:58

Puede probar el siguiente script python. Tenga en cuenta que necesita instalar 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

Para usarlo, haga:

python script.py > helloworld.cpp; g++ helloworld.cpp
 157
Author: sje397,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 01:07:59

Olvidaste usar Comic Sans como fuente, por eso es un error.

 111
Author: bl00dshooter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 00:59:11

No puedo ver una nueva línea después del último paréntesis.

Como usted sabe: "Si un archivo fuente que no está vacío no termina en un carácter de nueva línea, ... el comportamiento es indefinido".

 76
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 01:14:20

Este programa es válido no No puedo encontrar errores.

Mi conjetura es que tienes un virus en tu máquina. Sería mejor si reformatea su unidad y reinstala el sistema operativo.

Háganos saber cómo funciona, o si necesita ayuda con la reinstalación.

Odio los virus.

 75
Author: Jerry Asher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 04:22:47

He encontrado que ayuda no escribir mi código en el cristal de mi monitor con un marcador mágico, a pesar de que se ve bien cuando es realmente negro. La pantalla se llena demasiado rápido y luego las personas que me dan un monitor limpio me insultan cada semana.

Un par de mis empleados (soy gerente) están contribuyendo para comprarme uno de esos ordenadores red pad con las perillas. Dijeron que no necesitaré marcadores y que puedo limpiar la pantalla yo mismo cuando esté llena, pero tengo que tener cuidado de agitarla. Me supongo que es delicado de esa manera.

Es por eso que contrato a la gente inteligente.

 63
Author: the Tin Man,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 05:48:24

File format not recognized Necesita formatear correctamente su archivo. Eso significa usar los colores y fuentes correctos para su código. Vea las documentaciones específicas para cada compilador ya que estos colores varían entre compiladores;)

 60
Author: helloworld922,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 00:57:36

Olvidaste el preprocesador. Prueba esto:

pngtopnm helloworld.png | ocrad | g++ -x 'c++' -
 57
Author: Andrew Cooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-20 22:43:32

¿Escribiste a mano el programa y luego lo escaneaste en la computadora? Eso es lo que implica " helloworld.png". Si ese es el caso, debe tener en cuenta que el estándar C++ (incluso en su última edición) no requiere la presencia de reconocimiento óptico de caracteres, y desafortunadamente no se incluye como una característica opcional en ningún compilador actual.

Es posible que desee considerar la transposición de los gráficos a un formato textual. Cualquier editor de texto plano puede ser utilizado; el uso de una palabra procesador, si bien es capaz de generar una impresión bonita, lo más probable es que resulte en el mismo error que se obtiene al tratar de escanear.

Si eres realmente aventurero, puedes intentar escribir tu código en un procesador de textos. Imprímelo, preferiblemente usando una fuente como OCR-A . Luego, toma tu impresión y escanéala de nuevo. El análisis se puede ejecutar a través de un paquete OCR de terceros para generar un formulario de texto. La forma de texto puede ser compilada usando uno de los muchos estándares compilación.

Tenga cuidado, sin embargo, del gran costo de papel que esto incurrirá durante la fase de depuración.

 49
Author: Kevin Lacquement,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 00:57:53

Dibuja la inclusión a continuación para que compile:

#include <ChuckNorris>

He oído que puede compilar errores de sintaxis...

 46
Author: Grofit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 12:32:17

Desafortunadamente, ha seleccionado tres compiladores que admiten varios lenguajes, no solo C++. Todos tienen que adivinar el lenguaje de programación que usaste. Como probablemente ya sabes, el formato PNG es adecuado para todos los lenguajes de programación, no solo para C++.

Normalmente el compilador puede averiguar el lenguaje por sí mismo. Por ejemplo, si el PNG está obviamente dibujado con crayones, el compilador sabrá que contiene Visual Basic. Si parece que está dibujado con una mecánica lápiz, es fácil reconocer al ingeniero en el trabajo, escribiendo código FORTRAN.

Este segundo paso tampoco ayuda al compilador, en este caso. C y C++ parecen demasiado similares, hasta el #include. Por lo tanto, debe ayudar al compilador a decidir qué idioma es realmente. Ahora, podrías usar medios no estándar. Por ejemplo, el compilador de Visual Studio acepta los argumentos de línea de comandos /TC y /TP, o puede usar la opción "Compile as: C++" en el archivo de proyecto. GCC y CLang tienen sus propios mecanismos, que no conozco.

Por lo tanto, recomiendo usar el método estándar en su lugar para decirle a su compilador que el código siguiente está en C++. Como ya has descubierto, los compiladores de C++ son muy exigentes con lo que aceptan. Por lo tanto, la forma estándar de identificar C++ es mediante la intimidación que los programadores agregan a su código C++. Por ejemplo, la siguiente línea aclarará a su compilador que lo que sigue es C++ (y será mejor que lo compile sin quejas).

// To the compiler: I know where you are installed. No funny games, capice?
 41
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 11:22:40

¿Su compilador está configurado en modo experto?! Si es así, no debería compilar. Los compiladores modernos están cansados de " Hello World!"

 33
Author: zamanbakshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 16:30:21

Prueba este:

¿Ves el dinosaurio en el transbordador espacial?

 33
Author: Chris Cudmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-09 04:58:33

OCR Dice:

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

Que es bastante bueno, para ser justos.

 27
Author: Robin Duckett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 13:21:38

Helloworld.png: archivo no reconocido: Archivo formato no {reconocido[4]}

Obviamente, debe formatear su disco duro.

Realmente, estos errores no son tan difíciles de leer.

 26
Author: Chris Cudmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 13:33:21

Convertí su programa de PNG a ASCII, pero aún no se compila. Para su información, intenté con el ancho de línea 100 y 250 caracteres pero ambos rinden en resultados comparables.

   `         `  .     `.      `         ...                                                         
   +:: ..-.. --.:`:. `-` .....:`../--`.. `-                                                         
           `      `       ````                                                                      
                                                                      `                             
   ` `` .`       ``    .`    `.               `` .      -``-          ..                            
   .`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :                            
   .`         ` `    ` .`         ````:``  -                  ` ``-.`  `                            
   `-                                ..                           ``                                
    .       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `       
           `:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `     
            ``  `       ```.      ``    ````    `       `     `        `    `         `   `   .     
            : -...`.- .` .:/ `                                                                      
    -       `             `` .                                                                      
    -`                                                                                              
    `                                                                                               
 21
Author: Yves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 12:31:31

El primer problema es que está intentando devolver un valor incorrecto al final de la función principal. El estándar de C++ dicta que el tipo de retorno de main() es int, pero en su lugar está tratando de devolver el conjunto vacío.

El otro problema es - al menos con g++ - que el compilador deduce el lenguaje utilizado del sufijo de archivo. De g++(1):

Para cualquier archivo de entrada dado, el archivo sufijo de nombre determina qué tipo de compilation is done:

File.cc file.archivo cp.archivo cxx.archivo cpp.Archivo CPP.archivo c++.C

Código fuente de C ++ que debe ser preprocesado. Fíjate en eso .cxx, el las dos últimas letras deben ser literalmente x. Del mismo modo, .C se refiere a a C mayúscula literal

Arreglar esto debería dejarle con una aplicación Hello World completamente funcional, como se puede ver en la demo aquí.

 16
Author: Antti Laine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 14:54:48

Tu fuente apesta, ¿cómo debería un analizador ser capaz de leer eso? Haz un curso de caligrafía.

 15
Author: Frank Osterfeld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 11:47:34

Sus compiladores están esperando ASCII, pero ese programa está obviamente escrito usando EBCDIC.

 13
Author: oosterwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 12:26:47

Estás intentando compilar una imagen.

Escriba lo que ha escrito a mano en un documento llamado main.cpp, ejecute ese archivo a través de su compilador, luego ejecute el archivo de salida.

 8
Author: William,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 12:00:59

Debe especificar la precisión de su salida precedida por dos puntos inmediatamente antes de la llave de cierre final. Dado que la salida no es numérica, la precisión es cero, por lo que necesita esto -

:0}

 7
Author: MikeJ-UK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 11:14:52

Añadir:

using namespace std;

Justo después de incluir: P: D

 6
Author: Spyros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 00:56:32

Parece que su compilador no soporta archivos en tal hmm... codificación. Intenta convertirlo a ASCII.

 6
Author: Kirill V. Lyadvinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 04:53:35

El problema radica en la definición de sintaxis, intente usar regla y brújulas para una descripción más clásica!

Salud,

 5
Author: quarkonium,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 10:57:06

Intente cambiar la interfaz de entrada. C++ espera que se conecte un teclado a su computadora, no un escáner. Puede haber problemas de conflictos periféricos aquí. No comprobé en el estándar ISO si la interfaz de entrada de teclado es obligatoria, pero eso es cierto para todos los compiladores que he usado. Pero tal vez la entrada del escáner ahora está disponible en C99, y en este caso su programa debería funcionar. Si no, tendrá que esperar la próxima versión estándar y actualización de los compiladores.

 5
Author: kriss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 12:07:31

Podría probar diferentes colores para los corchetes, tal vez un poco de verde o rojo ayudaría ? Creo que su compilador no puede reconocer black ink: P

 5
Author: lothar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 12:17:25

¿Soy el único que no puede reconocer el carácter entre 'return' y el punto y coma? Que podría ser!

 5
Author: techolic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 13:58:20