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

Tengo dificultades para comstackr un progtwig en C ++ que he escrito.

Este progtwig 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 progtwig es el siguiente:

enter image description here

Aquí está el resultado que recibí al intentar comstackr este progtwig 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. Lamentablemente, 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 sincero, realmente no sé lo que significan estos mensajes de error.

Muchos otros progtwigs C ++ tienen archivos fuente con una extensión .cpp , así que pensé que quizás 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 comstackr el progtwig 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 comstackdores son tan incompletos que no pueden comstackr este sencillo progtwig?

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 comstackdor no es compatible con ese formato (es decir, no puede asignarlo al conjunto de caracteres básicos de origen ), por lo que no puede pasar a otras etapas de procesamiento, de ahí el error. Es muy posible que su comstackdor 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 mirar su documentación de implementaciones para ver los formatos de archivo que admite. Típicamente, cada proveedor de comstackdor 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 ++ 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 progtwigs C se transforman para ser utilizados por un sistema de procesamiento de datos;
– el mecanismo por el cual los progtwigs 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 progtwig C;

Entonces, una vez más, el tratamiento de los archivos fuente es algo que debe encontrar en la documentación de su comstackdor.

Originalmente de Overv @ reddit .

Pruebe de esta manera:

enter image description here

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

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, hazlo:

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

Olvidaste usar Comic Sans como fuente, por eso es que está cometiendo errores.

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

Como usted 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”.

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

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

Déjenos saber cómo funciona, o si necesita ayuda con la reinstalación.

Odio los virus

Descubrí 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.

File format not recognized . Debe formatear correctamente su archivo. Eso significa usar los colores y fonts correctos para su código. Consulte la documentación específica para cada comstackdor, ya que estos colores varían según el comstackdor;)

Olvidó el pre-procesador. Prueba esto:

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

¿Escribió a mano el progtwig 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 comstackdor 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 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 formulario de texto se puede comstackr usando uno de muchos comstackdores estándar.

Sin embargo, tenga en cuenta el gran costo del papel que esto generará durante la fase de depuración.

Dibuja el include a continuación para comstackrlo:

 #include  

Escuché que puede comstackr errores de syntax …

Desafortunadamente, ha seleccionado tres comstackdores que admiten múltiples idiomas, no solo C ++. Todos tienen que adivinar el lenguaje de progtwigción que usaste. Como probablemente ya sepa, el formato PNG es adecuado para todos los lenguajes de progtwigción, no solo para C ++.

Usualmente el comstackdor puede descifrar el lenguaje en sí mismo. Por ejemplo, si el PNG obviamente se dibuja con crayones, el comstackdor 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 comstackdor, en este caso. C y C ++ simplemente se ven muy similares, hasta el #include . Por lo tanto, debe ayudar al comstackdor a decidir qué idioma es realmente. Ahora, podrías usar medios no estándar. Por ejemplo, el comstackdor de Visual Studio acepta los argumentos de línea de comandos / TC y / TP , o puede usar la opción “Comstackr como: C ++” en el archivo de proyecto. GCC y CLang tienen sus propios mecanismos, que no sé.

Por lo tanto, recomendaría utilizar el método estándar en su lugar para decirle a su comstackdor que el siguiente código está en C ++. Como ya has descubierto, los comstackdores 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 progtwigdores agregan a su código C ++. Por ejemplo, la siguiente línea aclarará a su comstackdor que lo que sigue es C ++ (y será mejor comstackrlo sin quejas).

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

¿Tu comstackdor está en modo experto? Si es así, no debería comstackrse. Los comstackdores modernos están cansados ​​de “Hello World!”

Prueba este:

¿Ves el dinosaurio en el transbordador espacial?

OCR dice:

 N lml_ e  

Lo cual es bastante bueno, para ser justo.

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

Obviamente, debes formatear tu disco duro.

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

Convertí tu progtwig de PNG a ASCII, pero todavía no se comstack. Para su información, lo intenté con un ancho de línea de 100 y 250 caracteres, pero ambos obtuvieron resultados comparables.

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

El primer problema es que intentas 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 comstackdor deduce el idioma utilizado del sufijo del archivo. Desde g ++ (1):

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

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

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

Arreglar esto debería dejarte con una aplicación Hello World en pleno funcionamiento, como se puede ver en la demostración aquí .

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

Sus comstackdores esperan ASCII , pero ese progtwig obviamente está escrito usando EBCDIC .

Estás tratando de comstackr una imagen.

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

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

: 0}

agregar:

 using namespace std; 

enseguida incluye: P: D

Parece que tu comstackdor no admite archivos en dicha encoding hmm … Intenta convertirlo a ASCII.

El problema radica en la definición de la syntax, intente utilizar la regla y las brújulas para obtener una descripción más clásica.

Aclamaciones,

Intenta 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 comstackdores que he usado. Pero tal vez la entrada del escáner ya está disponible en C99, y en este caso su progtwig debería funcionar. De lo contrario, tendrá que esperar la próxima versión estándar y la actualización de los comstackdores.

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

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