Por que este programa é erroneamente rejeitado por três compiladores C ++?

Eu estou tendo alguma dificuldade em compilar um programa C ++ que eu escrevi.

Este programa é muito simples e, tanto quanto é do meu conhecimento, está em conformidade com todas as regras estabelecidas no Padrão C ++. Eu li a totalidade da ISO / IEC 14882: 2003 duas vezes para ter certeza.

O programa é o seguinte:

insira a descrição da imagem aqui

Aqui está a saída que recebi ao tentar compilar este programa com o 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 

Desanimado, eu tentei g ++ 4.5.2, mas foi igualmente inútil:

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

Eu percebi que o Clang (versão 3.0 trunk 127530) deve funcionar, pois é muito elogiado por sua conformidade com os padrões. Infelizmente, nem sequer me deu uma de suas bonitas mensagens de erro destacadas:

 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, eu realmente não sei o que significa qualquer dessas mensagens de erro.

Muitos outros programas C ++ têm arquivos fonte com uma extensão .cpp , então eu pensei que talvez eu precise renomear meu arquivo. Mudei o nome para helloworld.cpp , mas isso não ajudou. Eu acho que há um bug muito sério no Clang, porque quando eu tentei usá-lo para compilar o programa renomeado, ele apareceu, impresso “84 avisos e 20 erros gerados”. e fez meu computador bipar muito!

O que eu fiz de errado aqui? Eu perdi alguma parte crítica do padrão C ++? Ou são todos os três compiladores realmente tão quebrados que eles não podem compilar este programa simples?

   

Na norma, §2.1 / 1 especifica:

Os caracteres do arquivo de origem físico são mapeados, de uma maneira definida pela implementação, para o conjunto de caracteres de origem básico (introduzindo caracteres de nova linha para indicadores de fim de linha), se necessário.

Seu compilador não suporta esse formato (também não é possível mapeá-lo para o conjunto de caracteres de origem básico ), portanto, ele não pode avançar para estágios de processamento adicionais, daí o erro. É inteiramente possível que o seu compilador suporte um mapeamento da imagem para o conjunto básico de caracteres de origem, mas não é necessário.

Como esse mapeamento é definido pela implementação, você precisará examinar a documentação de implementações para ver os formatos de arquivo suportados. Normalmente, todos os principais fornecedores de compiladores oferecem suporte a arquivos de texto (definidos canonicamente): qualquer arquivo produzido por um editor de texto, geralmente uma série de caracteres.


Observe que o padrão C ++ é baseado no padrão C (§1.1 / 2), e o padrão C (99) diz, no §1.2:

Esta Norma não especifica
– o mecanismo pelo qual os programas em C são transformados para uso por um sistema de processamento de dados;
– o mecanismo pelo qual programas C são invocados para uso por um sistema de processamento de dados;
– o mecanismo pelo qual os dados de input são transformados para uso por um programa C;

Então, novamente, o tratamento dos arquivos fonte é algo que você precisa encontrar na documentação dos compiladores.

Originalmente de Overv @ reddit .

Tente assim:

insira a descrição da imagem aqui

Você < e > , ( e ) , { e } não parece combinar muito bem; Tente desenhá-los melhor.

Você pode tentar o seguinte script python. Note que você precisa instalar o PIL e 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 usá-lo, faça:

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

Você esqueceu de usar o Comic Sans como fonte, e é por isso que está errando.

Não consigo ver uma nova linha depois dessa última chave.

Como você sabe: “Se um arquivo de origem que não está vazio não termina em um caractere de nova linha, … o comportamento é indefinido”.

Este programa é válido – não consigo encontrar erros.

Meu palpite é que você tem um vírus em sua máquina. Seria melhor reformatar a unidade e reinstalar o sistema operacional.

Deixe-nos saber como isso funciona, ou se você precisar de ajuda com a reinstalação.

Eu odeio vírus.

Eu achei que não ajuda a escrever meu código no vidro do meu monitor com um marcador mágico, mesmo que pareça legal quando é realmente preto. A canvas enche muito rápido e, em seguida, as pessoas que me dão um monitor limpo me chamam de nomes a cada semana.

Alguns dos meus funcionários (sou gerente) estão trabalhando para comprar um desses computadores vermelhos com os botões. Eles disseram que eu não precisarei de marcadores e eu mesmo posso limpar a canvas quando estiver cheia, mas tenho que tomar cuidado ao agitá-la. Eu suponho que é delicado assim.

É por isso que eu contrato as pessoas inteligentes.

File format not recognized Você precisa formatar corretamente seu arquivo. Isso significa usar as colors e fonts corretas para o seu código. Veja as documentações específicas para cada compilador, pois essas colors variam entre o compilador;)

Você esqueceu o pré-processador. Tente isto:

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

Você escreveu o programa manualmente e digitalizou-o no computador? É isso que está implícito em “helloworld.png”. Se for esse o caso, você precisa estar ciente de que o padrão C ++ (mesmo em sua edição mais recente) não requer a presença de reconhecimento de caractere ótico e, infelizmente, ele não é incluído como um recurso opcional em qualquer compilador atual.

Você pode querer considerar a transposição dos charts para um formato textual. Qualquer editor de texto simples pode ser usado; O uso de um processador de texto, embora seja capaz de gerar uma impressão bonita, provavelmente resultará no mesmo erro que você obter ao tentar digitalizar.

