Реферат: Turbo C++ Programer`s guide
функция must be declared with no
arguments
в начале списка сообщений об
ошибках.
Если же некоторая переменная включается в текст сообщения позже
(например, "Incorrect command-line argument: аргумент"), то такое
сообщение можно найти по алфавиту, в данном случае на букву I.
Сообщения об ошибках времени
выполнения
Количество ошибок времени выполнения в Turbo C++ невелико. Эти ошибки
могут быть обнаружены в уже откомпилированной и выполняющейся программе. В
данном разделе они перечислены в алфавитном порядке и приводятся с
объяснениями.
Эти ошибки могут являться следствием случайного затирание
памяти программой.
Abnormal
program termination
Аварийное завершение программы
Данное сообщение может появляться, если для
выполнения программы не может быть выделено достаточного количества памяти.
Более подробно оно рассматривается в конце раздела, касающегося ошибок операций
с плавающей точкой. Вызов abort также приводит к появлению данного сообщения.
Divide by 0
Деление на ноль
Данное сообщение выдается при целочисленном делении
на ноль, например
int n = 0;
n = 2 / n;
Эту ошибку можно отследить при помощи функции
signal. В противном случае вызывается abort, и программа завершается.
Floating point
error:Divide by 0.
Ошибка
операции с плавающей точкой:Деление на 0.
Floating point
error:Domain.
Ошибка операции с плавающей точкой:Выход из области определения.
Floating point
error:Overflow.
Ошибка операции с плавающей
точкой:Переполнение.
Данные фатальные ошибки являются следствием
операции с плавающей точкой, для которой результат не определен.
- "Деление на 0" означает, что результат равен в
точности +INF или -INF (плюс или минус неопределенность), например для операции
1.0/0.0.
- "Выход из области определения" означает, что
результат равен NAN (not a number - не число), например для
0.0/0.0.
- "Переполнение" означает, что результат
равен +INF (неопределенность) или -INF при полной потере точности, например в
случае присвоения 1e20*1e20 переменной типа double.
Floating point
error:Partial loss of precision.
Ошибка операции с плавающей точкой:Частичная потеря
точности.
Floating point
error:Underflow.
Ошибка операции с плавающей точкой:Отрицательное
переполнение.
Эти особые ситуации по умолчанию маскируются, и сообщения
об ошибках не выдаются. Отрицательное переполнение преобразуется в ноль,а
потери точности игнорируются. Отменить маску можно, вызвав _control87.
Floating polnt
error:Stack fault.
Ошибка операции с плавающей
точкой:Сбой в стеке.
Это сообщение указывает на выход за пределы стека
плавающей точки. В нормальных условиях оно не появляется и поэтому может
означать либо то, что ассемблерный код использует слишком много регистров, либо
неправильное объявление функции с плавающей точкой.
Этой ошибки можно избежать, маскируя особые ситуации таким
образом, чтобы они не появлялись, либо перехватывая их функцией signal. См.
подробное описание функций _control87 и signal в Справочнике по библиотеке.
В каждом из приведенных случаев программа печатает
сообщение об ошибке и затем вызывает abort, которая в свою очередь выдает
сообщение
Abnormal program termination
и вызывает _exit(3). См. подробные описания функций
abort и _exit.
Null pointer
assignment.
Присвоение пустому указателю
При выходе из программы с моделью памяти small или
medium выполняется проверка, чтобы определить, были ли изменены значения двух
первых байтов в сегменте данных программы. Эти байты никогда не должны
изменяться работающей программой. Если же они были изменены, то выдается
сообщение "Null pointer asignment", говорящее о том, что (вероятно)
некоторое значение было записано в неинициализированный указатель. Во всех
прочих отношениях программа может работать правильно; однако данная ошибка
является серьезной ошибкой, и ей следует заняться немедленно. Если вы не
сможете исправить неинициализированный указатель, это приведет к
непредсказуемому поведению компьютера (вплоть до его "блокирования" в
случае моделей памяти large, compact и huge.) Для отслеживания таких ошибок
может служить интегрированный отладчик, входящий в среду разработки.
Stack overflow
Переполнение стека
По умолчанию размер стека для программ Turbo C++
равен 4,096 байт. Для большинства программ этого достаточно, однако программы с
рекурсивными функциями или большими объемами локальных данных могут переполнить
стек. Данное сообщение выдается только в том случае, когда включено средство
контроля стека. При получении этого сообщения вы можете перейти к большей
модели памяти, увеличить размер стека, либо уменьшить использование стека вашей
программой. Информацию о том, как изменить размер стека с помощью глобальной
переменной _stklen, см. в Главе 2, "Глобальные переменные" в
Справочнике по библиотеке. Для уменьшения количества используемых функцией
локальных данных можно поступить так, как показано в приводимом ниже примере.
Переменная buffer объявлена как static и потому, в отличие от list, не
расходует стек.
void
anyfunction( void )
(*
static int buffer[ 2000 ];/*размещается в сегменте данных*/
int list[
2000 ]; /*размещается в стеке*/
*)
Объявление локальных переменных как static имеет
два недостатка.
1. Теперь такая переменная занимает место, отводимое
обычно глобальным переменным и куче. (Чтобы заплатить Павлу, приходится грабить
Петра). Однако этот недостаток не самый главный.
2. Функция не может более являться реентерабельной. Это
означает, что если функция должна вызываться рекурсивно или асинхронно, и при
этом важно, чтобы каждый вызов функции работал со своей собственной копией
переменной, то такая переменная не может являться статической. Это связано с
тем, что при каждом вызове функции данная переменная будет занимать ту же самую
область памяти, вместо того, чтобы ей распределялась всякий раз новая. Также
возникает проблема с разделением доступа к переменной, если функция содержит
вызов самой себя (рекурсивно), либо должна выполняться одновременно сама с
собой (асинхронно). Для большинства программ DOS это не проблема. Если вы не
пишете рекурсивных функций и не работаете в мультизадачном режиме, то вам не о
чем беспокоиться. В противном случае приведенные выше объяснения помогут вам
разобраться, что к чему.
Сообщения об ошибках
компилятора
Диагностические сообщения компилятора Turbo C++ делятся на три категории:
фатальные ошибки, ошибки и предупреждения.
Фатальные ошибки встречаются редко. Некоторые из них
обозначают внутреннюю ошибку компилятора. В случае фатальной ошибки компиляция
немедленно прекращается. Далее вы должны предпринять соответствующие действия и
затем повторить компиляцию.
Ошибки обозначают синтаксические ошибки программы, ошибки
доступа к диску или к памяти, а также ошибки командной строки. Компилятор
закончит текущую фазу компиляции и остановится. На каждой фазе (препроцессор,
лексический анализ, оптимизация и генерация кода) компилятор пытается найти
столько фактических ошибок, сколько возможно.
Предупреждения не приводят к остановке работы компилятора.
Они лишь указывают на ситуации, которые кажутся компилятору подозрительными, но
являются допустимыми с точки зрения языка. Компилятор также выдает
предупреждения о наличии в исходных файлах машино-зависимых конструкций.
В сообщении компилятор сначала указывает класс этого
сообщения, затем имя исходного файла, далее номер строки, в которой обнаружена
ошибка, и наконец, собственно текст сообщения об ошибке.
В приводимых ниже перечнях сообщения об ошибках
представлены по классам в алфавитном порядке. Для каждого сообщения приводится
возможная причина его появления и рекомендации по устранению ошибки.
Вы должны знать о номерах строк в сообщениях следующее:
компилятор генерирует сообщения об ошибках по мере их обнаружения. Поскольку С
никак не регламентирует размещение операторов по строкам текста, истинная
причина ошибки может находиться несколькими строками выше, чем указанная в
сообщении строка. В следующих перечнях сообщений мы отметили те из них, которые
часто на самом деле находятся выше, нежели строка, указанная компилятором.
Фатальные ошибки
Bad call of
inline function
Неправильный вызов встроенной
функции
Вы вызвали встроенную функцию из макро определения,
но сделали это неправильно. Встроенная функция в С должна начинаться двумя
символами подчеркивания (__).
Irreducible
expression tree
Неупрощаемое дерево выражения
Это сообщение указывает на некоторую ошибку
компилятора. Выражение в указанной строке исходного файла вызвало условие,
когда генератор кода не может выполнить свою работу. Как бы это выражение ни
было необходимым, его следует переписать. В случае, если вы получите такое
сообщение, уведомьте об этом Borland.
Out of memory
Недостаточно памяти
Исчерпана общая рабочая память. Повторите
компиляцию этого файла на машине с большей доступной памятью. Если у вас и так
имеется 640К, следует упростить исходный файл.
Register
allocation error
Ошибка распределения регистров
Это сообщение указывает на некоторую ошибку компилятора.
Выражение в указанной строке исходного файла оказалось настолько сложным, что
генератор кода не смог выполнить свою работу. Упростите это выражение. Если это
не помогло, постарайтесь обойтись без него. В случае, если вы получите такое
сообщение, уведомьте об этом Borland.
Ошибки
конструктор
cannot return a value
конструктор не может возвращать
значение
Конструктор С++ не может иметь выражения в операторе возврата.
конструктор is
not a base class of класс
конструктор не относится к
базовому классу класс
Конструктор класса С++ "класс" пытается вызвать конструктор
базового класса "конструктор", либо вы пытаетесь изменить права
доступа класс::конструктор. Конструктор не относится к базовому классу
"класс". Проверьте объявления.
функция1
cannot be distingulshed from функция2
функция1 не отличается от
функции2
Списки типов параметров в объявлениях этих двух функций недостаточно
отличаются, чтобы эти функции отличались друг от друга. Попытайтесь изменить в
объявлении одной из них последовательность или тип параметров.
функция is
ambiguous
функция неоднозначна
Данному вызову "функции" соответствует по списку аргументов
более одной перегруженной функции (с учетом преобразования аргументов по
умолчанию). Используйте явное приведение типов одного или более аргументов для
разрешения этой неоднозначности.
функция must
be declared with no arguments
функция должна быть объявлена без
аргументов
Данная функция-операция С++ была неправильно объявлена с аргументами.
функция must
be declared with one argument
функция должна быть объявлена с
одним аргументом
Данная функция-операция С++ была неправильно объявлена с более чем одним
аргументом
функция must
be declared with two arguments
функция должна быть объявлена с
двумя аргументами
Данная функция-операция С++ была неправильно объявлена с числом
аргументов, отличным от двух.
функция was
previously declared without static
функция была ранее объявлена без
атрибута static
Здесь функция объявлена как static, тогда как выше она была объявлена как
extern (или global). ANSI C не позволяет смешивать эти объявления.
функция was
previously declared with the language язык
функция была выше объявлена с
модификатором языка "язык"
Функция может иметь только один модификатор языка (cdecl, pascal или
interrupt). Данная функция в двух местах была объявлена с двумя разными
модификаторами языка.
идентификатор
cannot be declared in an anonymous union
идентификатор не может быть объявлен в
анонимном объединении
Компилятор обнаружил объявление функции компонентаили статического
компонента в анонимном объединении. Такие объединения могут содержать только
компоненты данные.
идентификатор
cannot be used in a static member function
идентификатор
не может использоваться в статической функциикомпоненте
Статическая функция-компонент может использовать только статические
компоненты своего класса, хотя и имеет полные права доступа. Данная ошибка
является результатом попытки использования компонента, для которого требуется
указатель this.
идентификатор
is inaccessible because also in класс
идентификатор недоступен поскольку также используется в классе
Недопустимо использовать класс в качестве и прямого, и косвенного
базового класса, поскольку поля его автоматически становятся неоднозначными.
Попытайтесь сделать базовый класс виртуальным в обоих местах.
идентификатор is not a data member and can't be
initlallzed here
идентификатор не является компонентом данных и не может быть здесь
инициализирован
В инициализаторах конструктора допускается инициализация только
компонентов данных. Это сообщение означает,что список включает в себя
статический компонент или функцию-компонент.
идентификатор
is not a member of struct
идентификатор не является
компонентом структуры
Вы пытаетесь сослатьсяна идентификатор, как на
компонент структуры, в то время как он не является компонентом структуры.
Проверьте объявления.
идентификатор
is not a parameter
идентификатор не является
параметром
В разделе объявления параметров определения функции по образцу старых
версий идентификатор объявлен, но не перечислен в списке параметров. Либо
уберите объявление, либо добавьте идентификатор в качестве параметра.
идентификатор
is not legal here
идентификатор здесь недопустим
Спецификатор типа "идентификатор" здесь недопустим, поскольку
он противоречит или дублирует другой спецификатор типа в данном объявлении,
либо потому, что "идентификатор" используется в качестве имени
typedef, тогда как имени typedef в данном контексте быть не может.
идентификатор is virtual and cannot be explicitly
initialized
идентификатор виртуальный и не может быть явно
инициализирован
Конструктор класса С++ пытается вызвать "идентификатор"
конструктора базового класса, однако этот идентификатор относится к
виртуальному базовому классу. Виртуальные базовые классы не могут быть
инициализированы явно. Компилятор неявно вызывает конструктор базового класса
по умолчанию base::base().
идентификатор
must be a member function
идентификатор должен быть
функцией-компонентом
Большинство функций-операций С++ может являться компонентами классов или
обычными функциями, не входящими в класс, однако некоторые из них обязательно
должны быть компонентами класса. Это функции operator =, operator ->,
operator() и преобразования типов. Данная функция не является
функцией-компонентом, но должна являться таковой.
идентификатор must be a member function or have an
argument
of class type
идентификатор должен быть функцией-компонентом или
иметь аргумент типа класса
Большинство функций-операций С++ должно иметь неявный или явный аргумент
типа класса. Данная функция-операция была объявлена вне класса и не имеет
явного аргумента типа класса.
идентификатор must be a previously defined class or struct
идентификатор должен быть ранее объявленным классом или структурой
Вы пытаетесь объявить идентификатор как базовый класс, тогда как он либо
не является классом, либо не был еще полностью определен. Исправьте имя или
реорганизуйте объявления.
идентификатор must be a previoustly defined enumeration
tag
идентификатор должен быть ранее определенным тегом
перечислимого типа
Данное
объявление пытается обратиться к идентификатору, как к тегу типа enum, тогда
как он не был объявлен в качестве такового. Исправьте имя или реорганизуйте
объявления.
идентификатор
must be a previoustly defined structuretag
идентификатор должен быть ранее
определенным тегом структуры
Данное объявление пытается обратиться к идентификатору, как к тегу
структуры, тогда как он не был объявлен в качестве такового.
Исправьте имя или реорганизуйте
объявления.
идентификатор
specifies multiple or duplicate access
идентификатор задает многократный
или дублирующийся доступ
Базовый класс должен быть объявлен как public или private, но не то и
другое одновременно. Спецификатор доступа не должен задаваться для базового
класса более одного раза.
компонент is
not accessible
компонент недоступен
Вы пытаетесь сослаться на "компонент" класса С++, который
имеетатрибут доступа private илиprotected и недоступен из данной функции. Это
иногда случается при попытке вызова доступной перегружаемой функции-компонента
(или конструктора), когда заданные при этом аргументы совпадаютс
аргументаминедоступной функции. Перед проверкой доступности всегда выполняется
проверка разрешения перегрузки. Если проблема именно в этом, то для выбора
желаемой доступной функции попытайтесь явно выполнить приведение типа для
одного или более параметров.
спецификатор
has already been included
спецификатор уже был включен
Данный
спецификатор типа встречается в объявлении более одного раза. Удалите или
измените один из них
= expected
= ожидается
Ожидалась операция присвоения для инициализации переменной.
, expected
, ожидается
В списке объявлений, инициализации или параметров ожидается запятая.
(* epected
(* ожидается
В качестве
начала блока или инициализации ожидается левая фигурная скобка.
( expected
( ожидается
Перед списком параметров ожидается левая круглая скобка.
*) expected
*) ожидается
В конце блока
или инициализации ожидается правая фигурная скобка.
) expected
) ожидается
В конце списка параметров ожидается правая круглая скобка.
: expected
alter private/protected/publlc
: ожидается после
private/protected/public
При
использовании резервированных слов
private/protected/public
для того, чтобы начать соответствующий раздел класса С++, за ними должно
следовать двоеточие.
::requires a
preceding identifier in this context
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40
|