Почему эта программа ошибочно отклонена тремя компиляторами C ++?

473

У меня возникли трудности с компиляцией написанной мной программы на С++.

Эта программа очень проста и, насколько мне известно, соответствует всем правилам, изложенным в стандарте С++. Я читал по всему ISO/IEC 14882: 2003 дважды, чтобы быть уверенным.

Программа выглядит следующим образом:

Изображение 35

Вот результат, который я получил при попытке скомпилировать эту программу с Visual С++ 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)

Честно говоря, я не знаю, что означает какое-либо из этих сообщений об ошибках.

У многих других программ на С++ есть исходные файлы с расширением .cpp, поэтому я подумал, что мне нужно переименовать мой файл. Я изменил его имя на helloworld.cpp, но это не помогло. Я думаю, что в Clang есть очень серьезная ошибка, потому что, когда я пытался использовать ее для компиляции переименованной программы, она перевернулась, напечатала "84 предупреждения и 20 возникших ошибок". и много сделал мой компьютер!

Что я сделал здесь неправильно? Я пропустил какую-то критическую часть стандарта С++? Или все три компилятора действительно настолько разбиты, что не могут скомпилировать эту простую программу?

Теги:
clang
visual-c++
compiler-errors

31 ответ

182
Лучший ответ

В стандарте в §2.1/1 указано:

Символы физического исходного файла сопоставляются определенным образом в соответствии с базовым набором символов источника (вводя символы новой строки для индикаторов конца строки), если это необходимо.

Ваш компилятор не поддерживает этот формат (он не может сопоставить его с базовым набором символов источника), поэтому он не может перейти на дополнительные этапы обработки, следовательно, ошибка. Вполне возможно, что ваш компилятор поддерживает сопоставление от изображения к базовому набору символов, но не требуется.

Поскольку это сопоставление определяется реализацией, вам нужно посмотреть документацию по реализации, чтобы увидеть поддерживаемые форматы файлов. Как правило, каждый крупный поставщик компилятора поддерживает (канонически определенные) текстовые файлы: любой файл, создаваемый текстовым редактором, обычно представляет собой ряд символов.


Обратите внимание, что стандарт С++ основан на стандарте C (§1.1/2), а стандарт C (99) говорит в § 1.2:

В этом международном стандарте не указывается - механизм, посредством которого программы С преобразуются для использования обработкой данных система;
- механизм, с помощью которого программ C вызывается для использования обработкой данных система;
- механизм, с помощью которого входные данные преобразуются для использования программой C;

Итак, опять-таки, обработка исходных файлов - это то, что вам нужно найти в документации ваших компиляторов.

  • 23
    Я думаю, что предложение в лучшем случае неоднозначно. В словаре Merriam-Webster говорится, что текст - это оригинальные слова и форма письменного или печатного произведения или произведения, содержащего такой текст . Этот исходный файл явно подпадает под это определение. Как вы думаете, мне следует подать отчет о дефектах в Рабочую группу по основным языкам?
548

Изображение 1200

Первоначально из Overv @reddit.

304

Попробуйте следующим образом:

Изображение 1201

222

Ваши < и >, ( и ), { и }, похоже, не очень хорошо соответствуют; Попробуйте сделать их лучше.

  • 44
    Хотя я не ценю, что вы высмеиваете мой почерк, это может быть реальной проблемой и объясняет ошибку, которую я получаю, когда пытаюсь скомпилировать переименованный helloworld.cpp с Visual C ++: «фатальная ошибка C1004: неожиданный конец файл найден "Я попробую еще раз и скоро сообщу. Спасибо!
  • 37
    @James убедитесь, что вы отключили все оптимизации png. это облегчает отладку.
164

Вы можете попробовать следующий python script. Обратите внимание, что вам нужно установить 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
112

Вы забыли использовать Comic Sans в качестве шрифта, поэтому его ошибка.

76

Я не вижу новую строку после этой последней фигурной скобки.

Как вы знаете: "Если исходный файл, который не является пустым, не заканчивается символом новой строки,... поведение undefined".

75

Эта программа действительна - я не могу найти ошибок.

Я предполагаю, что на вашем компьютере есть вирус. Было бы лучше, если вы переформатируете свой диск и переустановите операционную систему.

