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

Tengo algunas dificultades para compilar un programa en 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 la totalidad de ISO / IEC 14882: 2003 dos veces para estar seguro.

El programa es el siguiente:

enter image description here

Aquí está el resultado 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

Supuse 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 bonitos mensajes de error 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 de 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 holamundo.cpp, pero eso no ayudó. Creo que hay un error muy serio en Clang porque cuando intenté usarlo para compilar el programa renombrado, se volteó, imprimió "84 advertencias y 20 errores generados". ¡e hice que mi computadora pitara mucho!

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

preguntado el 31 de marzo de 11 a las 21:03

30 Respuestas

En el estándar, §2.1 / 1 especifica:

Los caracteres del 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 fin de línea) si es necesario.

Su compilador no admite 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 muy posible que su compilador admita un mapeo de la imagen al conjunto de caracteres de origen básico, pero no es obligatorio.

Dado que esta asignación está definida por la implementación, deberá consultar la documentación de sus implementaciones para ver los formatos de archivo que admite. Por lo general, todos los principales proveedores de compiladores admiten archivos de texto (definidos canónicamente): cualquier archivo producido por un editor de texto, generalmente 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 mediante el cual los programas C se transforman para su uso en un sistema de procesamiento de datos;
- el mecanismo por el cual los programas C son invocados para ser utilizados por un sistema de procesamiento de datos;
- el mecanismo por el cual los datos de entrada se transforman para ser utilizados por un programa en C;

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

Respondido 01 Abr '11, 02:04

Creo que esa frase es, en el mejor de los casos, ambigua. El diccionario Merriam-Webster dice que texto is las palabras originales y la forma de una obra escrita o impresa or una obra que contiene tal texto. Este archivo de origen se enmarca claramente en esa definición. ¿Crees que debería presentar un informe de defectos ante el Grupo de trabajo de idiomas básicos? - james mcnellis

Oh; Me olvidé por completo de leer todos los documentos a los que se hace referencia. Sin embargo, creo que ese párrafo está fuera de contexto, así que leeré la norma ISO / IEC 9899: 1990 en su totalidad y la volveré a publicar aquí una vez que la entienda completamente. - james mcnellis

Originalmente de Overv @ reddit.

Respondido el 16 de enero de 12 a las 09:01

Mejor. Formato BMP. Ilustración de especificación. Siempre. - Tobias Kienzler

Inspirado por esta hermosa respuesta, decidí que haría algo similar para brainf ***: blog.dreasgrech.com/2011/04/… - andreas grech

Prueba de esta manera:

enter image description here

Respondido 01 Abr '11, 14:04

Tus < y >, ( y ), { y } no parece coincidir muy bien; Intenta dibujarlos mejor.

Respondido 03 Abr '11, 02:04

Si bien no aprecio que se burle de mi letra, este podría ser el problema real y explicaría el error que obtengo cuando intento compilar el nombre renombrado holamundo.cpp con Visual C ++: "error fatal C1004: se encontró un final de archivo inesperado" Lo intentaré de nuevo e informaré pronto. ¡Gracias! - james mcnellis

@James asegúrese de desactivar todas las optimizaciones de png. facilita la depuración. - Wilhelmtell

