2011-04-01 78 views
473

我在编写我编写的C++程序时遇到了一些困难。为什么这个程序被三个C++编译器错误地拒绝了?

该程序非常简单,并且据我所知,符合C++标准中规定的所有规则。我已经仔细阅读了两次ISO/IEC 14882:2003的全部内容。

的程序如下:

enter image description here

这里是试图编译该程序用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 

感到不安,我试图克++ 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++标准的一些关键部分吗?还是所有三个编译器真的太破碎了,以至于无法编译这个简单的程序?

回答

174

在标准中,§2.1/ 1指定:

物理源文件中的字符被映射,在一个实现定义的方式,到基本的源字符集(如果需要的话,引入结束指示符的新行字符)。

你的编译器不支持该格式(又名不能将其映射到基本源字符集),因此它不能移动到进一步的处理阶段,所以该错误。您的编译器完全可以支持从映像到基本源字符集的映射,但不是必需的。

由于此映射是实现定义的,因此您需要查看实现文档以查看其支持的文件格式。通常,每个主要编译器供应商都支持(规范定义的)文本文件:由文本编辑器生成的任何文件,通常是一系列字符。


注意,C++标准是基于离C标准(§1.1/ 2),和C(99)标准说,在§1.2:

该国际标准并不指定
- C程序转换为供数据处理系统使用的机制;
- 调用C程序供数据处理系统使用的机制;
- 输入数据转换为C程序使用的机制;

因此,再次,源文件的处理是您需要在编译器文档中找到的东西。

+23

我认为这句话充其量是含糊不清的。 Merriam-Webster字典表示_text_是书面或印刷作品的原始单词和形式,或者包含此类text_的作品。该源文件明显属于该定义。你认为我应该向核心语言工作组提交缺陷报告吗? – 2011-04-01 01:27:54

6

地址:

using namespace std; 

之后包括:P:d

+5

我更喜欢一直输入'std'。提醒我不要得到一个。 – 2011-04-09 04:23:28

60

File format not recognized您需要正确设置文件格式。这意味着为您的代码使用正确的颜色和字体。请参阅每个编译器的具体文档,因为编译器之间的这些颜色会有所不同;)

49

您是否手写该程序并将其扫描到计算机中?这就是“helloworld.png”所暗示的。如果是这种情况,您需要知道C++标准(即使在其最新版本中)不需要光学字符识别,不幸的是,它不作为任何当前编译器的可选功能包含在内。

您可能需要考虑将图形转换为文本格式。任何纯文本编辑器都可以使用;使用文字处理器虽然能够生成漂亮的打印输出,但很可能会导致您在尝试扫描时遇到的相同错误。

如果您确实冒险,可以尝试将您的代码写入文字处理器。打印它,最好使用像OCR-A这样的字体。然后,将您的打印输出并重新扫描。然后可以通过第三方OCR包运行扫描以生成文本格式。然后可以使用许多标准编译器之一编译文本表单。

然而,请注意,这将在调试阶段造成巨大的造纸成本。

+14

+1:感谢您在调试阶段拯救地球! – Johnsyweb 2011-04-01 01:03:59

+2

哦ASM,是的! [冲卡中的ASM](http://en.wikipedia.org/wiki/File:IBM1620SPSpunchcard.agr.jpg)。 – jweyrich 2011-04-01 01:34:48

112

您忘记使用Comic Sans作为字体,这就是它错误的原因。

157

你可以试试下面的python脚本。请注意,您需要安装PILpytesser

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 
212

<>(){}似乎并不匹配得非常好;尝试绘制它们更好。

+44

虽然我不欣赏你取笑我的手写,但这可能是真正的问题,并且会解释我在尝试使用Visual C++编译重命名的_helloworld.cpp_时遇到的错误:“致命错误C1004:意外结束“找到文件”我会再试一次并尽快报告。谢谢! – 2011-04-01 01:31:23

+37

@James确保关闭所有png优化。它使调试更容易。 – wilhelmtell 2011-04-01 02:30:39

57

你忘了预处理器。试试这个:

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

我在最后一个大括号之后看不到换行符。

正如你所知道的那样:“如果一个非空的源文件不是以换行符结束......行为未定义”。

75

该程序是有效的 - 我可以找到没有错误。

我的猜测是你的机器上有病毒。如果您重新格式化驱动器并重新安装操作系统,那最好。

让我们知道这是如何解决的,或者如果您需要重新安装的帮助。

我讨厌病毒。

6

似乎你的编译器不支持这样的HMM编码文件。尝试将其转换为ASCII。

63

我发现它有助于不使用魔术记号笔在我的显示器玻璃上写我的代码,即使它看起来不错,但它的颜色真的很黑。屏幕填满得太快,然后给我一个干净的显示器的人每周给我打电话。

我的几个员工(我是经理)正在削减给我买这些带旋钮的红色平板电脑之一。他们说我不需要标记,我可以在屏幕满了时自己清理屏幕,但我必须小心翼翼地晃动屏幕。我认为这很微妙。

这就是为什么我雇用聪明的人。

33

您的编译器是否设置为专家模式?如果是的话,它不应该编译。现代编译器厌倦了“Hello World!”

5

问题在于语法定义,请尝试使用标尺和圆规进行更经典的描述!

干杯,

7

你需要马上最终收盘括号前指定你的输出一个冒号之前的精度。由于输出不是数字,精度为零,所以你需要这个 -

:0}

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? 
+10

