2011-04-01 15 views
473

Tengo algunas dificultades para compilar un programa en C++ que he escrito.¿Por qué este programa es erróneamente rechazado por tres compiladores de C++?

Este programa es muy simple y, según mi leal saber y entender, cumple con 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á la salida he recibido 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 

Consternada, probé g ++ 4.5. 2, pero tampoco fue útil:

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

Me imaginé que Clang (versión 3.0 trunk 127530) debe funcionar, ya que es muy elogiado por su conformidad con los estándares. Por desgracia, ni siquiera me dan una de su bastante, destacó mensajes de error:

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é lo que cualquiera de estos mensaje de error medio.

Muchos otros programas C++ tienen archivos fuente con una extensión .cpp, 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 serio en Clang porque cuando traté de usarlo para compilar el programa renombrado, se volcó e imprimió "84 advertencias y 20 errores generados". e hizo que mi computadora emitiera un pitido.

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

Respuesta

174

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

fuente física caracteres fichero se asocian, de una manera definida por la implementación, al conjunto de caracteres fuente básico (introducción de caracteres de nueva línea para indicadores de fin de línea) si es necesario.

Su compilador no admite ese formato (alias no puede asignar a la fuente básica de carácter establecer), por lo que no puede moverse en etapas de procesamiento adicionales, de ahí el error. Es muy posible que su compilador admita un mapeo desde la imagen hasta el conjunto básico de caracteres fuente, pero no es obligatorio.

Dado que esta asignación está definida por la implementación, tendrá que consultar su documentación de implementaciones para ver los formatos de archivo que admite. Típicamente, cada proveedor de compilador principal admite archivos de texto (canónicamente definidos): cualquier archivo producido por un editor de texto, generalmente una serie de caracteres.


Tenga en cuenta que el estándar C++ está basada en el estándar de C (§ 1.1/2), y la C (99) norma dice, en § 1.2:

Esta Norma Internacional no especifica
- el mecanismo por el cual los programas C se transforman para ser utilizados por un sistema de procesamiento de datos ;
- el mecanismo mediante el cual se invocan los programas C 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;

Por lo tanto, nuevamente, el tratamiento de los archivos fuente es algo que necesita encontrar en la documentación de su compilador.

+23

Creo que esa frase es, en el mejor de los casos, ambigua. El diccionario Merriam-Webster dice que _text_ es _las palabras originales y la forma de un trabajo escrito o impreso_ o _un trabajo que contiene dicho texto_. Este archivo fuente cae claramente bajo esa definición. ¿Crees que debería presentar un informe de defectos con el Core Language Working Group? –

6

complemento:

using namespace std; 

justo después incluyen: P: D

+5

Prefiero escribir 'std' todo el tiempo. Me recuerda que no tengo uno. –

60

File format not recognized Es necesario 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 según el compilador;)

49

¿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 de C++ (incluso en su edición más reciente) no requiere la presencia de reconocimiento óptico de caracteres, y desafortunadamente no se incluye como característica opcional en ningún compilador actual.

Es posible que desee considerar la transposición de los gráficos a un formato de texto. Se puede usar cualquier editor de texto sin formato; el uso de un procesador de texto, si bien es capaz de generar una bonita impresión, probablemente resultará en el mismo error que se obtiene al intentar escanear.

Si eres realmente aventurero, puedes intentar escribir tu código en un procesador de textos. Imprímalo, preferiblemente utilizando 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 formulario de texto se puede compilar usando uno de muchos compiladores estándar.

Tenga en cuenta, sin embargo, el gran costo del papel que esto supondrá durante la fase de depuración.

+14

+1: ¡Gracias por salvar el planeta durante la fase de depuración! – Johnsyweb

+2