@James: "fin de archivo inesperado" casi con certeza significa que es su } que está causando el problema. Intente concentrarse en hacer coincidir eso con el { - carson63000

Puede probar el siguiente script de 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, haz lo siguiente:

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

Respondido 01 Abr '11, 02:04

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

Respondido 01 Abr '11, 01:04

Desafortunadamente, esta es la única fuente que admite mi mano. Sería muy triste si no pudiera programar en C ++ debido a esto. ¿Crees que Java sería compatible con esta fuente? - james mcnellis

Necesitará Comic Sans cuando piense en dibujar cómics de todos modos, por lo que debería considerar seriamente actualizar sus manos. - diente filoso

C ++ requiere una formación de un año en caligrafía. Si no tiene tiempo, pruebe Visual Basic o simplemente el código de máquina binario (solo tiene que obtener los 0 y los 1 en ese momento). - franco osterfeld

@Frank C ++ 0x §42.1 / 1 especifica "Todas las cadenas deben estar en gótico". - mateen ulhaq

No puedo ver una nueva línea después de la última abrazadera.

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

Respondido 01 Abr '11, 02:04

Mmm. Afortunadamente, esta ridícula regla se ha eliminado en C ++ 0x. Dicho esto, ¿cómo se termina un archivo de este tipo con una nueva línea? Pensé que había dejado suficiente espacio al final del texto (si resalta el archivo de origen, debería ver el espacio adicional que dejé). ¡Gracias por el consejo! - james mcnellis

Si no tiene suficiente espacio en blanco, puedo intentar compilarlo en mi sistema. Tengo cuatro monitores, por lo que podría intentar compilar desde el que está más a la izquierda. - el hombre de hojalata

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

Supongo que tiene un virus en su máquina. Lo mejor sería reformatear la unidad y reinstalar el sistema operativo.

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

Odio los virus.

Respondido 01 Abr '11, 05:04

Sí, intente instalar Linux. Culpo a Windows por tu problema. - Raedwald

Descubrí que es útil no escribir mi código en el cristal de mi monitor con un marcador mágico, aunque se ve bien cuando está 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 colaborando para comprarme una de esas computadoras con botones rojos. Dijeron que no necesitaré marcadores y que puedo limpiar la pantalla yo mismo cuando esté llena, pero tengo que tener cuidado al sacudirla. Supuse que es delicado así.

Por eso contrato a gente inteligente.

Respondido 01 Abr '11, 06:04

Un Wacom Cintiq es mucho más apropiado para un gerente. Es caro y te hace sentir realmente importante. Cualquier diseñador gráfico de su empresa tendrá un estatus mucho más bajo y, por lo tanto, debería utilizar monitores EGA. Los conserjes deben usar monitores CGA. Los programadores deben utilizar terminales monocromáticos de segunda mano. - Steve314

Tuve un monitor "Life Like" durante mucho tiempo. Era tan realista que uno juraría que el salvapantallas de peces nadadores era real, y el pequeño buceador parecía estar nadando. Seguí mojándome el brazo tratando de sacar el cofre del tesoro del fondo, era tan real. El único problema era que el protector de pantalla siempre estaba activado y los ruidos de burbujeo realistas dificultaban la audición. Ah, y dijeron que para el mantenimiento tenía que esparcir cosas en la parte superior del monitor todos los días o el protector de pantalla dejaría de funcionar. Lo hizo una vez, y vaya, el olor dos días después era realmente realista. - el hombre de hojalata

File format not recognized Necesita formatear correctamente su archivo. Eso significa usar los colores y fuentes correctos para su código. Consulte la documentación específica de cada compilador, ya que estos colores varían de un compilador a otro;)

Respondido 01 Abr '11, 01:04

Oh, eso tiene sentido ... Tengo una caja de 96 crayones, así que estoy seguro de que tengo el color de primer plano correcto. Mañana recogeré papel de construcción de colores y lo probaré en un papel de otro color. - james mcnellis

Para estar seguro, será mejor que consigas también algunos lápices de colores y pintura a base de aceite. Es un hecho bien conocido que C ++ está destinado a ser un lenguaje muy difícil de formatear correctamente. - hola mundo922

Sí, y no olvides usar el marcador de resaltado. - diente filoso

@sharptooth: el resaltado de sintaxis es una función IDE, no está destinado a hacerlo a mano. Así que asegúrese de tener un brazo robótico que combine con ese marcador de resaltado. - Steve314

Olvidaste el preprocesador. Prueba esto:

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

Respondido 20 Feb 12, 22:02

¡Oh! ¡Pensé que el preprocesador estaba incluido con el compilador! Intentaré encontrar un preprocesador que funcione en mi computadora portátil con Windows. - james mcnellis

@James McNellis: El preprocesador no es un programa, es una cosa de hardware que parece un marcador de resaltado: lo mueves sobre el texto y se preprocesa. - diente filoso

¿Escribió a mano el programa y luego lo escaneó 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 edición más reciente) 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 posibilidad de transponer los gráficos a un formato textual. Se puede utilizar cualquier editor de texto sin formato; el uso de un procesador de texto, si bien es capaz de generar una impresión bonita, probablemente resultará en el mismo error que obtiene al intentar escanear.

Si eres realmente aventurero, puedes intentar escribir tu código en un procesador de texto. Imprímelo, preferiblemente usando una fuente como OCR-A. Luego, tome su impresión y vuelva a escanearla. El escaneo se puede ejecutar a través de un paquete de OCR de terceros para generar un formulario de texto. El formato de texto se puede compilar usando uno de los muchos compiladores estándar.

Sin embargo, tenga cuidado con el gran costo del papel que esto supondrá durante la fase de depuración.

Respondido 01 Abr '11, 01:04

El dilema del huevo y la gallina: ¿Es posible escribir código C ++ para un software de OCR y compilarlo sin OCR? - jweyrich

Bueno, usas ensamblaje para el OCR original. - Kevin Lacado

@jweyrich - Creo que primero necesitará obtener su C ++ / OCR bootstrap con su cadena de herramientas asm / OCR. - miguel rebabas

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

#include <ChuckNorris>

Escuché que puede compilar errores de sintaxis ...

Respondido 01 Abr '11, 13:04

Yo personalmente prefiero #include <JonSkeet>. - Icode4food

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 sepa, el formato PNG es adecuado para todos los lenguajes de programación, no solo para C ++.