我以为'#pragma'是向编译器“获取消息”的正确方法吗? – 2011-04-01 15:18:17

21

我没有将您的程序从PNG转换为ASCII,但它尚未编译。为了您的信息,我确实尝试了宽度为100和250的字符,但两者的结果都相当。

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

您应该使用[80或甚至72列](http://en.wikipedia.org/wiki/Punched_card#IBM_80_column_punched_card_format)代替 – 2011-04-01 11:28:51

15

您的字体很糟糕,解析器应该如何读取?参加书法课程。

8

您正在尝试编译图像。

输入你手写在名为main.cpp的文档中的内容,通过编译器运行该文件,然后运行输出文件。

+23

在您的PC上检查日期。 – 2011-04-01 12:18:44

+14

哈哈,但我终于找到了一个容易的答案! – 2011-04-01 12:32:51

+10

这很愚蠢。我们都知道编译器会优化空白,只留下严重压缩的黑色空间,这就是所有的黑色空间,并且会压缩为二进制1,这将作为错误返回。代码需要使用white-out编写,编译为0,不会返回错误。 – 2011-04-01 15:04:15

5

尝试切换输入接口。 C++期望将键盘插入到您的计算机中,而不是扫描仪。这里可能有外设冲突问题。如果键盘输入接口是强制性的,我没有检查ISO标准,但是对于我曾经使用过的所有编译器都是如此。但是现在可以在C99中使用扫描仪输入,在这种情况下,您的程序确实可以工作。如果没有,你将不得不等待下一个标准版本和编译器升级。

5

你可以尝试不同颜色的括号,也许一些绿色或红色将有所帮助? 我认为你的编译器无法识别黑色墨水:P

4

通过OCR运行编译器。它可能会解决兼容性问题。

13

你的编译器都期待ASCII,但该程序是明显使用EBCDIC写的。

+0

最后我听说C++没有指定程序必须以ASCII,UTF-8或其他方式写入。 – 2011-10-28 16:27:40

46

下面划了包括使其编译:

#include <ChuckNorris> 

我听说他可以编译语法错误......

+46

我个人更喜欢'#包括'。 – Icode4food 2011-04-01 12:54:54

33

试试这个:

Do you see the dinosaur in the space shuttle?

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

这是非常好的,公平的。

+4

哇,自从我尝试扫描我的笔迹后,OCR已经有所改进(花费了几个小时的时间直写)。 – 2011-04-01 13:30:27

+40

我想我们需要添加一个Perl标签。 – MSalters 2011-04-04 07:48:59

26

helloworld.png:文件无法识别:文件格式认可

很显然,你应该格式化你的硬盘。

真的,这些错误并不难看懂。

320

试试这个方法:

enter image description here

5

我是谁无法识别“回归”和分号之间的字符只有一个?这可能是!

+4

这是一个大写字母O,带有一个我们称之为“直径”的特殊线,它告诉编译器显然使用中点圆算法。我认为你应该检查你的眼睛。 – 2011-04-09 05:03:19

+1

对我感到羞耻.... – techolic 2011-04-25 02:43:13

16

第一个问题是,您尝试在主函数的末尾返回错误的值。 C++标准规定main()的返回类型是int,但是你试图返回空集。

另一个问题是 - 至少在g ++中 - 编译器从文件后缀中推导出使用的语言。从G ++(1):

对于任何给定的输入文件,该文件 名后缀决定什么样的 编译完成:

file.cc file.cp file.cxx file.cpp文件。 CPP file.C++ file.C

必须预处理的C++源代码。请注意,在.cxx中,后两个字母都必须是字面x。同样,.C是指 字面资本C.

修复这些应该留给你一个完全正常的Hello World应用程序,这可以从演示here可以看出。

+3

我有一个教授的方式回来,当谁将你的作业或考试,如果你通过一个零数字斜杠起飞,因为零不是空集。他会很感激这个答案。 – 2011-04-01 20:44:03

相关问题