Oh ASM, sí! [ASM en tarjetas perforadas] (http://en.wikipedia.org/wiki/File:IBM1620SPSpunchcard.agr.jpg). – jweyrich

112

Olvidó usar Comic Sans como fuente, por eso está cometiendo errores.

157

Puede probar el siguiente script de python. Tenga en cuenta que debe 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, hacer:

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

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

+44

Aunque no aprecio que te burles de mi escritura, este podría ser el verdadero problema, y ​​explicaría el error que tengo cuando intento compilar el _helloworld.cpp_ renombrado con Visual C++: "error fatal C1004: final inesperado -file found "Intentaré de nuevo e informaré pronto. ¡Gracias! –

+37

@Juegos, asegúrese de desactivar todas las optimizaciones png. hace que la depuración sea más fácil. – wilhelmtell

57

Ha olvidado el preprocesador. Pruebe esto:

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

No puedo ver una nueva línea después de esa última llave.

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

75

Este programa es válido. No puedo encontrar ningún error.

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 eso o si necesita ayuda con la reinstalación.

Odio los virus.

6

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

63

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 llaman por teléfono cada semana.

Un par de mis empleados (soy un gerente) están comprando para comprarme una de esas computadoras con almohadillas rojas. Dijeron que no necesitaría marcadores y que yo mismo puedo limpiar la pantalla cuando está llena, pero tengo que tener cuidado de sacudirla. Supongo que es delicado de esa manera.

Es por eso que contrato personas inteligentes.

33

¿Está su compilador en modo experto? Si es así, no debería compilarse. Los compiladores modernos están cansados ​​de "Hello World!"

5

El problema radica en la definición de la sintaxis, intente utilizar la regla y los compases para obtener una descripción más clásica.

Saludos,

7

Se necesitan especificar la precisión de la salida precedido por dos puntos inmediatamente antes de la llave de cierre final. Desde la salida no es numérico, la precisión es cero, por lo que necesita esto-

: 0}

41

por desgracia, ha seleccionado tres compiladores que todos dan soporte a múltiples idiomas, no sólo en 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++.

Por lo general, el compilador puede averiguar el idioma en sí. Por ejemplo, si el PNG obviamente se dibuja 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 el código FORTRAN.

Este segundo paso tampoco ayuda al compilador, en este caso. C y C++ simplemente se ven muy 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 la línea de comandos /TC and /TP, 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 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 compilarlo sin quejas).

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

Pensé que '# pragma' era la forma correcta de" enviar un mensaje "al compilador. –

21

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

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

Probablemente debería usar [80 o incluso 72 columnas] (http://en.wikipedia.org/wiki/Punched_card#IBM_80_column_punched_card_format) en su lugar –

15

Su fuente apesta, ¿cómo debe un analizador ser capaz de leer eso? Toma un curso de caligrafía.

8

Está 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.

+23

Verifique la fecha en su PC. –

+14

¡Jaja, pero finalmente encontré uno fácil que podría responder! –

+10

Esto es tonto. Todos sabemos que el compilador optimizaría el espacio en blanco, dejando solo espacio en negro muy comprimido, que es todo lo que uno y comprimiría hasta un 1 binario que se devolvería como un error. El código debía escribirse usando blanco-out que compilaría a 0 y no devolvería un error. –

5

Intente cambiar la interfaz de entrada. C++ espera que un teclado se conecte a su computadora, no a un escáner. Puede haber problemas de conflicto de periféricos aquí. No revisé ISO Standard 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 ya 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.

5

Puede probar diferentes colores para corchetes, tal vez un poco de verde o rojo ayudaría? Creo que su compilador no puede reconocer la tinta negra: P

4

Ejecute el compilador a través de OCR. Podría resolver el problema de compatibilidad.

13

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

+0

Lo último que escuché C++ no especifica que los programas tengan que estar escritos en ASCII, UTF-8 o cualquier otra cosa. –

46

Dibujar la incluyen a continuación para que se compile:

#include <ChuckNorris> 

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

+46

Personalmente prefiero '#include '. – Icode4food

33

prueba este:

Do you see the dinosaur in the space shuttle?

27

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 bastante bueno, para ser justos.

+4

Guau, el OCR ha mejorado desde que intenté escanear mi escritura (pasé horas escribiendo directamente). –

+40

Creo que necesitamos agregar una etiqueta Perl. – MSalters

26

helloworld.png: archivo no reconocido: Archivo formato no se reconoce

Obviamente, se debe formatear el disco duro.

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

320

Trate de esta manera:

enter image description here

5

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

+4

Es una letra mayúscula O con una línea especial que llamamos "diámetro", que le dice al compilador que use el Algoritmo de Círculo de punto medio, obviamente. Creo que deberías revisar tus ojos. –

+1

Lástima de mí .... – techolic

16

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 cambio estás tratando de devolver el conjunto vacío.

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

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

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

código fuente de C++ que debe preprocesarse. Tenga en cuenta que en .cxx, las últimas dos letras deben ser literalmente x. Del mismo modo, se refiere a un .C C. de capital literal

fijación de estos debe dejar con una aplicación Hello World completamente de trabajo, como se puede ver en la demo here.

+3

Tenía un profesor allá por cuando quitaba puntos a tu tarea o exámenes si pones una barra en un dígito cero ya que cero no es el conjunto nulo. Él apreciaría esta respuesta. –

Cuestiones relacionadas