Se você é realmente aventureiro, você pode tentar escrever seu código em um processador de texto. Imprima, preferencialmente usando uma fonte como OCR-A . Em seguida, tire sua impressão e digitalize-a novamente. A verificação pode ser executada por meio de um pacote OCR de terceiros para gerar um formulário de texto. O formulário de texto pode então ser compilado usando um dos muitos compiladores padrão.

Cuidado, no entanto, do grande custo do papel que isso irá incorrer durante a fase de debugging.

Desenhe o include abaixo para compilar:

 #include  

Ouvi dizer que ele pode compilar erros de syntax …

Infelizmente, você selecionou três compiladores que suportam vários idiomas, não apenas o C ++. Todos eles têm que adivinhar a linguagem de programação que você usou. Como você provavelmente já sabe, o formato PNG é adequado para todas as linguagens de programação, não apenas para C ++.

Normalmente, o compilador pode descobrir a própria linguagem. Por exemplo, se o PNG for obviamente desenhado com giz de cera, o compilador saberá que ele contém o Visual Basic. Se parecer que foi desenhado com uma lapiseira, é fácil reconhecer o engenheiro no trabalho, escrevendo o código FORTRAN.

Este segundo passo também não ajuda o compilador, neste caso. C e C ++ parecem muito semelhantes, até o #include . Portanto, você deve ajudar o compilador a decidir qual linguagem realmente é. Agora, você poderia usar meios não padronizados. Por exemplo, o compilador do Visual Studio aceita os argumentos de linha de comando / TC e / TP ou você pode usar a opção “Compilar como: C ++” no arquivo de projeto. O GCC e o CLang têm seus próprios mecanismos, que eu não sei.

Portanto, eu recomendo usar o método padrão para informar ao seu compilador que o código a seguir está em C ++. Como você já descobriu, os compiladores de C ++ são muito exigentes quanto ao que aceitam. Portanto, a maneira padrão de identificar o C ++ é pelos intimidadores que os programadores adicionam ao seu código C ++. Por exemplo, a linha a seguir irá esclarecer ao seu compilador que o que segue é o C ++ (e ele deve compilá-lo melhor sem reclamações).

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

Seu compilador está configurado no modo expert ?! Se sim, não deve compilar. Compiladores modernos estão cansados ​​de “Hello World!”

Tente este:

Você vê o dinossauro no ônibus espacial?

OCR diz:

 N lml_ e  

Que é muito bom, para ser justo.

helloworld.png: arquivo não reconhecido: formato de arquivo não reconhecido

Obviamente, você deve formatar seu disco rígido.

Na verdade, esses erros não são tão difíceis de ler.

Eu converti seu programa de PNG para ASCII, mas ele não compila ainda. Para sua informação, tentei com largura de linha de 100 e 250 caracteres, mas ambos renderam em resultados comparáveis.

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

O primeiro problema é que você está tentando retornar um valor incorreto no final da function principal. O padrão C ++ determina que o tipo de retorno main () é int, mas você está tentando retornar o conjunto vazio.

O outro problema é – pelo menos com g ++ – que o compilador deduz a linguagem usada do sufixo do arquivo. De g ++ (1):

Para qualquer arquivo de input, o sufixo do nome do arquivo determina que tipo de compilation é feito:

file.cc file.cp file.cxx arquivo.cpp file.CPP file.c ++ file.C

Código-fonte C ++ que deve ser pré-processado. Observe que em .cxx, as duas últimas letras devem ser literalmente x. Da mesma forma, .C refere-se a um capital literal C.

Consertar isso deve deixar você com um aplicativo Hello World totalmente funcional, como pode ser visto na demonstração aqui .

Sua fonte é uma porcaria, como um analisador deveria ser capaz de ler isso? Faça um curso de caligrafia.

Seus compiladores estão esperando ASCII , mas esse programa é obviamente escrito usando EBCDIC .

Você está tentando compilar uma imagem.

Digite o que você escreveu em um documento chamado main.cpp, execute esse arquivo através do seu compilador e execute o arquivo de saída.

Você precisa especificar a precisão de sua saída precedida por dois pontos imediatamente antes da chave de fechamento final . Como a saída não é numérica, a precisão é zero, então você precisa disso

: 0}

adicionar :

 using namespace std; 

logo após include: P: D

Parece que o seu compilador não suporta arquivos em tal codificação hmm … Tente convertê-lo para ASCII.

O problema está na definição da syntax, tente usar régua e compasso para uma descrição mais clássica!

Felicidades,

Tente mudar a interface de input. C ++ espera que um teclado seja conectado ao seu computador, não a um scanner. Pode haver problemas de conflito com periféricos aqui. Eu não verifiquei no ISO Standard se a interface de input do teclado é obrigatória, mas isso é verdade para todos os compiladores que já usei. Mas talvez a input do scanner esteja agora disponível em C99 e, nesse caso, seu programa deve funcionar. Se não, você terá que esperar a próxima versão padrão e atualizar os compiladores.

Você poderia tentar colors diferentes para colchetes, talvez um pouco de verde ou vermelho ajudaria? Eu acho que seu compilador não pode reconhecer tinta preta: P

Eu sou o único que não consegue reconhecer o caráter entre ‘retorno’ e o ponto e vírgula? Isso poderia ser isso!