Паскаль ошибка переполнения стека

0 / 0 / 0

Регистрация: 16.05.2009

Сообщений: 7

1

Ошибка переполнения стека

25.05.2009, 20:35. Показов 9983. Ответов 8


Студворк — интернет-сервис помощи студентам

При запуске программы на исполнение выдает ошибку: «202. Ошибка переполнения стека». Что это такое и как решить эту проблему? Если можно, то доступными словами.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

25.05.2009, 20:35

Ответы с готовыми решениями:

Ошибка при реализации стека
Здравствуйте!

Делал модуль стека, еще неделю назад работал, вчера так и не смог найти ошибку..(…

Из одного стека, хранящего символы, создать два новых стека
Из одного стека, хранящего символы, создать два новых стека: один с латинскими буквами, удвоив…

Реализация стека целых чисел. Процедура добавления нового элемента, удаление, вывод стека
Попросили написать программку, но, паскаль очень давно не практикую, поэтому прошу тут:
Надо…

создать стек в памяти из этих чисел таким образом, чтобы на вершине стека было самое большое число. Удалить из стека все отрицательные элементы.
Помогите решить.
В файл записывается последовательность целых чисел. Прочитать последовательность…

8

Эксперт CАвтор FAQ

21265 / 8281 / 637

Регистрация: 30.03.2009

Сообщений: 22,646

Записей в блоге: 30

25.05.2009, 20:36

2

Скорее всего у тебя вызов рекурсивный функции произошёл много раз, в результате чего переполнился стек

Добавлено через 31 секунду
Исходник покажи на всякий слкучай



1



0 / 0 / 0

Регистрация: 16.05.2009

Сообщений: 7

25.05.2009, 20:47

 [ТС]

3

Цитата
Сообщение от Evg
Посмотреть сообщение

вызов рекурсивный функции произошёл много раз

Что это означает?



0



Эксперт CАвтор FAQ

21265 / 8281 / 637

Регистрация: 30.03.2009

Сообщений: 22,646

Записей в блоге: 30

25.05.2009, 20:49

4

Исходники покажи



1



rastamanxox

0 / 0 / 0

Регистрация: 16.05.2009

Сообщений: 7

25.05.2009, 20:55

 [ТС]

5

Pascal
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
41
procedure zam;
  var
  x:string;
  dl,i,n: integer;
  textfile:text;
  tex:array [1..100] of string;
  alffile:text;
  alf:array [1..27] of string;
  alfzamfile:text;
  alfzam:array [1..27] of string;
  begin
  assign(textfile, 'input2.txt');
  reset(textfile);
  readln(textfile, strtxt);
  assign(alffile, 'alf.txt');
  reset(alffile);
  assign(alfzamfile, 'alfzam.txt');
  reset(alfzamfile);
  reset(textfile);
  dl:=0;
  while not eof(textfile) do
    begin
    readln (textfile, x);
    dl:=dl+1;
    end;
  reset(textfile);
  for i:=1 to dl do  begin readln(textfile, tex[i]); write(tex[i], ' '); end;
  for n:=1 to 27 do  begin readln(alffile, alf[n]);  end;
  for n:=1 to 27 do  begin readln(alfzamfile, alfzam[n]);  end;
  writeln;
  for i:=1 to dl do
    begin
      for n:=1 to 27 do
    begin
        if tex[i]=alfzam[n] then   write(alf[n], ' ');
    end;
    end;
  close (textfile);
  close (alffile);
  close (alfzamfile);
  end;

Добавлено через 1 минуту 3 секунды
Вот, курсор, когда ошибку выдает, помещает рядом с begin’ом.



0



Почетный модератор

64289 / 47588 / 32739

Регистрация: 18.05.2008

Сообщений: 115,181

25.05.2009, 21:02

6

У Вас очень много памяти выделяется под строки. Попробуйте уменьшить размеры массивов, или, если Вам не обязательно стьтроки длиной 255 символов, ограничьте размер строк, типа strin[50], или string[80], посмотрите что Вам лучше.



1



0 / 0 / 0

Регистрация: 16.05.2009

Сообщений: 7

25.05.2009, 21:07

 [ТС]

7

Вот насчет ограничения строк, где и как это нужно прописать в программе? Потому что мне действительно нужно в каждой строке не более 10 символов.



0



Puporev

Почетный модератор

64289 / 47588 / 32739

Регистрация: 18.05.2008

Сообщений: 115,181

25.05.2009, 21:08

8

Pascal
1
2
3
4
5
tex:array [1..100] of string[10];
  alffile:text;
  alf:array [1..27] of string[10];
  alfzamfile:text;
  alfzam:array [1..27] of string[10];



1



0 / 0 / 0

Регистрация: 16.05.2009

Сообщений: 7

25.05.2009, 21:26

 [ТС]

9

Puporev, Evg,
Всё работает, спасибо, что откликнулись на мою просьбу! =)



0



Applications generated by Free Pascal might generate run-time errors when certain abnormal conditions are detected in the application. This appendix lists the possible run-time errors and gives information on why they might be produced. 1 Invalid function number An invalid operating system call was attempted. 2 File not found Reported when trying to erase, rename or open a non-existent file. 3 Path not found Reported by the directory handling routines when a path does not exist or is invalid. Also reported when trying to access a non-existent file. 4 Too many open files The maximum number of files currently opened by your process has been reached. Certain operating systems limit the number of files which can be opened concurrently, and this error can occur when this limit has been reached. 5 File access denied Permission to access the file is denied. This error might be caused by one of several reasons:

  • Trying to open for writing a file which is read-only, or which is actually a directory.
  • File is currently locked or used by another process.
  • Trying to create a new file, or directory while a file or directory of the same name already exists.
  • Trying to read from a file which was opened in write-only mode.
  • Trying to write from a file which was opened in read-only mode.
  • Trying to remove a directory or file while it is not possible.
  • No permission to access the file or directory.

