рефераты

рефераты

 
 
рефераты рефераты

Меню

Реферат: 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