Normalmente, el compilador puede descifrar el lenguaje por sí mismo. Por ejemplo, si el PNG se dibuja obviamente con crayones, el compilador sabrá que contiene Visual Basic. Si parece que está dibujado con un lápiz mecánico, 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 ++ simplemente se ven demasiado similares, hasta el #include. Por lo tanto, debe ayudar al compilador a decidir qué idioma es realmente. Ahora, podría utilizar medios no estándar. Por ejemplo, el compilador de Visual Studio acepta la / TC y / TP argumentos de la línea de comandos, o puede usar la opción "Compilar como: C ++" en el archivo del proyecto. GCC y CLang tienen sus propios mecanismos, que no sé.

Por lo tanto, recomendaría usar el método estándar en su lugar para decirle a su compilador que el siguiente código está en C ++. Como ya ha 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?

Respondido 01 Abr '11, 12:04

pensé #pragma ¿Cuál fue la forma correcta de "enviar un mensaje" al compilador? - Obispo Lev

Prueba este:

¿Ves al dinosaurio en el transbordador espacial?

Respondido 09 Abr '11, 05:04

Creo que hay un error tipográfico, debería ser endl (L) no end1 (uno). ¡Pero +1 muy bien hecho! - Rup

He estado mirando esto durante tres horas pero todavía no puedo ver un dinosaurio o el transbordador espacial. :-( - osterwal

¿Su compilador está configurado en modo experto? Si es así, no debería compilarse. Los compiladores modernos están cansados ​​de "¡Hola mundo!"

Respondido 01 Abr '11, 17:04

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

Lo cual es muy bueno, para ser justos.

Respondido 01 Abr '11, 14:04

Vaya, el OCR ha mejorado desde que intenté escanear mi escritura a mano (también pasé horas escribiéndola directamente). - James P.

Creo que debemos agregar una etiqueta Perl. - MSalters

helloworld.png: archivo no reconocido: archivo formato no reconocido

Obviamente, debes formatear tu disco duro.

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

Respondido 01 Abr '11, 14:04

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

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

Respondido 01 Abr '11, 13:04

Probablemente deberías usar 80 o incluso 72 columnas en lugar de - Tobias Kienzler

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

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

Para cualquier archivo de entrada dado, el sufijo del nombre del archivo determina qué tipo de compilación se realiza:

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

Código fuente C ++ que debe procesarse previamente. Tenga en cuenta que en .cxx, las dos últimas letras deben ser literalmente x. Asimismo, .C se refiere a una C mayúscula literal.

La solución de estos debería dejarlo con una aplicación Hello World completamente funcional, como se puede ver en la demostración. aquí.

Respondido 01 Abr '11, 15:04

Hace mucho tiempo tuve un profesor que le quitaba puntos a sus tareas o exámenes si colocaba una barra en un dígito cero, ya que cero no es el conjunto nulo. Agradecería esta respuesta. - miguel rebabas

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

Respondido 01 Abr '11, 12:04

Tus compiladores esperan ASCII, pero ese programa es obviamente escrito usando EBCDIC.

Respondido 01 Abr '11, 13:04

Lo último que escuché es que C ++ no especifica que los programas deben estar escritos en ASCII, UTF-8 o cualquier otra cosa. - Adrián Ratnapala

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 y luego ejecute el archivo de salida.

Respondido 01 Abr '11, 13:04

Verifique la fecha en su PC. - James P.

Jaja, ¡pero finalmente encontré una fácil que podía responder! - Cody Grey ♦

Esto es una tontería. Todos sabemos que el compilador optimizaría el espacio en blanco, dejando solo espacios en negro muy comprimidos, que son todos unos y se comprimirían a un 1 binario que se devolvería como un error. El código tenía que escribirse usando white-out que se compilaría a 0 y no devolvería un error. - el hombre de hojalata

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}

Respondido 01 Abr '11, 12:04

Agregar:

using namespace std;

inmediatamente después incluyen: P: D

Respondido 01 Abr '11, 01:04

Prefiero escribir std todo el tiempo. Me recuerda que no debo conseguir uno. - mateen ulhaq

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

Respondido 01 Abr '11, 05:04

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

Aclamaciones,

Respondido 01 Abr '11, 11:04

Intente cambiar la interfaz de entrada. C ++ espera que se conecte un teclado a su computadora, no un escáner. Puede haber problemas de conflicto de periféricos aquí. No verifiqué en la Norma ISO si la interfaz de entrada del 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. De lo contrario, tendrá que esperar la próxima versión estándar y la actualización de los compiladores.

Respondido 01 Abr '11, 13:04

Podrías probar diferentes colores para los corchetes, ¿tal vez ayudaría algo de verde o rojo? Creo que su compilador no puede reconocer la tinta negra: P

Respondido 01 Abr '11, 13:04

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

Respondido 01 Abr '11, 14:04

Es una letra mayúscula O con una línea especial que llamamos "diámetro", que le dice al compilador que use el algoritmo del círculo del punto medio, obviamente. Creo que deberías hacerte revisar los ojos. - mateen ulhaq

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.