6 Invalid file handle If this happens, the file variable you are using is trashed; it indicates that your memory is corrupted. 12 Invalid file access code Reported when a reset or rewrite is called with an invalid FileMode value. 15 Invalid drive number The number given to the Getdir or ChDir function specifies a non-existent disk. 16 Cannot remove current directory Reported when trying to remove the currently active directory. 17 Cannot rename across drives You cannot rename a file such that it would end up on another disk or partition. 100 Disk read error An error occurred when reading from disk. Typically happens when you try to read past the end of a file. 101 Disk write error Reported when the disk is full, and you’re trying to write to it. 102 File not assigned This is reported by Reset , Rewrite , Append , Rename and Erase , if you call them with an unassigned file as a parameter. 103 File not open Reported by the following functions : Close, Read, Write, Seek, EOf, FilePos, FileSize, Flush, BlockRead, and BlockWrite if the file is not open. 104 File not open for input Reported by Read, BlockRead, Eof, Eoln, SeekEof or SeekEoln if the file is not opened with Reset . 105 File not open for output Reported by write if a text file isn’t opened with Rewrite . 106 Invalid numeric format Reported when a non-numeric value is read from a text file, and a numeric value was expected. 107 Invalid enumeration Reported when a text representation of an enumerated constant cannot be created in a call to str or write(ln). 150 Disk is write-protected (Critical error) 151 Bad drive request struct length (Critical error) 152 Drive not ready (Critical error) 154 CRC error in data (Critical error) 156 Disk seek error (Critical error) 157 Unknown media type (Critical error) 158 Sector Not Found (Critical error) 159 Printer out of paper (Critical error) 160 Device write fault (Critical error) 161 Device read fault (Critical error) 162 Hardware failure (Critical error) 200 Division by zero The application attempted to divide a number by zero. 201 Range check error If you compiled your program with range checking on, then you can get this error in the following cases: 1. An array was accessed with an index outside its declared range. 2. Trying to assign a value to a variable outside its range (for instance an enumerated type). 202 Stack overflow error The stack has grown beyond its maximum size (in which case the size of local variables should be reduced to avoid this error), or the stack has become corrupt. This error is only reported when stack checking is enabled. 203 Heap overflow error The heap has grown beyond its boundaries. This is caused when trying to allocate memory explicitly with New , GetMem or ReallocMem , or when a class or object instance is created and no memory is left. Please note that, by default, Free Pascal provides a growing heap, i.e. the heap will try to allocate more memory if needed. However, if the heap has reached the maximum size allowed by the operating system or hardware, then you will get this error. 204 Invalid pointer operation You will get this in several cases:

  • if you call Dispose or Freemem with an invalid pointer
  • in case New or GetMem is called, and there is no more memory available. The behavior in this case depends on the setting of ReturnNilIfGrowHeapFails . If it is True , then Nil is returned. if False , then runerror 204 is raised.

205 Floating point overflow You are trying to use or produce real numbers that are too large. 206 Floating point underflow You are trying to use or produce real numbers that are too small. 207 Invalid floating point operation Can occur if you try to calculate the square root or logarithm of a negative number. 210 Object not initialized When compiled with range checking on, a program will report this error if you call a virtual method without having called its object’s constructor. 211 Call to abstract method Your program tried to execute an abstract virtual method. Abstract methods should be overridden, and the overriding method should be called. 212 Stream registration error This occurs when an invalid type is registered in the objects unit. 213 Collection index out of range You are trying to access a collection item with an invalid index ( objects unit). 214 Collection overflow error The collection has reached its maximal size, and you are trying to add another element ( objects unit). 215 Arithmetic overflow error This error is reported when the result of an arithmetic operation is outside of its supported range. Contrary to Turbo Pascal, this error is only reported for 32-bit or 64-bit arithmetic overflows. This is due to the fact that everything is converted to 32-bit or 64-bit before doing the actual arithmetic operation. 216 General Protection fault The application tried to access invalid memory space. This can be caused by several problems: 1. Dereferencing a nil pointer. 2. Trying to access memory which is out of bounds (for example, calling move with an invalid length). 217 Unhandled exception occurred An exception occurred, and there was no exception handler present. The sysutils unit installs a default exception handler which catches all exceptions and exits gracefully. 218 Invalid value specified Error 218 occurs when an invalid value was specified to a system call, for instance when specifying a negative value to a seek() call. 219 Invalid typecast

Thrown when an invalid typecast is attempted on a class using the as operator. This error is also thrown when an object or class is typecast to an invalid class or object and a virtual method of that class or object is called. This last error is only detected if the -CR compiler option is used. 222 Variant dispatch error No dispatch method to call from variant. 223 Variant array create The variant array creation failed. Usually when there is not enough memory. 224 Variant is not an array This error occurs when a variant array operation is attempted on a variant which is not an array. 225 Var Array Bounds check error This error occurs when a variant array index is out of bounds. 227 Assertion failed error An assertion failed, and no AssertErrorProc procedural variable was installed. 229 Safecall error check This error occurs is a safecall check fails, and no handler routine is available. 231 Exception stack corrupted This error occurs when the exception object is retrieved and none is available. 232 Threads not supported Thread management relies on a separate driver on some operating systems (notably, Unixes). The unit with this driver needs to be specified on the uses clause of the program, preferably as the first unit ( cthreads on unix).

Источник

s_a_s_h_a

Опытный

Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1

Type M=array[1..99,1..99] of integer;
var n1,m1: integer;
a:M;
stolbec : integer;

procedure vvod(n,m:integer;var b:M);
var i,j: integer;
begin
writeln (‘vvedite element’);
for i:=1 to n do
for j:=1 to m do
readln(b[i,j]);
end;

procedure vyvod_matr(n,m:integer;var b:M);
var i,j: integer;
begin
for i:=1 to n do
begin
for j:=1 to m do
write(‘ ‘,b[i,j]:5);
writeln;
end;
end;

function find(n,m:integer;b:M):integer;
var i,j: integer;
summ: integer;
max: integer;
begin
max:=0;
for j:=1 to m do
begin
summ:=0;

for i:=1 to n do
summ:=summ+b[i,j];
if max

Возникает ошибка «Stack overflow error» и выкидывает на открывающий begin функции find. Вопрос из-за чего она возникает и как её исправить?
Матрица малой размерности (2х3) и заполняю маленькими целыми числами. Такая же ерунда была, когда find организовывал как процедуру.

SPrograMMer

Спамер 🙂

Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6

УСЕ хорошо вроде бы.
попробуй выполнить по шагам, свой код, через F7, если компиляторы Borland Pascal или Turbo Pascal.
Stack overflow error — ошибка при переполнении стека. В тапкой простой программе такое может произойти если, происходит зацикливание вызова подпрограммы, то есть что-то типа:

Код
procedure A;
Begin
.
A; // тут.
End;
.
Begin
A;
End.