Сообщите нам, как это работает, или если вам нужна помощь при переустановке.

Я ненавижу вирусы.

60

Я нашел, что это помогает не писать мой код на моем стекле монитора с помощью волшебного маркера, хотя он выглядит красиво, когда он действительно черный. Экран заполняется слишком быстро, а затем люди, которые дают мне чистый монитор, называют меня именами каждую неделю.

Несколько моих сотрудников (я менеджер) забивают, чтобы купить мне один из тех красных компьютеров с ручками. Они сказали, что мне не нужны маркеры, и я могу очистить экран сам, когда он будет полным, но я должен осторожно встряхнуть его. Я предположил, что это деликатно.

Вот почему я нанимаю умных людей.

60

File format not recognized Вам необходимо правильно форматировать файл. Это означает использование правильных цветов и шрифтов для вашего кода. См. Конкретные документы для каждого компилятора, поскольку эти цвета различаются между компилятором;)

59

Вы забыли предварительный процессор. Попробуйте следующее:

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

Вы перенесли программу, а затем отсканировали ее на компьютер? Это то, что подразумевается под "helloworld.png". Если это так, вам нужно знать, что стандарт С++ (даже в его новейшей редакции) не требует наличия оптического распознавания символов, и, к сожалению, он не включен в качестве дополнительной функции в любой текущий компилятор.

Вы можете рассмотреть возможность переноса графики в текстовый формат. Может использоваться любой текстовый редактор; использование текстового процессора, способного генерировать красивую распечатку, скорее всего приведет к той же ошибке, которую вы получите при попытке сканирования.

Если вы действительно предприимчивы, вы можете попытаться записать свой код в текстовый процессор. Распечатайте его, предпочтительно используя шрифт OCR-A. Затем возьмите распечатку и сканируйте ее обратно. Затем сканирование можно запустить через сторонний пакет OCR для создания текстовой формы. Текстовая форма затем может быть скомпилирована с использованием одного из многих стандартных компиляторов.

Остерегайтесь, однако, большой стоимости бумаги, которую это повлечет за собой на этапе отладки.

  • 14
    +1: Спасибо за спасение планеты на этапе отладки!
  • 2
    О, ASM, да! ASM в перфокартах .
48

Нарисуйте нижеследующее ниже, чтобы скомпилировать его:

#include <ChuckNorris>

Я слышал, что он может скомпилировать синтаксические ошибки...

  • 46
    Я лично предпочитаю #include <JonSkeet> .
41

К сожалению, вы выбрали три компилятора, которые поддерживают несколько языков, а не только С++. Все они должны угадать на языке программирования, который вы использовали. Как вы, наверное, уже знаете, формат PNG подходит для всех языков программирования, а не только для С++.

Обычно компилятор может определить сам язык. Например, если PNG явно нарисована с помощью карандашей, компилятор будет знать, что он содержит Visual Basic. Если это выглядит так, как будто он нарисован механическим карандашом, легко понять инженера на работе, написав код FORTRAN.

Этот второй шаг также не помогает компилятору. C и С++ выглядят слишком похожими, вплоть до #include. Поэтому вы должны помочь компилятору решить, какой язык он на самом деле. Теперь вы можете использовать нестандартные средства. Например, компилятор Visual Studio принимает аргументы командной строки /TC и /TP, или вы можете использовать опцию "Скомпилировать как: С++" в файле проекта. GCC и CLang имеют свои собственные механизмы, которых я не знаю.

Поэтому я бы рекомендовал использовать стандартный метод, чтобы сообщить вашему компилятору, что следующий код находится на С++. Как вы уже выяснили, компиляторы С++ очень разборчивы в отношении того, что они принимают. Поэтому стандартный способ идентифицировать С++ программистами-запугиваниями добавляет их код на С++. Например, следующая строка разъяснит вашему компилятору, что следующим является С++ (и он лучше компилирует его без жалоб).

// To the compiler: I know where you are installed. No funny games, capice?
  • 10
    Я думал, что #pragma был правильным способом «получить сообщение» компилятору?
34

Попробуйте следующее:

Изображение 1202

34

Является ли ваш компилятор установлен в экспертном режиме?! Если да, он не должен компилироваться. Современные компиляторы устали от "Hello World!"

