B@DGO 5 / 5 / 0 Регистрация: 14.07.2009 Сообщений: 86 |
||||
1 |
||||
Как откомпилировать программу?18.10.2009, 15:18. Показов 1947. Ответов 10 Метки нет (Все метки)
0 |
1915 / 1065 / 384 Регистрация: 06.12.2008 Сообщений: 2,802 |
|
18.10.2009, 15:21 |
2 |
там где первый write(‘go’);
1 |
Страдалецъ Тимуровец 445 / 285 / 50 Регистрация: 10.09.2009 Сообщений: 963 |
||||
18.10.2009, 15:22 |
3 |
|||
Паскаль язык требовательный, он не в курсе что за переменная Go такая, которую вы пытаетесь вывести.
0 |
5 / 5 / 0 Регистрация: 14.07.2009 Сообщений: 86 |
|
18.10.2009, 15:27 [ТС] |
4 |
А ЧТО ЗА ОШИБКА EROR 15?
0 |
Тимуровец 445 / 285 / 50 Регистрация: 10.09.2009 Сообщений: 963 |
|
18.10.2009, 15:31 |
5 |
Судя по справке «Файл не найден»
0 |
5 / 5 / 0 Регистрация: 14.07.2009 Сообщений: 86 |
|
18.10.2009, 15:32 [ТС] |
6 |
А ВСЕ ПОНЯЛ ЕГО НАДО СОХРАНИТТЬ ПОТОМ НАДО НАЖАТЬ RUN RUN ДА ТАК?
0 |
1915 / 1065 / 384 Регистрация: 06.12.2008 Сообщений: 2,802 |
|
18.10.2009, 15:46 |
7 |
нифига не понял, ты что вообще хочешь сделать?
0 |
5 / 5 / 0 Регистрация: 14.07.2009 Сообщений: 86 |
|
18.10.2009, 15:47 [ТС] |
8 |
КАК РАБОТАТЬ С КОМПИЛЯТОРОМ А ТО В КНИЖКЕ НЕ НАПИСАННО?
0 |
Puporev Почетный модератор 64291 / 47589 / 32740 Регистрация: 18.05.2008 Сообщений: 115,181 |
||||
18.10.2009, 15:52 |
9 |
|||
Напиши так.
Нажми Ctrl+F9 и радуйся.
0 |
1915 / 1065 / 384 Регистрация: 06.12.2008 Сообщений: 2,802 |
|
18.10.2009, 15:53 |
10 |
написал прогу, нажимашь:
0 |
3067 / 727 / 69 Регистрация: 24.09.2008 Сообщений: 1,531 |
|
18.10.2009, 16:15 |
11 |
И, да, Уважаемый B@DGO, уважайте форумчан и гостей форума, пишите нормальными , не прописными, буквами. Заранее благодарю.
0 |
Вопрос по информатике:
Помогите!!! Практическое задание №7
Тема: Знакомство с языком Паскаль.
1. а) Набрать в редакторе системы Турбо-Паскаль следующую программу:
Program my;
Var a,b,c,s:integer;
Begin
ReadLn(a);
ReadLn(b);
ReadLn(c);
S:=a*b*c;
WriteLn(S)
End.
б) Откомпилировать набранную программу и исправить ошибки.
в) Запустить данную программу на выполнение и проверить правильность её работы для чисел 2, 4 и 6.
г) Запустить данную программу на выполнение и проверить правильность её работы для чисел 1, 0 и -1.
д) Запустить данную программу на выполнение и проверить правильность её работы для чисел -2, 3 и 10.
2. Написать программу, которая присваивает целой переменной A значение 10 и выводит это значение на экран.
3. Написать программу, которая запрашивает ввод целого числа в переменную B и выводит это число на экран. Проверить правильность работы программы на числах 1, -5, 256, 10455.
4. Написать программу, которая запрашивает ввод вещественного числа в перемен-ную C, умножает это число на 2 и выводит результат на экран. Проверить правильность работы программы на числах 2.5, -7.33, 0, 782.234.
5. Написать программу для ввода значения величины X целого типа, присваивания величине Y действительного типа значения 5.5, вычисления значения величины Z = X — Y и вывода значения величины Z. Протестировать программу для X=5.5, X=0, X=-10.2
Урок 1
Начнем знакомство с Паскалем с программы, которая
считывает два числа с клавиатуры, складывает их и выводит сумму на экран.
Текст |
Комментарий |
Program SUMMA; |
заголовок программы |
Структура программы на Паскале следующая.
Сначала идет заголовок – Program SUMMA;
Затем описываются данные, используемые в программе. Слово Var начинает
раздел описаний переменных. В примере описаны три переменные целого типа — integer. Существуют и другие типы, о чем речь
пойдет ниже.
Помимо переменных здесь (до слова Begin) могут также
описываться: внешние модули, константы, метки, типы, функции и процедуры.
Слово Begin начинает
раздел операторов программы, а End – заканчивает. То есть, между Begin и End находится
собственно сама программа. После End обязательна точка!
Каждый оператор заканчивается точкой с запятой. А вот
после слов, начинающих новый раздел – Program, Var, Begin — точка с
запятой не ставится.
Каждый оператор записывается на новой строке, хотя это и
не обязательно. Просто так удобнее читать текст программы. Ошибки не будет,
если, например, все операторы разместить в одной строке:
Write(‘Введите два
числа ’); Readln(X,Y); Z:=X+Y; Write(‘Сумма чисел ’,Z);
Структура программы в общем виде:
Заголовок |
Program <имя>; |
Заголовок программы |
|
Раздел описаний |
Uses <..>; |
Описание модулей |
|
Label <..>; |
Описание меток |
||
Constant <..>; |
Описание констант |
||
Type <..>; |
Описание типов данных |
||
Var <..>; |
Описание переменных |
||
Procedure <имя>(<параметры>); |
Описание процедур |
||
<раздел описаний для проц.> |
|||
Begin |
|||
<операторы> |
|||
End; |
|||
Function<имя>(<параметры>): <тип>; |
Описание функций |
||
<раздел описаний для функ.> |
|||
Begin |
|||
<операторы> |
|||
End; |
|||
Раздел операторов |
Begin |
Начало раздела |
|
<операторы> |
Операторы |
||
End. |
Конец раздела |
Подготовительные действия.
Каталог с библиотеками Turbo Pascal называется TP (если у
вас Borland Pascal то BP). Запускающая программа находится в подкаталоге BIN в файле turbo.exe (bp.exe). Её
ярлык есть на Рабочем столе.
Запустите систему.
При запуске системы обычно открывается окно с новой программой
под именем NONAME00.PAS.
Для входа в меню служит клавиша F10 (или «мышь»). Строка
меню расположена вверху экрана, передвижение по ней производится стрелками.
Чтобы создать каталог для своих программ, воспользуемся
функцией выхода в DOS – File – DOS Shell. В появившейся командной строке наберите команду создания
каталога MD MMF2 и выполните
ее, нажав Enter. Будет создан каталог MMF2 (по имени вашей группы). Для выхода из DOS выполните команду EXIT.
Чтобы создаваемые вами программы автоматически сохранялись в
вашем каталоге, сделайте его текущим, выполнив функцию File—Change Dir. Здесь надо щелкнуть сдвоенным щелчком по нужному каталогу. Или
выделите каталог и щелкните ChDir. Закройте
диалоговое окно – OK.
Каждое новое
занятие начинайте с установки своего текущего каталога — File—Change Dir!
Для открытия ранее сохраненной программы выполняется File – Open.
Для создания новой программы – File – New.
Для
выхода из системы – File – Exit.
При входе в Turbo Pascal, возможно, вы
видите программу, с которой работали в предыдущем сеансе – вы или кто другой.
Её приходится убирать. Чтобы не заниматься этим всякий раз, поступите следующим
образом:
Закройте программу – слева вверху зеленый квадратик.
И сохраните текущие настройки – Options
– Save BP.TP
Введите текст программы.
Делайте такие же отступы, какие имеются в примере. Эти отступы
облегчают чтение текста и поиск ошибок.
Большие или маленькие буквы – значения не имеет.
Левый Ctrl+Shift – английский регистр. Правый Ctrl+Shift –русский.
Сохраните программу – File – Save (F2), в
появившемся окне введите имя файла (например, SUMMA) и — OK.
Для перехода от Уроков к системе
Борланд Паскаль и наоборот используйте сочетание клавишей ALT+TAB.
Компиляция программы.
После того, как программа набрана на алгоритмическом
языке, ее надо перевести на машинный язык – откомпилировать.
Выполните функцию Compile-Compile (Alt+F9).
Если компилятор найдет ошибку, то Сообщение об ошибке будет
выдано в красной строке, при этом курсор
устанавливается на ошибочном операторе (или рядом).
Самая распространенная ошибка – пропущенная точка с запятой.
Исправьте ошибку и снова откомпилируйте программу.
Если ошибок нет, будет выдано сообщение:
«Compile successfull: Press any key«
Нажмите
Enter – сообщение исчезнет.
Выполнение программы.
Теперь запустим программу на выполнение – Run – Run (Ctrl+F9).
В ответ на запрос ввести два числа введите любые два числа через пробел
и нажмите Enter.
Программа запишет их значения в X и Y, вычислит Z и выведет результат на экран.
Выполнение программы продолжится дальше. И по окончании произойдет возврат в
редактор. Так что мы даже не успеем увидеть выведенное значение.
Чтобы его увидеть, выполните Debug – User Screen (пользовательское окно) или
нажмите Alt+F5.
Чтобы программа приостанавливалась после вывода
результата, вставьте после
Write(‘Сумма чисел
’,Z);
еще одну команду:
Readln;
Замечание. Если не выполнять
компиляцию, а сразу инициировать выполнение
программы, система сама сначала откомпилирует программу, и потом только начнет
ее выполнять.
Задание.
Внесите в программу такие изменения, чтобы
программа суммировала не два, а три числа.
Итак,
запомните последовательность действий каждого занятия:
1. Откройте программу Уроки.
2. Запустите Borland Pascal
3. Обязательно сделайте текущим
каталог с вашими программами: File – Change Dir, выделить нужный каталог, щелкнуть ChDir, OK.
4. Начинайте выполнять задания уроков
с того места, где закончили на предудущем занятии. Для перехода между Уроками и
Borland Pascal нажимайте Alt+Tab.
5. Для
выполнения определенных действий используйте функции меню или их заменяющие
горячие клавиши:
File – New – Создать новую программу
File – Open – Открыть ранее
сохраненную программу – F3
File – Save – Сохранить
программу – F2
File – Save
as –
Сохранить под другим именем
Compile –
Compile –
Откомпилировать программу — Alt+F9
Run – Run – Запустить программу на выполнение — Ctrl+F9
Debug – User
Screen – Открыть окно с результатом работы
программы — Alt+F5
File – Exit – Выйти из системы — Alt+X
Конспект урока
«Знакомство с языком Паскаль. Решение задач»
Учебный предмет, класс: Информатика, 9 класс.
Тип урока: урок изучения и первичного закрепления новых знаний.
Цель урока: Сформировать представление у учащихся об
основных понятиях темы: возникновение и назначение Паскаля, структура программы
на Паскале, операторы ввода, вывода, присваивания, правила записи
арифметических выражений, пунктуация Паскаля.
Задачи: Выработка навыков программирования на Паскале.
Ход урока
1. Организационный момент (2 мин). Здравствуйте ребята!
– Есть ли отсутствующие на уроке? (Записать,
кого нет).
2. Актуализация опорных материалов (3 мин)
§9, задание 7 в конце параграфа.
1.Что такое величина? Чем отличаются переменные и постоянные
величины?
2. Какие существуют
основные типы величин в программировании?
3. Как записывается
команда присваивания?
4. Что такое ввод?
Как записывается команда ввода?
5. Что такое вывод? Как записывается команда вывода?
3. Изучение нового материала (20 мин)
(Слайд 2) Среди современных языков
программирования одним из самых популярных является язык Паскаль. Этот
язык разработан в 1971 году и назван в честь Блеза Паскаля —
французского ученого, изобретателя механической вычислительной машины. Автор
языка Паскаль — швейцарский профессор Никлаус Вирт.
Паскаль — это
универсальный язык программирования, позволяющий решать самые разнообразные
задачи обработки информации.
Команду алгоритма,
записанную на языке программирования, принято называть оператором.
(Слайд 3) Программа на Паскале близка по
своему виду к описанию алгоритма на АЯ. Сравните алгоритм решения уже знакомой
вам задачи деления простых дробей с соответствующей программой на Паскале:
(Слайд 4)
Запись в
тетрадь.
(Слайд 5) Заголовок программы начинается со
слова Program (программа), за которым следует произвольное имя, придуманное
программистом:
Program <имя программы>;
Запись в
тетрадь.
(Слайд 6) Раздел описания переменных
начинается со слова Var (variables — переменные), за которым
идет список имен переменных через запятую. Тип указывается после двоеточия. В
стандарте языка Паскаль существуют два типа числовых величин: вещественный
и целый.
Запись в
тетрадь.
Слово integer обозначает
целый тип (является идентификатором целого типа). Вещественный тип обозначается
словом real. Например, раздел описания переменных может быть таким:
var a, b: integer; с, d: real;
Запись в
тетрадь.
Идентификаторы
переменных составляются из латинских букв и цифр; первым символом обязательно
должна быть буква.
(Слайд 7) Раздел операторов — основная
часть программы. Начало и конец раздела операторов программы отмечаются
служебными словами begin (начало) и end (конец).
В самом конце программы ставится точка:
begin
<операторы>
end.
Запись в
тетрадь.
Операторы ввода, вывода,
присваивания
(Слайд Ввод
исходных данных с
клавиатуры происходит по оператору read (read —
читать) или readln (read line — читать строку):
read(<список
переменных>)
или readln(<список
переменных>)
Запись в
тетрадь.
При выполнении
команды ввода компьютер ожидает действий пользователя. Пользователь набирает на
клавиатуре значения переменных в том порядке, в каком переменные указаны в
списке, отделяя их друг от друга пробелами. Одновременно с набором данных на
клавиатуре они появляются на экране. В конце нажимается клавиша <ВВОД>
(<Enter>).
Разница в
выполнении операторов readln и read состоит в том, что после выполнения
ввода по оператору readln экранный курсор перемещается в начало новой строки, а
по оператору read этого не происходит.
Запись в
тетрадь.
(Слайд 9) Вывод
результатов происходит
по оператору write (write — писать) или writeln (write
line — писать в строку):
write(<список
вывода>)
или
writeln(<список вывода>)
Запись в
тетрадь.
Результаты выводятся
на экран компьютера в порядке их перечисления в списке. Элементами списка
вывода могут быть константы, переменные, выражения.
Разница в
выполнении операторов writeln и write состоит в том, что после выполнения
вывода по оператору writeln экранный курсор перемещается в начало новой строки,
а по оператору write этого не происходит.
Запись в
тетрадь.
(Слайд 10) Арифметический
оператор присваивания на Паскале имеет следующий формат:
<числовая
переменная>:=<арифметическое выражение>
Запись в
тетрадь.
(Арифметическое выражение может
содержать числовые константы и переменные, знаки арифметических операций,
круглые скобки. Кроме того, в арифметических выражениях могут присутствовать
функции.
Знаки основных
арифметических операций записываются так:
+ сложение,
— вычитание,
* умножение,
/ деление.
(Слайд 11) Запись арифметических выражений на Паскале
похожа на обычную математическую запись. Например, математическое выражение
А2 + В2 — 12С
на Паскале записывается так:
А*А + В*В — 12*С
Это же выражение можно записать
иначе:
SQR(А) + SQR(В) — 12*C
Запись в
тетрадь.
Здесь использована функция возведения в
квадрат — SQR. Аргументы функций всегда пишутся в круглых скобках.
Последовательность выполнения операций
определяется по их приоритетам (старшинству). К старшим
операциям относятся умножение (*) и деление (/). Операции сложения и вычитания
— младшие. В первую очередь выполняются старшие операции. Несколько операций
одинакового старшинства, записанные подряд, выполняются в порядке их записи
слева направо. Приведенное выше арифметическое выражение будет вычисляться в
следующем порядке (порядок вычислений указан цифрами сверху):
Пунктуация Паскаля
(Слайд 12) Необходимо строгое соблюдение правописания
(синтаксиса) программы. В частности, в Паскале однозначно определено
назначение знаков пунктуации.
Точка с запятой (;) ставится в конце заголовка программы, в конце
раздела описания переменных, является разделителем описания переменных в
разделе переменных и разделителем операторов. Перед словом end точку
с запятой можно не ставить.
Запятая (,) является разделителем элементов во всевозможных
списках: списке переменных в разделе описания, списках вводимых и выводимых
величин.
Текст программы заканчивается точкой.
(Слайд 13) В программу на Паскале можно вставлять
комментарии. Комментарий — это пояснение к программе, которое
записывается в фигурных скобках. В комментариях можно использовать русские
буквы. На исполнение программы комментарий никак не влияет.
4. Закрепление изученного материала (15 мин)
Задание 9 после параграфа 11.
5. (Домашнее задание (3 мин):
§11
Практическое
задание
Тема:
Знакомство с языком Паскаль
1 уровень сложности |
1. а) Набрать Program Var Begin S:=a*b*c; WriteLn(S) End. б) Откомпилировать в) Запустить г) Запустить д) Запустить 2. Написать 3. Написать 4. Написать 5. Написать 6. Написать |
2 уровень сложности |
1. Написать 2. Вводятся 3. Написать 4. Из железной 5. Найти площадь 6. Написать S= (2x+y)(x—y) Протестировать её для 1) x=2, |
3 уровень сложности |
1. Заданы 2. Дано натуральное 3. Дано натуральное 4. Вычислить расстояние |
Это ваша первая программа на C (или C++) — она не такая уж большая, и вы собираетесь скомпилировать ее. Вы нажимаете на compile
(или вводите команду компиляции) и ждете. Ваш компилятор выдает пятьдесят строк текста. Вы выбираете слова warning
и error
. Задумываетесь, значит ли это, что все в порядке. Вы ищите полученный исполняемый файл. Ничего. Черт возьми, думаете вы, я должен выяснить, что все это значит …
Типы ошибок компиляции
Во-первых, давайте различать типы ошибок. Большинство компиляторов покажет три типа предупреждений во время компиляции:
- предупреждения компилятора;
- ошибки компилятора;
- ошибки компоновщика.
Хоть вы и не хотите игнорировать их, предупреждения компилятора не являются чем-то достаточно серьезным, чтобы не скомпилировать вашу программу. Прочитайте следующую статью, которая расскажет вам, почему стоит дружить с компилятором и его предупреждениями. Как правило, предупреждения компилятора — это признак того, что что-то может пойти не так во время выполнения. Как компилятор узнает об этом? Вы, должно быть делали типичные ошибки, о которых компилятор знает. Типичный пример — использование оператора присваивания
=
вместо оператора равенства ==
внутри выражения. Ваш компилятор также может предупредить вас об использовании переменных, которые не были инициализированы и других подобных ошибках. Как правило, вы можете установить уровень предупреждений вашего компилятора — я устанавливаю его на самый высокий уровень, так что предупреждения компилятора не превращаются в ошибки в выполняемой программе (“ошибки выполнения”).
Тем не менее, предупреждения компилятора не должны останавливать работу вашей программы (если только вы не укажете компилятору рассматривать предупреждения как ошибки), так что они, вероятно, не так серьезны как ошибки.
Ошибки — это условия, которые препятствуют завершению компиляции ваших файлов.
Ошибки компилятора ограничены отдельными файлами исходного кода и являются результатом “синтаксических ошибок”. На самом деле, это означает, что вы сделали что-то, что компилятор не может понять. Например, выражение for(;)
синтаксически не правильно, потому что цикл всегда должен иметь три части. Хотя компилятор ожидал точку с запятой, он мог также ожидать условное выражение, поэтому сообщение об ошибке, которое вы получите может быть что-то вроде:
line 13, unexpected parenthesis ‘)’
Заметьте, что ошибки компилятора всегда будут включать номер строки, в которой была обнаружена ошибка.
Даже если вы прошли процесс компиляции успешно, вы можете столкнуться с ошибками компоновщика. Ошибки компоновщика, в отличие от ошибок компилятора, не имеют ничего общего с неправильным синтаксисом. Вместо этого, ошибки компоновщика — это, как правило, проблемы с поиском определения функций, структур, классов или глобальных переменных, которые были объявлены, но не определены, в файле исходного кода. Как правило, эти ошибки будут иметь вид:
could not find definition for X
Как правило, процесс компиляции начинается с серии ошибок компиляции и предупреждений и, исправив их, вы столкнетесь с ошибками компоновщика. В свою очередь, я бы сначала исправлял ошибки компиляции, а затем ошибки компоновщика.
Ошибки компилятора — с чего начать?
Если вы столкнулись с перечнем пятидесяти или шестидесяти ошибок и предупреждений, то будет сложно определить с чего начать. Самое лучшее место, тем не менее, в начале списка. В самом деле, вы почти никогда не начинаете исправлять ошибки от конца файла до его начала по одной простой причине: вы не знаете ошибки ли они на самом деле!
Одна ошибка в верхней части вашей программы может вызвать целый ряд других ошибок компилятора, потому что эти строки могут рассчитывать на что-то в начале программы, что компилятор не смог понять. Например, если вы объявляете переменную с неправильным синтаксисом, компилятор сообщит о синтаксических ошибках, и что он не может найти объявление для переменной. Точка с запятой, поставленные не в том месте, могут привести к огромному количеству ошибок. Это происходит, потому что синтаксис C и C++ синтаксис позволяет объявить тип сразу же после его определения:
struct { int x; int y; } myStruct;
код создаст переменную, MyStruct
, с местом для хранения структуры, содержащей два целых числа. К сожалению, это означает, что если вы опустите точку с запятой, компилятор будет интерпретировать это так, как будто следующая вещь в программе будет структурой (или возвращает структуру).
Что-то вроде этого:
struct MyStructType { int x; int y; } int foo() {}
может привести к огромному количеству ошибок, возможно, включая сообщения:
extraneous ‘int’ ignored
Все это из-за одного символа! Лучше всего начать с самого верха.
Анализ сообщения об ошибке
Большинство сообщений от компилятора будет состоять как минимум из четырех вещей:
- тип сообщения — предупреждение или ошибка;
- исходный файл, в котором появилась ошибка;
- строка ошибки;
- краткое описание того, что работает неправильно.
Вывод g++ для указанной выше программы может выглядеть следующим образом (ваши результаты могут отличаться, если вы используете другой компилятор):
foo.cc:7: error: semicolon missing after struct declaration
foo.cc это имя файла. 7 — номер строки, и ясно, что это ошибка. Короткое сообщение здесь весьма полезно, поскольку оно показывает именно то, что не правильно. Заметим, однако, что сообщение имеет смысл только в контексте программы. Оно не сообщает, в какой структуре не хватает запятой.
Более непонятным является другое сообщение об ошибке из той же попытки компиляции:
extraneous ‘int’ ignored
Программист должен выяснить, почему это произошло. Обратите внимание еще раз, что эта ошибка была вызвана проблемой в начале программы, не в строке 8, а раньше, когда в структуре не хватает точки с запятой. К счастью, понятно, что определение функции для foo было в порядке, это говорит нам о том, что ошибка должна быть где-то в другом месте программы. На самом деле, она должна быть в программе раньше — вы не будете получать сообщение об ошибке, которое указывает на синтаксическую ошибку до строки, на которой ошибка на самом деле произошла.
Это руководящий принцип вычисления ошибок компилятора: если сомневаетесь, посмотрите в программе раньше. Так как синтаксические ошибки могут позже иметь серьезные последствия, вполне возможно, что компилятор указывал номер строки, в которой на самом деле не было синтаксической ошибки!
Будет гораздо хуже, если компилятор не будет сообщать вам, что произошло ранее в программе. Даже первая ошибка компилятора, которую вы получите, может быть связана с несколькими строками до указанного предупреждения.
Обработка непонятных или странных сообщений
Есть несколько особенно сложных типов ошибок компилятора. Первый — это необъявленная переменная, которую, как вам кажется, вы объявили. Часто, вы можете указать, где именно переменная была объявлена! Проблема в том, что часто переменная просто написана с ошибкой. К сожалению, это довольно трудно увидеть, так как обычно мы читаем то, что ожидаем, а не то, что есть на самом деле. Кроме того, есть и другие причины, почему это может быть проблемой — например, проблемы с видимостью!
Чтобы разобраться в возможных проблемах, я делаю так: в строке, где находится якобы необъявленная переменная, надо выполнить поиск текстовым редактором слова под курсором (в качестве альтернативы можно скопировать имя переменной и выполнить поиск), и если я записал его неправильно, оно не найдется. Также не надо вводить имя переменной вручную, так как вы случайно можете ввести его правильно.
Второе непонятное сообщение:
unexpected end of file
Что происходит? Почему конец файла будет «неожиданным» ? Ну, здесь главное думать как компилятор; если конец файла является неожиданным, то он, должно быть, чего-то ждет. Что бы это могло быть? Ответ, как правило, «завершение». Например, закрывающие фигурные скобки или закрывающие кавычки. Хороший текстовый редактор, который выполняет подсветку синтаксиса и автоматический отступ, должен помочь исправить некоторые из этих ошибок, что позволяет легче обнаружить проблемы при написании кода.
В конечном счете, если сообщение непонятное, то подходите к проблеме, думая, как компилятор пытается интерпретировать файл. Это может быть трудно, когда вы только начинаете, но если вы обращаете внимание на сообщения и попробуете понять, что они могли бы означать, вы быстро привыкнете к общим закономерностям.
Наконец, если ничего не работает, вы всегда можете просто переписать несколько строк кода, чтобы убрать любые скрытые синтаксические ошибки, которые вы могли не увидеть. Это может быть опасно, так как вы можете переписать не ту секцию, но это может помочь.
Ошибки компоновщика
После того как вы окончательно исправили все ошибки синтаксиса, вздремнули, перекусили пару раз и морально подготовили себя к правильной компиляции программы, вы все равно можете столкнуться с ошибками компоновщика. Их часто довольно сложно исправить, потому что они не обязательно являются результатом того, что написано в вашей программе. Я вкратце опишу типичные видов ошибок компоновщика, которые можно ожидать, и некоторые пути их решения.
У вас могут возникнуть проблемы с тем, как вы настроили свой компилятор. Например, даже если включить нужные заголовочные файлы для всех ваших функций, вы все равно должны предоставить вашему компоновщику правильный путь в библиотеку, которая имеет фактическую реализацию. В противном случае, вы получите сообщение об ошибке:
undefined function
Обратите внимание на поддержку этих функций компилятором (это может произойти, если вы включите собственное объявление функции, чтобы обойти ошибку во время компиляции). Если ваш компилятор поддерживает эту функцию, то для решения проблемы обычно требуются конкретные настройки компилятора. Вам следует сообщить компилятору, где искать библиотеки и убедиться, что библиотеки были установлены правильно.
Ошибки компоновщика могут произойти в функциях, которые вы объявили и определили, если вы не включили все необходимые объектные файлы в процесс связывания. Например, если вы пишете определение класса в
myClass.cpp
, а ваша основная функция в myMain.cpp
, компилятор создаст два объектных файла, myClass.o и myMain.o, а компоновщику будут нужны оба из них для завершения создания новой программы. Если оставить myClass.o
, то у него не будет определения класса, даже если вы правильно включите myClass.h
!
Иногда появляются незначительные ошибки, когда компоновщик сообщает о более чем одном определении для класса, функции или переменной. Эта проблема может появиться по нескольким причинам: во-первых, у объекта может быть два определения — например, две глобальные переменные объявлены как внешние переменные, чтобы быть доступными за пределами файла исходного кода. Это относится как к функциям, так и к переменным, и это, на самом деле, нередко случается. С другой стороны, иногда это проблема с директивами компоновщика; несколько раз я видел, как люди включают несколько копий одного и того же объектного файла в процесс связывания. И бинго, у вас есть несколько определений. Типичным проявлением этой проблемы является то, что у целого ряда функций есть несколько определений.
Последний странный тип ошибки компоновщика — сообщение
undefined reference to main
Данная ошибка компоновщика отличается от других тем, что она может не иметь ничего общего с объектом, включая файлы или правильные пути к вашей библиотеке. Напротив, это означает, что компоновщик пытался создать исполняемый файл и не смог понять, где расположена функция main()
. Это может случиться, если вы забыли включить основную функцию, или, если вы попытаетесь скомпилировать код, который никогда не был отдельным исполняемым файлом (например, если вы попытались скомпилировать библиотеку).