А у тебя я такого не нашел.

Это сообщение отредактировал(а) SPrograMMer — 18.4.2005, 17:57

Fedor

Днепрянин

Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32

У тебя процедура find содержит параметр типа M, который занимает слишком много памяти и когда он засовывается в стек, происходит переполнение.
Варианты решения:
1) Уменьшить размер типа M
2) Сделать этот параметр глобалной переменной
3) Нажми Ctrl+O+O, сверху появятся настройку компиляции по умолчанию. Исправь чтоб вторая строчка была примерно такой:

Т.е. короче говоря увеличь размер стека в программе.

SPrograMMer

Спамер 🙂

Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6

Цитата(Fedor @ 18.4.2005, 18:14)
параметр типа M, который занимает слишком много памяти

Тогда разве на этапе компиляции ничего не должно выскакивать?!

Fedor

Днепрянин

Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32

Цитата(SPrograMMer @ 18.4.2005, 18:32)
Тогда разве на этапе компиляции ничего не должно выскакивать?!

Это ведь зависит от размера стека, это не определяется во время компиляции.

SPrograMMer

Спамер 🙂

Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6

Хорошо, Fedor попробуй объявить следующее:

Код
Type
Dim200x200=Array[1..200,1..200] of Real;
Var
D:Dim200x200;

Получится ли? У меня к сожелению сейчас нет компилятора пасаля под DOS, проверить не могу.

Fedor

Днепрянин

Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32

16000 байт. Вот и возникает ашипка. Если мы директивой компилятора увеличим размер стека например хотябы до 30000 то все будет уже ОК.

volvo877

Эксперт

Профиль
Группа: Комодератор
Сообщений: 2072
Регистрация: 15.11.2004

Репутация: 2
Всего: 116

Цитата(Fedor @ 18.4.2005, 18:14)
Варианты решения:
1) Уменьшить размер типа M
2) Сделать этот параметр глобалной переменной
3) Нажми Ctrl+O+O, сверху появятся настройку компиляции по умолчанию.

Есть еще 4-ый вариант — изменить заголовок функции find на:

Код
function find(n,m:integer; const b:M):integer;

Можно было бы просто передать по ссылке (var b:M), но для гарантии неизменности данных в массиве b пользуемся const

Это сообщение отредактировал(а) volvo877 — 19.4.2005, 00:36

Zero

Эксперт

Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24

Цитата(Fedor @ 18.4.2005, 22:15)
Если мы директивой компилятора увеличим размер стека например хотябы до 30000 то все будет уже ОК.

А теперь более точная формула для расёта нужного кол-ва байт в стеке:
S=S1+548
где S ─ размер стека;
S1 ─ max<размер памяти любого идентификатора>
Т.е. в данном примере расчитывается так:
S=99*99*2+548=20150;
Т.е. Min размер стека можно указать таким

И если хоть на один байт уменьшить то будет ошибка.

Это сообщение отредактировал(а) Fedor — 20.4.2005, 17:29

Zero

Эксперт

Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24

s_a_s_h_a ну типа если тебя бесят взякие ожжибки, ну типа пиши вот так в начале программы:

И узё.
Добавлено @ 01:52
Ладно ето шутка, предыдущий способ самый правильный

Это сообщение отредактировал(а) Zero — 19.4.2005, 01:54

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »

[ Время генерации скрипта: 0.1253 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Источник

READ  Vip1003g прошивка под всех операторов

Приложения написанные на Free Pascal могут генерировать ошибку времени выполнения (Run Time Error) когда в программе обнаруживаются определённые аварийные состояния . Этот документ содержит список возможных ошибок и описание их возможных причин.


1 Invalid function number (Неправильный номер функции)

Была попытка неправильного вызова системной функции.


2 File not found (Файл не найден)

Генерируется при попытке перенаименования, стирания или открытия несуществующего файла.


3 Path not found (Путь(директория) не найден)

Генерируется файловой системой когда путь не существует или неправелен.
Также генерируется при попытке получить доступ к несуществующему файлу.


4 Too many open files (Слишком много файлов открыто)

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


5 File access denied (В доступе к файлу — отказано)

Было запрешено получение доступа к файлу. Эта ошибка может произойти по нескольким причинам:

  • При попытке открыть файл, предназначенный только для чтения или в деиствительности являющиёся директорией, для записи.

  • В данный момент занят или заблокирован другим процессом.

  • При попытке создания файла или директории с именем, которое совпадает с именем уже созданного файла или директории.

  • При попытке чтения из файла, открытого только для записи.

  • При попытке записи в файл, открытый только для чтения.

  • При попытке удалить директорию или файл, когда это не возможно.

  • При неимении прав на доступ к данному файлу.


6 Invalid file handle (Неправильный хэндл файла)

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


12 Invalid file access code (Неправильные ключи доступа к файлу)

Генерируется когда процедуры reset или rewrite вызываются с неправильным параметром FileMode.


15 Invalid drive number (Неправильный номер диска)

Генерируется когда в функции Getdir или ChDir был передан неправильный номер диска.


16 Cannot remove current directory (Невозможно удалить текущую директорию)

Генерируется при попытке удалить текущую директорию.


17 Cannot rename across drives (Можно переименовывать файлы только в пределах одного диска)

Вы не можете переименовать файл в файл, находяшиёся на другом диске или в другом разделе.


100 Disk read error (Ошибка чтения с диска)

Генерируется при невозможности произвести чтение с диска. Обычно происходит при попытке чтения данных, после его окончания.


101 Disk write error (Ошибка записи на диск)

Генерируется когда Вы пытаетесь записать данные на переполненый диск.


102 File not assigned (Файл не определён)

Генерируется функциями Reset, Rewrite, Append, Rename и Erase, При передаче в них файловой переменной, для которой не была выполнена функция AssignFile.


103 File not open (Файл не открыт)

Генерируется следующими функциями : Close, Read, Write, Seek, EOf, FilePos, FileSize, Flush, BlockRead, и BlockWrite если файл не был открыт.


104 File not open for input (Файл не открыт для чтения)

Генерируется функциями Read, BlockRead, Eof, Eoln, SeekEof и SeekEoln если файл не был открыт при помощи Reset.


105 File not open for output (Файл не открыт для записи)

Генерируется функцией write если текстовый файл не был открыт при помощи Rewrite.


106 Invalid numeric format(Неправильный числовой формат)

Генерируется когда ожидалось числовое значение, но из текстого файла было прочитано не было.


150 Disk is write-protected (Диск защищён от записи)

(Критическая ошибка)


151 Bad drive request struct length (Неправильная длина структуры запроса)

(Критическая ошибка)


152 Drive not ready (Устройство не готово)

(Критическая ошибка)


154 CRC error in data (Ошибка контрольной суммы в данных)

(Критическая ошибка)


156 Disk seek error (Ошибка низкоуровнего поиска на диске)

(Критическая ошибка)


157 Unknown media type (Неизвестный тип …)

(Критическая ошибка)


158 Sector Not Found (Сектор не найден)

(Критическая ошибка)


159 Printer out of paper (Нет бумаги в принтере)

(Критическая ошибка)


160 Device write fault (Сбой записи устройства)

(Критическая ошибка)


161 Device read fault (Сбой чтения устройства)

(Критическая ошибка)


162 Hardware failure (Сбой железа)

(Критическая ошибка)


200 Division by zero (Деление на ноль)

Приложение пыталось разделить число на ноль.


201 Range check error (Ошибка проверки границ)

Если вы компилировали прогамму с включённой провереой границ, Вы можете получить эту ошибку в следующих случаях:

  1. Массив был вызван с индексом, выходящим за декларированые пределы.

  2. Попытка присвоить значение переменной, выходящее за декларированые границы (для instance и enumerated типов).


202 Stack overflow error (Переполнение стека)

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


203 Heap overflow error (Переполнение кучи)

Размер кучи превысил максимально возможный размер. Генерируется при попытке выделить память непосредственно функциями New, GetMem и ReallocMem, или когда экземпляр класса или объекта создаётся и памяти не достаточно. Пожалуйста учтите что, по умолчанию, Free Pascal поддерживает увеличение кучи, то есть, если необходимо, будет произведена попытка её увеличения. Как бы то ни было, если размер кучи превысил максимально допустимый системой и
железом, то Вы получите эту ошибку.


204 Invalid pointer operation (Непрваильная операция с указателем)

Будет сгенерирована при вызове функций Dispose или Freemem с неправильным указателем (чаще всего, Nil)


205 Floating point overflow (Максимальная границы числа с плавающей точкой)

Вы попытались использовать или создать слишком большое число с плавающей точкой.


206 Floating point underflow (Минимальная граница числа с плавающей точкой)

Вы попытались использовать или создать слишком маленькое число с плавающей точкой.


207 Invalid floating point operation (Неправильная операция над числами с плавающей точкой)

Может генерироваться если вы попытались получить квадратный корень или логарифм отрицательного числа.


210 Object not initialized (Объект не инициализирован)

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


211 Call to abstract method (Попытка вызова абстрактного метода)

Ваша программа попыталась вызвать абстрактный виртуальный метод. Абстрактные методы должны быть перекрыты, и только перекрытый метод должен быть вызван.


212 Stream registration error (Ошибка регистрации потока)

Генерируется когда неправильный тип регистрируется в модуле objects.


213 Collection index out of range (Индекс элемента коллекции выходит за допустимые границы)

Генерируется когда Вы попытались обратиться к элементу коллекции с выходящим за допустимые границы индексом (модуль objects).


214 Collection overflow error (Переполнение коллекции)

Размер коллекции превысил максимально допустимый размер, а Вы попытались добавить новый элемент (модуль objects).


215 Arithmetic overflow error (Арифметическое переполнение)

Эта ошибка генерируется когда результат операции превысил допустимые границы. В отличие to Turbo Pascal, эта ошибка генерируется только для 32-bit и 64-bit арифметических переполнений. Это происходит согласно тому, что все операнды конвертируются в 32-bit или 64-bit, до того как производить вычисления.


216 General Protection fault (GP Ошибка защиты памяти)

Приложение попыталось обратиться к недопустимому участку памяти. Это может быть вызвано следующими причинами:

  1. Попытка получить разуказатель для nil.

  2. Попытка получить доступ к выходящему за допустимые границы участку памяти (например, вызов move с неправильной длиной).


217 Unhandled exception occurred (Произошо неизвестное исключение)

Произошло исключение, и для него не существеет хэндла. Модуль sysutils устанавливает handler(менеджер), который отлавливает все исключения, и безопасно выходит в случае обнаружения оного.


219 Invalid typecast (Неправильное приведение типов)

Генерируется когда недопустимое приведение типов производится над классом используя оператор as. Эта ошибка также генерируется, когда объект или класс приводится к недопустимому объекту или классу, и виртуальный метод этого объекта или класса вызывается. Эта последняя ошибка детектируется только с использованием опции -CR компилятора.


227 Assertion failed error (Сбой утверждения)

Утверждение провалено, и процедурная переменная AssertErrorProc не была уcтановлена.


The following code for implementing AVL-tree insertion & deletion gives error #202 (stack overflow).

Source code looks like this:

program Avl_generator; uses Crt;
type p_Avl = ^Avl_node;
Avl_node = record
key: integer;
l, r, par: p_Avl; {pointers to left child, right child, parent}
bal, h: integer {balance factor, height}
end;
procedure init(var root: p_Avl); begin new(root); root:=nil end;
function get_height(var n: p_Avl): integer;
begin
if(n=nil) then get_height:=-1 else get_height:=n^.h;
end;
procedure reheight(var n: p_Avl); {refresh the height variable}
begin
if(n<>nil) then
begin
if(get_height(n^.r)>get_height(n^.l)) then n^.h:=1+get_height(n^.r)
else n^.h:=1+get_height(n^.l);
end;
end;
procedure set_balance(var n: p_Avl); begin reheight(n); n^.bal:=get_height(n^.r)-get_height(n^.l); end; {refresh the balance factor}
function rotate_l(var a: p_Avl): p_Avl; {left rotation, a is pivot}
var b: p_Avl;
begin
b := a^.r;
b^.par := a^.par;
a^.r := b^.l;
if(a^.r<>nil) then a^.r^.par := a;
b^.l := a;
a^.par := b;
if(b^.par<>nil) then
if(b^.par^.r=a) then b^.par^.r := b
else b^.par^.l := b;
set_balance(a); set_balance(b);
rotate_l := b;
end;
function rotate_r(var a: p_Avl): p_Avl; {right rotation, a is pivot}
var b: p_Avl;
begin
b := a^.l;
b^.par := a^.par;
a^.l := b^.r;
if(a^.l<>nil) then a^.l^.par := a;
b^.r := a;
a^.par := b;
if(b^.par<>nil) then
if(b^.par^.r=a) then b^.par^.r := b
else b^.par^.l := b;
set_balance(a); set_balance(b);
rotate_r := b;
end;
function rotate_l_r(var a: p_Avl): p_Avl; {left & right rotation, a is pivot}
begin
a^.l := rotate_l(a^.l);
rotate_l_r := rotate_r(a);
end;
function rotate_r_l(var a: p_Avl): p_Avl; {right & left rotation, a is pivot}
begin
a^.r := rotate_r(a^.r);
rotate_r_l := rotate_l(a);
end;
procedure rebalance(var root: p_Avl; var n: p_Avl); {refresh balance factors and see if sub-trees need rotating}
begin
set_balance(n);
if(n^.bal=-2) then
begin
if(get_height(n^.l^.l)>=get_height(n^.l^.r)) then n:=rotate_r(n)
else n:=rotate_l_r(n);
end
else if(n^.bal=2) then
begin
if(get_height(n^.r^.r)>=get_height(n^.r^.l)) then n:=rotate_l(n)
else n:=rotate_r_l(n);
end;
if(n^.par<>nil) then rebalance(root, n^.par) else root:=n; {recursion here}
end;
procedure insert(var root: p_Avl; what: integer);
var found: boolean;
pre_tmp, tmp: p_Avl;
begin
found:=false; tmp:=root; pre_tmp:= nil;
while(tmp<>nil) and not found do
if(tmp^.key=what) then found:=true
else if(tmp^.key>what) then begin pre_tmp:=tmp; tmp:=tmp^.l end
else begin pre_tmp:=tmp; tmp:=tmp^.r end;
if not found then
begin
new(tmp); tmp^.key:=what;
tmp^.l:=nil; tmp^.r:=nil; tmp^.par:=pre_tmp; tmp^.h:=0; tmp^.bal:=0;
if(pre_tmp=nil) then root:=tmp
else
begin
if(pre_tmp^.key>what) then pre_tmp^.l:=tmp else pre_tmp^.r:=tmp;
rebalance(root, pre_tmp);
end;
end;
end;
procedure delete(var root: p_Avl; what: integer);
var found: boolean;
tmp, pre_tmp, act, pre_act: p_Avl;
begin
found:=false; tmp:=root; pre_tmp:=nil;
while(tmp<>nil) and not found do
begin
if(tmp^.key=what) then found:=true
else if(tmp^.key>what) then
begin pre_tmp:=tmp; tmp:=tmp^.l end
else
begin pre_tmp:=tmp; tmp:=tmp^.r end;
if found then
if(tmp^.l=nil) then
begin
if(pre_tmp=nil) then root:=tmp^.r
else if(pre_tmp^.key>what) then pre_tmp^.l:=tmp^.r
else pre_tmp^.r:=tmp^.r;
dispose(tmp); rebalance(root,pre_tmp);
end else if(tmp^.r=nil) then
begin
if(pre_tmp=nil) then root:=tmp^.l
else if(pre_tmp^.key>what) then pre_tmp^.l:=tmp^.l
else begin pre_tmp^.r:=tmp^.l end;
dispose(tmp); rebalance(root,pre_tmp);
end else
begin
act:=tmp^.l; pre_act:=nil;
while(act^.r<>nil) do begin pre_act:=act; act:=act^.r end;
tmp^.key:=act^.key;
if(pre_act=nil) then begin tmp^.l:=act^.l; dispose(act); rebalance(root,tmp) end
else begin pre_act^.r:=act^.l; dispose(act); rebalance(root,pre_act) end;
end;
end;
end;
var Avl_tree: p_Avl;
begin
init(Avl_tree);
insert(Avl_tree,1);
insert(Avl_tree,2);
insert(Avl_tree,3);
insert(Avl_tree,4);
insert(Avl_tree,5);
writeln(get_path(Avl_tree, 5));
repeat until KeyPressed;
end.

This compiles fine (Turbo Pascal 7.0). When I run the code, though, the error occurs in the rotate_l procedure which is called after the third insertion (whereupon balance factor of the root node =2.

I checked some Java & C++ implementations and the rotation methods there seemed quite similar to mine, therefore I don’t know where the problem is..?

The following code for implementing AVL-tree insertion & deletion gives error #202 (stack overflow).

Source code looks like this:

program Avl_generator; uses Crt; type p_Avl = ^Avl_node; Avl_node = record key: integer; l, r, par: p_Avl; {pointers to left child, right child, parent} bal, h: integer {balance factor, height} end; procedure init(var root: p_Avl); begin new(root); root:=nil end; function get_height(var n: p_Avl): integer; begin if(n=nil) then get_height:=-1 else get_height:=n^.h; end; procedure reheight(var n: p_Avl); {refresh the height variable} begin if(n<>nil) then begin if(get_height(n^.r)>get_height(n^.l)) then n^.h:=1+get_height(n^.r) else n^.h:=1+get_height(n^.l); end; end; procedure set_balance(var n: p_Avl); begin reheight(n); n^.bal:=get_height(n^.r)-get_height(n^.l); end; {refresh the balance factor} function rotate_l(var a: p_Avl): p_Avl; {left rotation, a is pivot} var b: p_Avl; begin b := a^.r; b^.par := a^.par; a^.r := b^.l; if(a^.r<>nil) then a^.r^.par := a; b^.l := a; a^.par := b; if(b^.par<>nil) then if(b^.par^.r=a) then b^.par^.r := b else b^.par^.l := b; set_balance(a); set_balance(b); rotate_l := b; end; function rotate_r(var a: p_Avl): p_Avl; {right rotation, a is pivot} var b: p_Avl; begin b := a^.l; b^.par := a^.par; a^.l := b^.r; if(a^.l<>nil) then a^.l^.par := a; b^.r := a; a^.par := b; if(b^.par<>nil) then if(b^.par^.r=a) then b^.par^.r := b else b^.par^.l := b; set_balance(a); set_balance(b); rotate_r := b; end; function rotate_l_r(var a: p_Avl): p_Avl; {left & right rotation, a is pivot} begin a^.l := rotate_l(a^.l); rotate_l_r := rotate_r(a); end; function rotate_r_l(var a: p_Avl): p_Avl; {right & left rotation, a is pivot} begin a^.r := rotate_r(a^.r); rotate_r_l := rotate_l(a); end; procedure rebalance(var root: p_Avl; var n: p_Avl); {refresh balance factors and see if sub-trees need rotating} begin set_balance(n); if(n^.bal=-2) then begin if(get_height(n^.l^.l)>=get_height(n^.l^.r)) then n:=rotate_r(n) else n:=rotate_l_r(n); end else if(n^.bal=2) then begin if(get_height(n^.r^.r)>=get_height(n^.r^.l)) then n:=rotate_l(n) else n:=rotate_r_l(n); end; if(n^.par<>nil) then rebalance(root, n^.par) else root:=n; {recursion here} end; procedure insert(var root: p_Avl; what: integer); var found: boolean; pre_tmp, tmp: p_Avl; begin found:=false; tmp:=root; pre_tmp:= nil; while(tmp<>nil) and not found do if(tmp^.key=what) then found:=true else if(tmp^.key>what) then begin pre_tmp:=tmp; tmp:=tmp^.l end else begin pre_tmp:=tmp; tmp:=tmp^.r end; if not found then begin new(tmp); tmp^.key:=what; tmp^.l:=nil; tmp^.r:=nil; tmp^.par:=pre_tmp; tmp^.h:=0; tmp^.bal:=0; if(pre_tmp=nil) then root:=tmp else begin if(pre_tmp^.key>what) then pre_tmp^.l:=tmp else pre_tmp^.r:=tmp; rebalance(root, pre_tmp); end; end; end; procedure delete(var root: p_Avl; what: integer); var found: boolean; tmp, pre_tmp, act, pre_act: p_Avl; begin found:=false; tmp:=root; pre_tmp:=nil; while(tmp<>nil) and not found do begin if(tmp^.key=what) then found:=true else if(tmp^.key>what) then begin pre_tmp:=tmp; tmp:=tmp^.l end else begin pre_tmp:=tmp; tmp:=tmp^.r end; if found then if(tmp^.l=nil) then begin if(pre_tmp=nil) then root:=tmp^.r else if(pre_tmp^.key>what) then pre_tmp^.l:=tmp^.r else pre_tmp^.r:=tmp^.r; dispose(tmp); rebalance(root,pre_tmp); end else if(tmp^.r=nil) then begin if(pre_tmp=nil) then root:=tmp^.l else if(pre_tmp^.key>what) then pre_tmp^.l:=tmp^.l else begin pre_tmp^.r:=tmp^.l end; dispose(tmp); rebalance(root,pre_tmp); end else begin act:=tmp^.l; pre_act:=nil; while(act^.r<>nil) do begin pre_act:=act; act:=act^.r end; tmp^.key:=act^.key; if(pre_act=nil) then begin tmp^.l:=act^.l; dispose(act); rebalance(root,tmp) end else begin pre_act^.r:=act^.l; dispose(act); rebalance(root,pre_act) end; end; end; end; var Avl_tree: p_Avl; begin init(Avl_tree); insert(Avl_tree,1); insert(Avl_tree,2); insert(Avl_tree,3); insert(Avl_tree,4); insert(Avl_tree,5); writeln(get_path(Avl_tree, 5)); repeat until KeyPressed; end. 

This compiles fine (Turbo Pascal 7.0). When I run the code, though, the error occurs in the rotate_l procedure which is called after the third insertion (whereupon balance factor of the root node =2.

I checked some Java & C++ implementations and the rotation methods there seemed quite similar to mine, therefore I don’t know where the problem is..?

Переполнение стека

  • Определение
  • Стек программы
  • Последствия ошибки
  • Причины ошибки
  • Примеры
  • Итог
  • Библиографический список

Определение

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

Стек программы

Стек программы — это специальная области памяти, организованная по принципу очереди LIFO (Last in, first out — последним пришел, первым ушел). Название «стек» произошло из-за аналогии принципа его построения со стопкой (англ. stack) тарелок — можно класть тарелки друг на друга (метод добавления в стек, «заталкивание», «push»), а затем забирать их, начиная с верхней (метод получения значения из стека, «выталкивание», «pop»). Стек программы также называют стек вызовов, стек выполнения, машинным стеком (чтобы не путать его со «стеком» — абстрактной структурой данных).

Для чего нужен стек? Он позволяет удобно организовать вызов подпрограмм. При вызове функция получает некоторые аргументы; также она должна где-то хранить свои локальные переменные. Кроме того, надо учесть, что одна функция может вызвать другую функцию, которой тоже надо передавать параметры и хранить свои переменные. Используя стек, при передаче параметров нужно просто положить их в стек, тогда вызываемая функция сможет их оттуда «вытолкнуть» и использовать. Локальные переменные тоже можно хранить там же — в начале своего кода функция выделяет часть памяти стека, при возврате управления — очищает и освобождает. Программисты на высокоуровневых языках обычно не задумываются о таких вещах — весь необходимый рутинный код за них генерирует компилятор.

Последствия ошибки

Теперь мы подошли почти вплотную к проблеме. В абстрактном виде стек представляет собой бесконечное хранилище, в которое можно бесконечно добавлять новые элементы. К сожалению, в нашем мире все конечно — и память под стек не исключение. Что будет, если она закончится, когда в стек заталкиваются аргументы функции? Или функция выделяет память под свои переменные?

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

Чтобы быть совсем точным, следует отметить, что подобное описание событий верно лишь для компиляторов, компилирующих в «родной» (native) код. В управляемых языках у виртуальной машины есть свой стек для управляемых программ, за состоянием которого гораздо проще следить, и можно даже позволить себе при возникновении переполнения передать программе исключение. В языках Си и Си++ на подобную «роскошь» рассчитывать не приходится.

Причины ошибки

Что же может привести к такой неприятной ситуации? Исходя из описанного выше механизма, один из вариантов — слишком большое число вложенных вызовов функций. Особенно вероятен такой вариант развития событий при использовании рекурсии. Бесконечная рекурсия (при отсутствии механизма «ленивых» вычислений) прерывается именно таким образом, в отличие от бесконечного цикла, который иногда имеет полезное применение. Впрочем, при небольшом объеме памяти, отведенной под стек (что, например, характерно для микроконтроллеров), достаточно может быть и простой последовательности вызовов.

Другой вариант — локальные переменные, требующие большого количества памяти. Заводить локальный массив из миллиона элементов, или миллион локальных переменных (мало ли что бывает) — не самая лучшая идея. Даже один вызов такой «жадной» функции легко может вызвать переполнение стека. Для получения больших объемов данных лучше воспользоваться механизмами динамической памяти, которая позволит обработать ошибку её нехватки.

Однако динамическая память является довольно медленной в плане выделения и освобождения (поскольку этим занимается операционная система), кроме того, при прямом доступе приходится вручную выделять её и освобождать. Память же в стеке выделяется очень быстро (по сути, надо лишь изменить значение одного регистра), кроме того, у объектов, выделенных в стеке, автоматически вызываются деструкторы при возврате управления функцией и очистке стека. Разумеется, тут же возникает желание получить память из стека. Поэтому третий путь к переполнению — самостоятельное выделение в стеке памяти программистом. Специально для этой цели библиотека языка Си предоставляет функцию alloca. Интересно заметить, что если у функции для выделения динамической памяти malloc есть свой «близнец» для её освобождения free, то у функции alloca его нет — память освобождается автоматически после возврата управления функцией. Возможно, это только осложняет ситуацию — ведь до выхода из функции освободить память не получится. Даже несмотря на то, что согласно man-странице «функция alloca зависит от машины и компилятора; во многих системах ее реализация проблематична и содержит много ошибок; ее использование очень несерьезно и не одобряется» — она все равно используется.

Примеры

В качестве примера рассмотрим код для рекурсивного поиска файлов, расположенный на MSDN:

void DirSearch(String* sDir)
{
try
{
// Find the subfolders in the folder that is passed in.
String* d[] = Directory::GetDirectories(sDir);
int numDirs = d->get_Length();
for (int i=0; i < numDirs; i++)
{
// Find all the files in the subfolder.
String* f[] = Directory::GetFiles(d[i],textBox1->Text);
int numFiles = f->get_Length();
for (int j=0; j < numFiles; j++)
{
listBox1->Items->Add(f[j]);
}
DirSearch(d[i]);
}
}
catch (System::Exception* e)
{
MessageBox::Show(e->Message);
}
}

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

Пример второго подхода, взятый из вопроса «Почему происходит переполнение стека?» с сайта под названием Stack Overflow (сайт является сборником вопросов и ответов на любые программистские темы, а не только по переполнению стека, как может показаться):

#define W 1000
#define H 1000
#define MAX 100000 
//...
int main()
{
int image[W*H];
float dtr[W*H];
initImg(image,dtr);
return 0;
}

Как видно, в функции main выделяется память в стеке под массивы типов int и float по миллиону элементов каждый, что в сумме дает чуть менее 8 мегабайт. Если учесть, что по умолчанию Visual C++ резервирует под стек лишь 1 мегабайт, то ответ становится очевидным.

А вот пример, взятый из GitHub-репозитория проекта Flash-плеера Lightspark:

DefineSoundTag::DefineSoundTag(/* ... */)
{
// ...
unsigned int soundDataLength = h.getLength()-7;
unsigned char *tmp = (unsigned char *)alloca(soundDataLength);
// ...
}

Можно надеятся, что h.getLength()-7 не будет слишком большим числом, чтобы на следующей строчке не произошло переполнения. Но стоит ли сэкономленное на выделении памяти время «потенциального» вылета программы?

Итог

Переполнение стека — фатальная ошибка, которой наиболее часто страдают программы, содержащие рекурсивные функции. Однако даже если программа не содержит таких функций, переполнение все равно возможно из-за большого объема локальных переменных или ошибки в ручном выделении памяти в стеке. Все классические правила остаются в силе: если есть возможность выбора, вместо рекурсии лучше предпочесть итерацию, а также не заниматься ручной работой вместо компилятора.

Библиографический список

  • Э. Таненбаум. Архитектура компьютера.
  • Wikipedia. Stack Overflow.
  • man 3 alloca.
  • MSDN. How to recursively search folders by using Visual C++.
  • Stack Overflow. Stack Overflow C++.
  • GitHub. Lightspark — «tags.cpp».

Присылаем лучшие статьи раз в месяц

Приложения написанные на Free Pascal могут генерировать ошибку времени выполнения (Run Time Error) когда в программе обнаруживаются определённые аварийные состояния . Этот документ содержит список возможных ошибок и описание их возможных причин.


1 Invalid function number (Неправильный номер функции)

Была попытка неправильного вызова системной функции.


2 File not found (Файл не найден)

Генерируется при попытке перенаименования, стирания или открытия несуществующего файла.


3 Path not found (Путь(директория) не найден)

Генерируется файловой системой когда путь не существует или неправелен.
Также генерируется при попытке получить доступ к несуществующему файлу.


4 Too many open files (Слишком много файлов открыто)

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


5 File access denied (В доступе к файлу — отказано)

Было запрешено получение доступа к файлу. Эта ошибка может произойти по нескольким причинам:

  • При попытке открыть файл, предназначенный только для чтения или в деиствительности являющиёся директорией, для записи.

  • В данный момент занят или заблокирован другим процессом.

  • При попытке создания файла или директории с именем, которое совпадает с именем уже созданного файла или директории.

  • При попытке чтения из файла, открытого только для записи.

  • При попытке записи в файл, открытый только для чтения.

  • При попытке удалить директорию или файл, когда это не возможно.

  • При неимении прав на доступ к данному файлу.


6 Invalid file handle (Неправильный хэндл файла)

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


12 Invalid file access code (Неправильные ключи доступа к файлу)

Генерируется когда процедуры reset или rewrite вызываются с неправильным параметром FileMode.


15 Invalid drive number (Неправильный номер диска)

Генерируется когда в функции Getdir или ChDir был передан неправильный номер диска.


16 Cannot remove current directory (Невозможно удалить текущую директорию)

Генерируется при попытке удалить текущую директорию.


17 Cannot rename across drives (Можно переименовывать файлы только в пределах одного диска)

Вы не можете переименовать файл в файл, находяшиёся на другом диске или в другом разделе.


100 Disk read error (Ошибка чтения с диска)

Генерируется при невозможности произвести чтение с диска. Обычно происходит при попытке чтения данных, после его окончания.


101 Disk write error (Ошибка записи на диск)

Генерируется когда Вы пытаетесь записать данные на переполненый диск.


102 File not assigned (Файл не определён)

Генерируется функциями Reset, Rewrite, Append, Rename и Erase, При передаче в них файловой переменной, для которой не была выполнена функция AssignFile.


103 File not open (Файл не открыт)

Генерируется следующими функциями : Close, Read, Write, Seek, EOf, FilePos, FileSize, Flush, BlockRead, и BlockWrite если файл не был открыт.


104 File not open for input (Файл не открыт для чтения)

Генерируется функциями Read, BlockRead, Eof, Eoln, SeekEof и SeekEoln если файл не был открыт при помощи Reset.


105 File not open for output (Файл не открыт для записи)

Генерируется функцией write если текстовый файл не был открыт при помощи Rewrite.


106 Invalid numeric format(Неправильный числовой формат)

Генерируется когда ожидалось числовое значение, но из текстого файла было прочитано не было.


150 Disk is write-protected (Диск защищён от записи)

(Критическая ошибка)


151 Bad drive request struct length (Неправильная длина структуры запроса)

(Критическая ошибка)


152 Drive not ready (Устройство не готово)

(Критическая ошибка)


154 CRC error in data (Ошибка контрольной суммы в данных)

(Критическая ошибка)


156 Disk seek error (Ошибка низкоуровнего поиска на диске)

(Критическая ошибка)


157 Unknown media type (Неизвестный тип …)

(Критическая ошибка)


158 Sector Not Found (Сектор не найден)

(Критическая ошибка)


159 Printer out of paper (Нет бумаги в принтере)

(Критическая ошибка)


160 Device write fault (Сбой записи устройства)

(Критическая ошибка)


161 Device read fault (Сбой чтения устройства)

(Критическая ошибка)


162 Hardware failure (Сбой железа)

(Критическая ошибка)


200 Division by zero (Деление на ноль)

Приложение пыталось разделить число на ноль.


201 Range check error (Ошибка проверки границ)

Если вы компилировали прогамму с включённой провереой границ, Вы можете получить эту ошибку в следующих случаях:

  1. Массив был вызван с индексом, выходящим за декларированые пределы.

  2. Попытка присвоить значение переменной, выходящее за декларированые границы (для instance и enumerated типов).


202 Stack overflow error (Переполнение стека)

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


203 Heap overflow error (Переполнение кучи)

Размер кучи превысил максимально возможный размер. Генерируется при попытке выделить память непосредственно функциями New, GetMem и ReallocMem, или когда экземпляр класса или объекта создаётся и памяти не достаточно. Пожалуйста учтите что, по умолчанию, Free Pascal поддерживает увеличение кучи, то есть, если необходимо, будет произведена попытка её увеличения. Как бы то ни было, если размер кучи превысил максимально допустимый системой и
железом, то Вы получите эту ошибку.


204 Invalid pointer operation (Непрваильная операция с указателем)

Будет сгенерирована при вызове функций Dispose или Freemem с неправильным указателем (чаще всего, Nil)


205 Floating point overflow (Максимальная границы числа с плавающей точкой)

Вы попытались использовать или создать слишком большое число с плавающей точкой.


206 Floating point underflow (Минимальная граница числа с плавающей точкой)

Вы попытались использовать или создать слишком маленькое число с плавающей точкой.


207 Invalid floating point operation (Неправильная операция над числами с плавающей точкой)

Может генерироваться если вы попытались получить квадратный корень или логарифм отрицательного числа.


210 Object not initialized (Объект не инициализирован)

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


211 Call to abstract method (Попытка вызова абстрактного метода)

Ваша программа попыталась вызвать абстрактный виртуальный метод. Абстрактные методы должны быть перекрыты, и только перекрытый метод должен быть вызван.


212 Stream registration error (Ошибка регистрации потока)

Генерируется когда неправильный тип регистрируется в модуле objects.


213 Collection index out of range (Индекс элемента коллекции выходит за допустимые границы)

Генерируется когда Вы попытались обратиться к элементу коллекции с выходящим за допустимые границы индексом (модуль objects).


214 Collection overflow error (Переполнение коллекции)

Размер коллекции превысил максимально допустимый размер, а Вы попытались добавить новый элемент (модуль objects).


215 Arithmetic overflow error (Арифметическое переполнение)

Эта ошибка генерируется когда результат операции превысил допустимые границы. В отличие to Turbo Pascal, эта ошибка генерируется только для 32-bit и 64-bit арифметических переполнений. Это происходит согласно тому, что все операнды конвертируются в 32-bit или 64-bit, до того как производить вычисления.


216 General Protection fault (GP Ошибка защиты памяти)

Приложение попыталось обратиться к недопустимому участку памяти. Это может быть вызвано следующими причинами:

  1. Попытка получить разуказатель для nil.

  2. Попытка получить доступ к выходящему за допустимые границы участку памяти (например, вызов move с неправильной длиной).


217 Unhandled exception occurred (Произошо неизвестное исключение)

Произошло исключение, и для него не существеет хэндла. Модуль sysutils устанавливает handler(менеджер), который отлавливает все исключения, и безопасно выходит в случае обнаружения оного.


219 Invalid typecast (Неправильное приведение типов)

Генерируется когда недопустимое приведение типов производится над классом используя оператор as. Эта ошибка также генерируется, когда объект или класс приводится к недопустимому объекту или классу, и виртуальный метод этого объекта или класса вызывается. Эта последняя ошибка детектируется только с использованием опции -CR компилятора.


227 Assertion failed error (Сбой утверждения)

Утверждение провалено, и процедурная переменная AssertErrorProc не была уcтановлена.


  • Синтаксис языка
  • Типы данных
  • Стандартные модули
  • Процедуры и функции
  • Зарезервированные слова
  • Директивы компилятора
  • Сообщения об ошибках
    • Ошибки выполнения
    • Ошибки компиляции
  • Примеры программ
  • Описание среды разработки

Главная / Справочник / Сообщения об ошибках / Ошибки выполнения

Ошибка переполнения стека.

Описание

Программа сообщает об этой ошибке при входе в процедуру или функцию, компилируемую в режиме {$S+}, когда не имеется достаточно места в стеке для распределения локальных переменных подпрограммы.

Увеличьте размер стека, используя директиву компилятора $M.

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

  • Паскаль ошибка ожидалось описание или begin
  • Паскаль ошибка ожидалось имя переменной
  • Паскаль ошибка ожидается оператор
  • Паскаль ошибка нельзя преобразовать тип real к integer
  • Паяльник т12 ошибка 500