编写我编写的C ++程序时遇到了一些困难。
这个程序非常简单,据我所知,它符合C ++标准中规定的所有规则。我已经两次阅读整个ISO / IEC 14882:2003以确定。
该计划如下:
以下是我尝试使用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
感到沮丧,我尝试了g ++ 4.5.2,但它同样无益:
c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
我认为Clang(版本3.0主干127530)必须正常工作,因为它的标准一致性受到高度赞扬。不幸的是,它甚至没有给我一个漂亮的,突出显示的错误消息:
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)
说实话,我真的不知道这些错误信息是什么意思。
许多其他C ++程序的源文件都带有 .cpp 扩展名,所以我想也许我需要重命名我的文件。我将其名称更改为 helloworld.cpp ,但这没有帮助。我认为Clang中存在一个非常严重的错误,因为当我尝试使用它来编译重命名的程序时,它会翻出来,打印出“84个警告和20个错误”。并让我的电脑发出很多嘟嘟声!
我在这里做错了什么?我是否错过了C ++标准的一些关键部分?或者所有三个编译器真的如此破碎,以至于无法编译这个简单的程序?
答案 0 :(得分:576)
答案 1 :(得分:320)
尝试这种方式:
答案 2 :(得分:212)
您的<
和>
,(
和)
,{
和}
似乎并不匹配;尝试更好地绘制它们。
答案 3 :(得分:174)
在标准中,§2.1/ 1指定:
物理源文件字符以实现定义的方式映射到基本源字符集(如果需要,引入行尾指示符的换行符)。
您的编译器不支持该格式(也称不能将其映射到基本源字符集),因此无法进入进一步的处理阶段,因此错误。您的编译器完全有可能支持从映像到基本源字符集的映射,但不是必需的。
由于此映射是实现定义的,因此您需要查看实现文档以查看它支持的文件格式。通常,每个主要编译器供应商都支持(规范定义)文本文件:文本编辑器生成的任何文件,通常是一系列字符。
请注意,C ++标准基于C标准(§1.1/ 2),C(99)标准在§1.2中表示:
本国际标准未指明
- C程序转换为数据处理使用的机制 系统;
- 调用C程序以供数据处理使用的机制 系统;
- 转换输入数据以供C程序使用的机制;
因此,您需要在编译器文档中找到源文件的处理方法。
答案 4 :(得分:157)
您可以尝试以下python脚本。请注意,您需要安装PIL和pytesser。
from pytesser import *
image = Image.open('helloworld.png') # Open image object using PIL
print image_to_string(image) # Run tesseract.exe on image
要使用它,请执行:
python script.py > helloworld.cpp; g++ helloworld.cpp
答案 5 :(得分:111)
你忘了使用Comic Sans作为字体,这就是它出错的原因。
答案 6 :(得分:76)
在最后一个支撑之后我看不到新线。
如您所知:“如果非空源文件不以换行符结尾,则行为未定义”。
答案 7 :(得分:75)
此程序有效 - 我找不到任何错误。
我的猜测是你的机器上有病毒。最好重新格式化驱动器,然后重新安装操作系统。
让我们知道这是如何解决的,或者如果您需要重新安装的帮助。
我讨厌病毒。
答案 8 :(得分:63)
我发现在我的显示器玻璃上用魔术标记写我的代码是有帮助的,尽管当它非常黑时看起来不错。屏幕填满太快,然后给我一个干净的显示器的人每周给我打电话。
我的几个员工(我是一名经理)正准备给我买一台带旋钮的红色电脑。他们说我不需要标记,我可以自己清洁屏幕,但是我必须小心摇晃它。我认为这样很精致。
这就是我聘请聪明人的原因。
答案 9 :(得分:60)
File format not recognized
您需要正确格式化文件。这意味着为您的代码使用正确的颜色和字体。请参阅每个编译器的具体文档,因为这些颜色在编译器之间有所不同;)
答案 10 :(得分:57)
你忘记了预处理器。试试这个:
pngtopnm helloworld.png | ocrad | g++ -x 'c++' -
答案 11 :(得分:49)
您是否手写程序然后将其扫描到计算机中?这就是“helloworld.png”所暗示的内容。如果是这种情况,您需要注意C ++标准(即使在其最新版本中)不需要存在光学字符识别,并且遗憾的是它不包含在任何当前编译器中作为可选功能。
您可能需要考虑将图形转换为文本格式。可以使用任何纯文本编辑器;使用文字处理器,虽然能够生成漂亮的打印输出,但很可能会导致您在尝试扫描时遇到的相同错误。
如果您真的喜欢冒险,可以尝试将代码写入文字处理程序。打印它,最好使用OCR-A之类的字体。然后,将您的打印输出并重新扫描。然后可以通过第三方OCR包运行扫描以生成文本表单。然后可以使用许多标准编译器之一编译文本表单。
但要注意,在调试阶段会产生很大的纸张成本。
答案 12 :(得分:46)
绘制下面的包含以使其编译:
#include <ChuckNorris>
我听说他可以编译语法错误......
答案 13 :(得分:41)
不幸的是,您选择了三个都支持多种语言的编译器,而不仅仅是C ++。他们都必须猜测你使用的编程语言。您可能已经知道,PNG格式适用于所有编程语言,而不仅仅是C ++。
通常编译器可以找出语言本身。例如,如果PNG显然是用蜡笔绘制的,编译器就会知道它包含Visual Basic。如果它看起来像是用自动铅笔绘制的,那么很容易识别出工作中的工程师,编写FORTRAN代码。
在这种情况下,第二步对编译器也没有帮助。 C和C ++看起来太相似了,直到#include
。因此,您必须帮助编译器确定它实际上是什么语言。现在,您可以使用非标准方法。例如,Visual Studio编译器接受/TC and /TP命令行参数,或者您可以在项目文件中使用“编译为:C ++”选项。 GCC和CLang有自己的机制,我不知道。
因此,我建议使用标准方法来告诉编译器以下代码是用C ++编写的。正如你现在所发现的那样,C ++编译器非常挑剔他们所接受的东西。因此,识别C ++的标准方法是通过恐吓程序员添加到他们的C ++代码中。例如,以下行将向您的编译器说明接下来是C ++(并且他最好在没有抱怨的情况下编译它)。
// To the compiler: I know where you are installed. No funny games, capice?
答案 14 :(得分:33)
您的编译器是否设置为专家模式?!如果是,则不应编译。现代编译器厌倦了“Hello World!”
答案 15 :(得分:33)
试试这个:
答案 16 :(得分:27)
OCR说:
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 _ |
_|
这是非常好的,公平。
答案 17 :(得分:26)
helloworld.png:文件无法识别:文件格式无法识别
显然,您应该格式化硬盘。
真的,这些错误并不难读。
答案 18 :(得分:21)
我确实将您的程序从PNG转换为ASCII,但它还没有编译。为了您的信息,我尝试使用行宽100和250个字符,但两者都得到了相似的结果。
` ` . `. ` ...
+:: ..-.. --.:`:. `-` .....:`../--`.. `-
` ` ````
`
` `` .` `` .` `. `` . -``- ..
.`--`:` :::.-``-. : ``.-`- `-.-`:.-` :-`/.-..` ` `-..`...- :
.` ` ` ` .` ````:`` - ` ``-.` `
`- .. ``
. ` .`. ` ` `. ` . . ` . ` . . .` .` ` ` `` ` `
`:`.`:` ` -..-`.`- .-`-. /.-/.-`.-. -...-..`- :``` `-`-` :`..`-` ` :`.`:`- `
`` ` ```. `` ```` ` ` ` ` ` ` ` .
: -...`.- .` .:/ `
- ` `` .
-`
`
答案 19 :(得分:16)
第一个问题是,您试图在main函数的末尾返回一个不正确的值。 C ++标准规定main()的返回类型是int,但是你试图返回空集。
另一个问题是 - 至少用g ++ - 编译器推断出文件后缀使用的语言。从g ++(1):
对于任何给定的输入文件,该文件 名称后缀决定了什么样的 编译完成:
file.cc file.cp file.cxx file.cpp file.CPP file.c ++ file.C
必须预处理的C ++源代码。请注意,在.cxx中, 最后两个字母必须都是字面上的x。同样,.C指的是a 文字资本C.
修复这些应该会为您提供一个完整的Hello World应用程序,如演示here所示。
答案 20 :(得分:15)
你的字体糟透了,解析器怎么能读出来?参加书法课程。
答案 21 :(得分:13)
您的编译器需要 ASCII ,但该程序显然使用 EBCDIC 编写。
答案 22 :(得分:8)
您正在尝试编译图像。
键入您手写的文件名为main.cpp,通过编译器运行该文件,然后运行输出文件。
答案 23 :(得分:7)
您需要在最后的右括号之前指定输出的精度,前面是冒号。由于输出不是数字,精度为零,所以你需要这个 -
<强>:0} 强>
答案 24 :(得分:6)
似乎你的编译器不支持这种hmm ...编码的文件。尝试将其转换为ASCII。
答案 25 :(得分:6)
添加:
using namespace std;
之后包括:P:D
答案 26 :(得分:5)
尝试切换输入界面。 C ++希望将键盘插入计算机,而不是扫描仪。这里可能存在外围设备冲突问题。如果键盘输入接口是强制性的,我没有检查ISO标准,但对于我曾经使用过的所有编译器都是如此。但也许扫描仪输入现在可以在C99中使用,在这种情况下,您的程序应该确实有效。如果没有,您将不得不等待下一个标准版本和升级编译器。
答案 27 :(得分:5)
您可以尝试不同颜色的支架,也许一些绿色或红色会有帮助吗? 我认为你的编译器无法识别黑色墨水:P
答案 28 :(得分:5)
问题在于语法定义,尝试使用标尺和罗盘来获得更经典的描述!
干杯,
答案 29 :(得分:5)
我是唯一一个无法识别“返回”和分号之间的字符的人吗?可能就是这样!
答案 30 :(得分:4)
通过OCR运行编译器。它可能会解决兼容性问题。