27

helloworld.png: файл не распознан: файл формат не распознан

Очевидно, что вы должны отформатировать жесткий диск.

Действительно, эти ошибки не так уж трудно читать.

26

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
    Ничего себе, распознавание текста улучшилось с тех пор, как я попытался отсканировать свой почерк (тоже потратил много времени на его написание).
  • 40
    Я думаю, что нам нужно добавить тег Perl.
22

Я конвертировал вашу программу из PNG в ASCII, но пока не компилируется. Для вашей информации я попытался с шириной линии 100 и 250 символов, но оба они дают сопоставимые результаты.

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

Первая проблема заключается в том, что вы пытаетесь вернуть неправильное значение в конце основной функции. Стандарт С++ диктует, что возвращаемый тип main() является int, но вместо этого вы пытаетесь вернуть пустой набор.

Другая проблема - по крайней мере с g++ - что компилятор выводит язык, используемый из суффикса файла. Из g++ (1):

Для любого заданного входного файла файл суффикс имени определяет, какие сбор производится:

file.cc file.cp file.cxx file.cpp file.CPP file.С++ file.C

Исходный код С++, который должен быть предварительно обработан. Обратите внимание, что в .cxx последние две буквы должны быть буквально х. Аналогично,.C ссылается на буквальный капитал C.

Исправление этих проблем должно оставить вас с полностью работающим приложением Hello World, как видно из демонстрации здесь.

  • 3
    У меня был профессор, когда кто-то снимал баллы с вашей домашней работы или экзаменов, если вы ставили косую черту через ноль, поскольку ноль не является нулевым набором. Он был бы признателен за этот ответ.
15

Ваш шрифт засасывает, как должен синтаксический анализатор когда-либо читать это? Пройдите курс каллиграфии.

13

Ваши компиляторы ожидают ASCII, но эта программа, очевидно, написана с использованием EBCDIC.

  • 0
    Последнее, что я слышал, C ++ не указывает, что программы должны быть написаны на ASCII, UTF-8 или чем-то еще.
8

Вы пытаетесь скомпилировать изображение.

Введите то, что вы написали вручную, в файл main.cpp, запустите этот файл через свой компилятор, затем запустите выходной файл.

  • 23
    Проверьте дату на вашем компьютере.
  • 14
    Ха-ха, но я, наконец, нашла легкий ответ, на который я могла ответить!
Показать ещё 1 комментарий
7

Вам нужно указать точность вашего вывода, которому предшествует двоеточие непосредственно перед окончательной скобкой закрытия. Поскольку вывод не является числовым, точность равна нулю, поэтому вам это нужно -

: 0}

6

Кажется, что ваш компилятор не поддерживает файлы в такой хм... кодировке. Попробуйте преобразовать его в ASCII.

6

добавить:

using namespace std;

сразу после: P: D

  • 5
    Я предпочитаю печатал std все время. Напоминает мне, чтобы не получить один.
5

Я единственный, кто не может распознать символ между "возвратом" и точкой с запятой? Это может быть так!

  • 4
    Это заглавная буква O со специальной линией, которую мы называем «диаметр», которая указывает компилятору, очевидно, использовать алгоритм окружности средней точки. Я думаю, вы должны проверить свои глаза.
  • 1
    Мне стыдно....
5

Вы можете попробовать разные цвета для скобок, может быть, некоторые зеленые или красные помогут? Я думаю, что ваш компилятор не может распознать черные чернила: P

5

Попробуйте переключить интерфейс ввода. С++ ожидает, что клавиатура будет подключена к вашему компьютеру, а не сканеру. Здесь могут быть проблемы с периферийными устройствами. Я не проверял стандарт ISO, если интерфейс ввода клавиатуры является обязательным, но это верно для всех компиляторов, которые я когда-либо использовал. Но, возможно, вход сканера теперь доступен на C99, и в этом случае ваша программа действительно должна работать. Если нет, вам придется подождать следующего стандартного выпуска и обновления компиляторов.

5

Проблема заключается в определении синтаксиса, попробуйте использовать линейку и компасы для более классического описания!

Приветствия,

4

Запустите компилятор через OCR. Это может решить проблему совместимости.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню