Error 202 stack overflow error

Question and Answer Database FAQ1373D.txt Stack Overflow, Runtime error 202; Category :Object Pascal Platform :All Product :All 32 bit Question: How can I avoid getting a Stack overflow runtime error 202? Answer: Simply put, stack overflows are caused by putting too much on the stack. Usually, they are caused by recursive procedures that never end....
 Question and Answer Database

FAQ1373D.txt   Stack Overflow, Runtime error 202;
Category   :Object Pascal
Platform    :All
Product    :All 32 bit  

Question:
How can I avoid getting a Stack overflow runtime error 202?

Answer:
Simply put, stack overflows are caused by putting too much on the
stack. Usually, they are caused by recursive procedures that never
end. A good example would be creating an event handler for the TMemo's
onChange event, and making a change to the Memo during the processing
of the event. Every time the OnChange event gets fired, another change
is made, so the OnChange event gets fired again in an almost endless
loop. The loop finally ends when the stack overflows, and the
application crashes.

Here is an example of a recursive procedure:

procedure RecursiveBlowTheStack;
begin
  RecursiveBlowTheStack;
end;

Sometimes, a stack overflow is caused by too many large procedures.
Each procedure calls another procedure, until the stack simply
overflows. This can be remidied by breaking up large procedures into
smaller ones. A good rule of thumb in regard to a procedures size is
if the procedure's source code takes up more than a screen, its time
to break it down into smaller procedures.

Finally, stack overflows can be caused by creating very large local
variables inside a procedure, or passing a large variable by value to
another procedure. Consider the passing of string variables. If the
string is 255 characters (plus the length byte), if passed by value,
you are actually taking up 256 bytes off the stack. If the procedure
you are calling passes the string by value to yet another procedure,
the string now takes 512 bytes of stack space. Passing the string (or
other variable) as a var or const parameter takes only 4 bytes, since
var and const parameters are simply pointers to the actual data. You
can also create large variables on the heap by dynamic allocation of
the memory;

The following code demonstrates two procedures BlowTheStack(), and
NoBlowTheStack(). The BlowTheStack procedure attempts to allocate a
large local variable designed to be large enough to crash the
application. The NoBlowTheStack() procedure allocates the same large
variable but allocates it on the heap so the function will succeed.

type
  PBigArray = ^TBigArray;
{$IFDEF WIN32}
  TBigArray = array[0..10000000] of byte;
{$ELSE}
  TBigArray = array[0..64000] of byte;
{$ENDIF}

procedure BlowTheStack;
var
  BigArray : TBigArray;
begin
  BigArray[0] := 10;
end;

procedure NoBlowTheStack;
var
  BigArray : PBigArray;
begin
  GetMem(BigArray, sizeof(BigArray^));
  BigArray^[0] := 10;
  FreeMem(BigArray, sizeof(BigArray^));
end;

Finally, the following code demonstrates creating procedures that
accept large variables as parameters. The PassByValueAnCrash()
procedure is designed to crash since the value parameter is too large
for the stack. The PassByVar(), PassByPointer(), and PassByConst will
succeed, since these procedures only use 4 bytes of stack space. Note
that you cannot modify a parameter passed as const, as a const
parameter is assumed to be read only.

Example:

procedure PassByValueAnCrash(BigArray : TBigArray);
begin
  BigArray[0] := 10;
end;

procedure PassByVar(var BigArray : TBigArray);
begin
  BigArray[0] := 10;
end;

procedure PassByPointer(BigArray : PBigArray);
begin
  PBigArray^[0] := 10;
end;

procedure PassByConst(const BigArray : TBigArray);
begin
  ShowMessage(IntToStr(BigArray[0]));
end;

7/16/98 4:31:28 PM
 

Article originally contributed by

0 / 0 / 3

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

Сообщений: 44

1

26.06.2012, 18:20. Показов 3494. Ответов 4


У меня и в колледже и дома стоит SchoolPack. Но дома, когда я делаю одну работу возникает ошибка 202: Ошибка переполнения стека. В колледже такого нет (видимо немного другая версия). Как исправить эту ошибку?
P.S: Ошибка эта возникает в процедуре, в которой я использую много переменных

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



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

64272 / 47571 / 32739

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

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

26.06.2012, 19:19

2

202 Stack overflow error (Переполнение стека).
Эта ошибка генерируется на входе в процедуру или функцию, скомпилированную в режиме {$S+}, в случае, если нет достаточной области для размещения локальных переменных подпрограммы. Увеличьте размер стека, используя директиву компилятора {$М}.

Наверняка куча лишних переменных, занимающих места больше чем нужно, типа строки из 255 символов, когда нужно максимум 20, матрицы 100х100, хотя больше 10 и не нужно и так далее.



0



1 / 1 / 0

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

Сообщений: 53

26.06.2012, 19:26

3

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

У меня и в колледже и дома стоит SchoolPack. Но дома, когда я делаю одну работу возникает ошибка 202: Ошибка переполнения стека. В колледже такого нет (видимо немного другая версия). Как исправить эту ошибку?
P.S: Ошибка эта возникает в процедуре, в которой я использую много переменных

А если попробывать процедуру в модуль запихнуть?



0



0 / 0 / 3

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

Сообщений: 44

26.06.2012, 20:06

 [ТС]

4

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

Наверняка куча лишних переменных, занимающих места больше чем нужно, типа строки из 255 символов, когда нужно максимум 20, матрицы 100х100, хотя больше 10 и не нужно и так далее.

Изменил все integer на byte, массив записи урезал со 100 до 30 — то же самое

Миниатюры

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



0



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

64272 / 47571 / 32739

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

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

26.06.2012, 20:10

5

Попробуй увеличить стек

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

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

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



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

26.06.2012, 20:10

5

Содержание

  1. Runtime Errors
  2. Runtime Errors:
  3. Types of Runtime Errors:
  4. Python
  5. C Runtime errors (Rxxxx)
  6. Run time error codes
  7. Блог молодого админа
  8. Увлекательный блог увлеченного айтишника
  9. Ошибка Runtime Error. Как исправить?
  10. Причины и решения
  11. Комментарии к записи “ Ошибка Runtime Error. Как исправить? ”

Runtime Errors

Runtime Errors:

Types of Runtime Errors:

  1. Division by Zero.
  2. Modulo Operation by Zero.
  3. Integer Overflow.

Below is the program to illustrate the SIGFPE error:

Output:

Below is the program to illustrate the SIGBRT error:

Output:

  1. Infinite Recursion or if you run out of stack memory.
  2. Negative array index is accessed.
  3. ArrayIndexOutOfBounds Exception.
  4. StringIndexOutOfBounds Exception.

Below is the program to illustrate the NZEC error:

Python

Output:

SIGSEGV: This error is the most common error and is known as “Segmentation Fault“. It is generated when the program tries to access a memory that is not allowed to access or attempts to access a memory location in a way that is not allowed. List of some of the common reasons for segmentation faults are:

  1. Accessing an array out of bounds.
  2. Dereferencing NULL pointers.
  3. Dereferencing freed memory.
  4. Dereferencing uninitialized pointers.
  5. Incorrect use of the “&” (address of) and “*”(dereferencing) operators.
  6. Improper formatting specifiers in printf and scanf statements.
  7. Stack overflow.
  8. Writing to read-only memory.

Below is the program to illustrate the SIGSEGV error:

Output:

Источник

C Runtime errors (Rxxxx)

The C Runtime library (CRT) may report a runtime error when your app is loaded or running. Even though each message refers to the Microsoft Visual C++ runtime library, it doesn’t mean there’s a bug in the library. These errors indicate either a bug in your app’s code, or a condition that the runtime library can’t handle, such as low memory. End users of your app may see these errors unless your write your app to prevent them, or to capture the errors and present a friendly error message to your users instead.

The Visual Studio compilers and build tools can report many kinds of errors and warnings. After an error or warning is found, the build tools may make assumptions about code intent and attempt to continue, so that more issues can be reported at the same time. If the tools make the wrong assumption, later errors or warnings may not apply to your project. When you correct issues in your project, always start with the first error or warning that’s reported, and rebuild often. One fix may make many subsequent errors go away.

To get help on a particular diagnostic message in Visual Studio, select it in the Output window and press the F1 key. Visual Studio opens the documentation page for that error, if one exists. You can also use the search tool at the top of the page to find articles about specific errors or warnings. Or, browse the list of errors and warnings by tool and type in the table of contents on this page.

Not every Visual Studio error or warning is documented. In many cases, the diagnostic message provides all of the information that’s available. If you landed on this page when you used F1 and you think the error or warning message needs additional explanation, let us know. You can use the feedback buttons on this page to raise a documentation issue on GitHub. If you think the error or warning is wrong, or you’ve found another problem with the toolset, report a product issue on the Developer Community site. You can also send feedback and enter bugs within the IDE. In Visual Studio, go to the menu bar and choose Help > Send Feedback > Report a Problem, or submit a suggestion by using Help > Send Feedback > Send a Suggestion.

You may find additional assistance for errors and warnings in Microsoft Learn Q&A forums. Or, search for the error or warning number on the Visual Studio C++ Developer Community site. You can also search Stack Overflow to find solutions.

For links to additional help and community resources, see Visual C++ Help and Community.

Источник

Run time error codes

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).

Источник

Блог молодого админа

Увлекательный блог увлеченного айтишника

Ошибка Runtime Error. Как исправить?

Ошибка Runtime Error возникает достаточно часто. Во всяком случае, с ней сталкивается достаточно большое количество пользователей. А возникает она при запуске той или иной программы или игры (помнится, давным-давно при запуске Counter-Strike некоторое время вылетала ошибка Runtime Error 8, пока я ее не исправил). В отличии от многих других ошибок, Runtime Error исправить не так уж сложно, о чем я хочу рассказать вам более подробно.

Причины и решения

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

  • Скажу сразу, что наиболее популярной причиной, которая встречается в абсолютном большинстве случаев, является обновление программы, либо же ее установка поверх старой версии. Вспомните, если недавно обновили приложении и после этого начала появляться ошибка, значит, проблема именно в обновлении. В этом случае проще всего будет удалить программу полностью с компьютера через «Панель управления», не забыв перенести сохранения, если, например, речь идет об игре. Также я рекомендую очистить реестр от «хвостов», а после этого можно установить программу заново. После этого проблем быть не должно.
  • По поводу очистки реестра. Установка обновлений нередко приводит к различным проблемам, возникающим именно в реестре. В принципе, можно попробовать обойтись одной лишь чисткой реестра, не прибегая к удалению программы. Я рекомендую пользоваться такой замечательной программой, как CCleaner. Она распространяется бесплатно (для домашнего пользования) и обладает массой всевозможных функций, одной из который является чистка реестра от поврежденных или проблемных ключей. В принципе, такой же функцией обладают и другие программы, в том числе бесплатные, и по сути нет разницы, чем вы будете пользоваться. Но я все же рекомендую именно CCleaner.
  • Допустим, что вы очистили реестр от файлов, а ошибка по-прежнему возникает. Что тогда? Теоретически, возможно проблема кроется во вредоносном файле, который имеется на компьютере. Для его удаление необходимо воспользоваться антивирусом с последними обновлениями, а также утилитой Dr. Web Cureit!, которая отлично справляется с различными троянами и вирусами. Она также бесплатная, скачать ее можно на официальном сайте компании Dr. Web.
  • На некоторых форумах пишут, что помогает обновление DirectX. Скачать ее можно на сайте компании Microsoft. Узнать, какая версия утилиты установлена у вас, я уже успел рассказать на страничках сайта.
  • Также стоит обратить внимание на текущую версию Visual C++. Для Windows 7 это должна быть Visual C++2010, а для Windows XP — Visual C++2008.

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

Комментарии к записи “ Ошибка Runtime Error. Как исправить? ”

перезагрузил комп. лол, помогло)))

А вот такое как решить. runtime error this application has requested the runtime to terminate

статью почитай хоть…

Добрый день! Не нашла куда вам написать — пишу в комментариях. У меня такая проблема: Я восстанавливала компьютер и мой антивирусник Norton заменился McAfee, который стоял по умолчанию. Нортон не установился (подписка активна до 2017 года), а McAfee я не удалила. Всё — центр поддержки не открывается, приложения не работают — не запускаются: я не могу просмотреть видео, прослушать аудио, не могу отправить письмо в Microsoft, не могу восстановить компьютер, не работает ни одна кнопка. Выдает ошибки Runtime Error и 1719. Скачала CCleaner, почистила — ничего не изменилось. Только в интернете могу посмотреть, а программы скачанные он не все запускает. McAfee не удаляется. Помогите, пожалуйста восстановить компьютер. С уважением Людмила

а че делать, когда устанавливаешь Visual C++2008? мне пишет «./install не является приложением win32»

Потому что у тебя не 64-операционная система, у тебя 32-битная система, из-за этого так пишет

При попытке запуска одной программы выскакивает сообщение:
«Runtime Error!
Program: C:Pr…
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application’s support team for more information.»
Ничего из описанного в этой статье не помогло…
Все другие программы работают как часы. Получается, что прога кривая?

Что делать,если ошибка выдаётся при включении компа,на экране блокировки и после этого чёрный экран,только мышка бегает?

Добрый день, испробовал все, ничего не помогает, поставили мне на пк новую видеокарту GeForce 1050, добавили оперативки до 6гб и переустановили систему, поставили новую 7 на 64, пользуюсь 2 день, не могу поставить моды на wot, вылетает ошибка runtime error (at-1;0), система чистая, вирусов нет, реестр чистил, ошибок нет, помогите пожалуйста разобраться. Заранее огромное спасибо.

Пытаюсь запустить игруху,но выдает ошибка Microsoft Visual C++ runtime libriary runtime error.
Многое перепробовал,но ничто не помогло,кто знает как решить?

Ничего не помогло 🙁

Запустите CMD от имени администратора , после , введите команду : bcdedit.exe /set IncreaseUserVA 2800

Отпишитесь кому помогло

ничего не помогает.Такая ошибка у меня в браузере появляется,а в обычных играх всё норм.

Модем тачмейт перестал работать из-за Runtime Error. Работал-работал и вдруг это. Что делать. На ноуте стоит виста. Он в 2008 г куплен.

База MsSql под деловодством Оптима работала до вчерашнего дня. Со следующего дает при попытке переслать документ ошибку RunTime Error 6. Причем за вчера работает нормально. Переписал на другой Сервер то-же самое. MSSQL-2005. Может у кого такое было.

Как устранить проблему Runtime error?
просто подключайте к пк гарнитуру или колонки и все

Здравствуйте. У меня при запуске игры выдает это:
Error!
Runtime error 112 at 00403FBC
Я перепробовала все способы! Ничего не помогло! Помогите пожалуйста решить эту проблему! Я вас очень прошу!

Здравствуйте!
Пытаюсь у становить мод-пак к игре WOT, и постоянно выбивает Runtime Error (at 233:2657): Could not call proc.
Пробовал и клинэр запускал, не помогло.

Здравствуйте !
Пытаюсь установить мод пак для wot и постоянно вылазит ошибка Runtime error (183:-2)
Что делать, подскажите. Все что было на сайте все сделал, все равно не помогло

Уважаемый МОЛОДОЙ АДМИН… (жаль, что имени своего Вы не указали…). В компьютерных делах я не особо сильна..
После чистки ноутбука столкнулась с проблемой, которую Вы так понятно и доходчиво разъяснили в данной статье…Ошибку устранила(почистила реестры) всё работает в прежнем режиме, причём, я программу не удаляла. Премного Благо Дарю.

А что насчет «rentime eror 200» ? мне не помогло

Источник

Stack Overflow, Runtime error 202

Simply put, stack overflows are caused by putting too much on the stack. Usually, they are caused by recursive procedures that never end. A good example would be creating an event handler for the TMemo’s onChange event, and making a change to the Memo during the processing of the event. Every time the OnChange event gets fired, another change is made, so the OnChange event gets fired again in an almost endless loop. The loop finally ends when the stack overflows, and the application crashes.

Here is an example of a recursive procedure:

Code:

procedure RecursiveBlowTheStack;

begin

RecursiveBlowTheStack;

end;

Sometimes, a stack overflow is caused by too many large procedures. Each procedure calls another procedure, until the stack simply overflows. This can be remidied by breaking up large procedures into smaller ones. A good rule of thumb in regard to a procedures size is if the procedure’s source code takes up more than a screen, its time to break it down into smaller procedures.

Finally, stack overflows can be caused by creating very large local variables inside a procedure, or passing a large variable by value to another procedure. Consider the passing of string variables. If the string is 255 characters (plus the length byte), if passed by value, you are actually taking up 256 bytes off the stack. If the procedure

you are calling passes the string by value to yet another procedure, the string now takes 512 bytes of stack space. Passing the string (or other variable) as a var or const parameter takes only 4 bytes, since var and const parameters are simply pointers to the actual data. You can also create large variables on the heap by dynamic allocation of the memory;

The following code demonstrates two procedures BlowTheStack(), and NoBlowTheStack(). The BlowTheStack procedure attempts to allocate a large local variable designed to be large enough to crash the

application. The NoBlowTheStack() procedure allocates the same large variable but allocates it on the heap so the function will succeed.

Code:

type

PBigArray = ^TBigArray;

{$IFDEF WIN32}

TBigArray = array[0..10000000] of byte;

{$ELSE}

TBigArray = array[0..64000] of byte;

{$ENDIF}

procedure BlowTheStack;

var

BigArray : TBigArray;

begin

BigArray[0] := 10;

end;

procedure NoBlowTheStack;

var

BigArray : PBigArray;

begin

GetMem(BigArray, sizeof(BigArray^));

BigArray^[0] := 10;

FreeMem(BigArray, sizeof(BigArray^));

end;

Finally, the following code demonstrates creating procedures that accept large variables as parameters. The PassByValueAnCrash() procedure is designed to crash since the value parameter is too large

for the stack. The PassByVar(), PassByPointer(), and PassByConst will succeed, since these procedures only use 4 bytes of stack space. Note that you cannot modify a parameter passed as const, as a const parameter is assumed to be read only.

Example:

Code:

procedure PassByValueAnCrash(BigArray : TBigArray);

begin

BigArray[0] := 10;

end;

procedure PassByVar(var BigArray : TBigArray);

begin

BigArray[0] := 10;

end;

procedure PassByPointer(BigArray : PBigArray);

begin

PBigArray^[0] := 10;

end;

procedure PassByConst(const BigArray : TBigArray);

begin

ShowMessage(IntToStr(BigArray[0]));

end;

Приложения написанные на 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тановлена.


>
Ошибка «Stack overflow»

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
24.05.05, 10:00

    Что значит эта 202 ошибка «Stack overflow»?
    Я никак не могу понять, написал процедуру и вставил в программу, отдельно это процедура как программа работает, но не хочет работать как процедура в другой программе. Выдает ошибку 202. Вчера что-то помучился она работала, седня опять не работает.
    Выкладываю саму процедуру. Её задача открывать уже существующий файл нетекстовой, а двоичный, считывать данные и их сортировать и снова записывать в этот же файл. Доичный файл типа сисок.
    Вот типы чтобы легче было разобраться в конструкции.
    {type
    RecBook = record
    name:string[20];
    phone:string[10];
    end;
    tipfile = file of RecBook;}

    Сама процедура:

    ExpandedWrap disabled

      Procedure Sort (var bookfile:tipfile);

       var

        work:recbook;

        i,j:integer;

        tmps:string[20];

        a,b:array[1..100] of string;

       begin

        Name_File; {еще одна процедура, я ее внизу написал}

        assign(bookfile, name);

        reset(bookfile);

         for i:=0 to filesize(bookfile)-1 do

           begin

            read(bookfile,work);

            a[i]:=work.vardas;

            b[i]:=work.phone;

          end;

            for i:=0 to filesize(bookfile)-2 do

             for j:=i+1 to filesize(bookfile)-1 do

               begin

                if a[i] > a[j] then

                  begin

                   tmps:=a[i];

                   a[i]:=a[j];

                   a[j]:=tmps;

                   tmps:=b[i];

                   b[i]:=b[j];

                   b[j]:=tmps;

                  end;

               end;

      close(bookfile);

      reset(bookfile);

       for i:=0 to filesize(bookfile)-1 do

        with work do

           begin

                vardas:=a[i];

                phone:=b[i];

                write(bookfile,work);

           end;

      close(bookfile);

      end;

    Процедура File_Name:

    ExpandedWrap disabled

      Procedure Name_File;

       begin

            write(‘Vvedite imia faila dannih telefonnogo spravo4nika > ‘);

            readln(name);

       end;

    Зарание спасибо.

    Guru

    volvo877



    Сообщ.
    #2

    ,
    24.05.05, 10:12

      Moderator

      *******

      Рейтинг (т): 878

      #MadCat#,
      как вызываешь Sort, покажи… А лучше — приаттачь всю программу ;)

      Цитата #MadCat# @ 24.05.05, 10:00

      Что значит эта 202 ошибка «Stack overflow»?

      Цитата

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

      Так что если с вызовом все в порядке — придется играть с директивой {$M a, b, c} Конкретнее — с первым параметром, определяющим размер стека. Можно, конечно, просто отключить контроль переполнения стека через {$S-}, но это как раз крайне нежелательно делать…

      Добавлено 24.05.05, 10:15
      Кстати, можно попробовать сделать так:

      ExpandedWrap disabled

        Procedure Sort (var bookfile:tipfile);

        var

          a, b:array[1..100] of string[20]; { <— 20 вместо 255 !!! }

      Тогда в стеке будет заниматься гораздо меньший объем, а тебе строка длиннее 20 символов и не нужна…


      #MadCat#



      Сообщ.
      #3

      ,
      24.05.05, 10:48

        Цитата volvo877 @ 24.05.05, 10:12

        Добавлено 24.05.05, 10:15
        Кстати, можно попробовать сделать так:

        ExpandedWrap disabled

          Procedure Sort (var bookfile:tipfile);

          var

            a, b:array[1..100] of string[20]; { <— 20 вместо 255 !!! }

        Тогда в стеке будет заниматься гораздо меньший объем, а тебе строка длиннее 20 символов и не нужна…

        Во, точно, ты прав. Все теперь работает, спасибо. Ну, почему все-таки происходило переполнение, я несовсем понял?

        Guru

        Romtek



        Сообщ.
        #4

        ,
        24.05.05, 10:48

          пропагандист

          *******

          Рейтинг (т): 188

          Я так понимаю, что стеки здесь не используются. Остаётся вариант — бесконечная рекурсия в программе (процедура вызвывает саму себя беск. кол-во раз).

          Guru

          volvo877



          Сообщ.
          #5

          ,
          24.05.05, 10:54

            Moderator

            *******

            Рейтинг (т): 878

            Цитата Romtek @ 24.05.05, 10:48

            Я так понимаю, что стеки здесь не используются.

            Это как «не используются» ? А где же локальные переменные хранятся?

            #MadCat#, массивы

            ExpandedWrap disabled

              a, b:array[1..100] of string;

            занимают в стеке 2 * 100 * 255 байт… Это больше 50Кб. Стек по умолчанию устанавливается в 16384 байта. Так что одно из двух: либо уменьшать размер локальных переменных (что и было сделано), либо увеличивать размер стека…

            Guru

            Romtek



            Сообщ.
            #6

            ,
            24.05.05, 11:00

              пропагандист

              *******

              Рейтинг (т): 188

              Цитата Romtek @ 24.05.05, 10:48

              Romtek, все проще

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

              Добавлено 24.05.05, 11:03

              Цитата volvo877 @ 24.05.05, 10:54

              Это как «не используются» ? А где же локальные переменные хранятся?

              Это я знаю. Я имел в виду саму структуру данных типа стек.


              #MadCat#



              Сообщ.
              #7

              ,
              24.05.05, 11:11

                volvo877 тут что-то с выводом теперь нето.
                У тебе паскаль имеется? Если да попробуй запустить этот код.
                Я тут выкладываю его без поиска, изменения записи, дополнения они работают.
                Попробуй создать файл внести туда имя и телефон, а потом отсортировать и просмотреть его, там какая-то белеберда с выводом первой и второй записи телефонов.

                ExpandedWrap disabled

                  Program Book;

                  uses crt;

                  Type

                      RecBook = Record

                       vardas: string[20];

                       phone: string[10];

                      End;

                      tipfile = file Of RecBook;

                  Var

                    bookfile: tipfile;

                    work: RecBook;

                    vid: byte;

                    End_Menu: boolean;

                    name: string[12];

                  Procedure Name_File;

                   Begin

                        write(‘Введите имя файла данных телефонного справочника > ‘);

                        readln(name);

                   End;

                  Procedure Sort (Var bookfile:tipfile);

                   Var

                     i,j: integer;

                     tmps: string[20];

                     a,b: array[1..100] Of string[20];

                   Begin

                     Name_File;

                     assign(bookfile, name);

                     reset(bookfile);

                     For i:=0 To filesize(bookfile)-1 Do

                       Begin

                         read(bookfile,work);

                         a[i] := work.vardas;

                         b[i] := work.phone;

                       End;

                        For i:=0 To filesize(bookfile)-2 Do

                          For j:=i+1 To filesize(bookfile)-1 Do

                            Begin

                              If a[i] > a[j] Then

                                Begin

                                  tmps := a[i];

                                  a[i] := a[j];

                                  a[j] := tmps;

                                  tmps := b[i];

                                  b[i] := b[j];

                                  b[j] := tmps;

                                End;

                            End;

                     close(bookfile);

                     reset(bookfile);

                     For i:=0 To filesize(bookfile)-1 Do

                       With work Do

                         Begin

                            vardas := a[i];

                            phone := b[i];

                            write(bookfile,work);

                         End;

                     close(bookfile);

                  End;

                  Procedure Create_book_Phone;

                   Var Ind,Count: integer;

                   Begin

                     Name_File;

                     Assign(Bookfile,name);

                     Rewrite(Bookfile);

                     writeln(‘Создание записей файла ‘, name);

                     write(‘Введите число записей в справочнике ‘);

                     readln(count);

                     For Ind:=1 To count Do

                        Addrec;

                     writeln(‘Создание файла данных телефонного справочника завершено’);

                     writeln(‘Файл данных имеет ‘,Filesize(bookfile),’ записи’);

                     close(bookfile);

                   End;

                  Procedure Outputrec;

                   Begin

                     read(bookfile,work);

                     With work Do

                       Begin

                         write(‘Запись No ‘, Filepos(bookfile),’ : ‘);

                         writeln(‘ФИО: ‘,vardas,’ телефон: ‘,phone);

                       End;

                    End;

                  Procedure OutputAllrec;

                   Begin

                     Name_file;

                     Assign(bookfile,name);

                    {$I-}

                     Reset(bookfile);

                    {$I+}

                     If IOresult = 0 Then

                       Begin

                         seek(bookfile, 0);

                         writeln(‘*** Вывод телефонного справочника из файла ‘,name,’***’);

                         while not Eof(bookfile) Do

                         Outputrec;

                       End

                     Else

                       writeln(‘Файла с именем ‘,name,’ на диске нет’);

                   End;

                  Begin

                    Clrscr;

                    End_menu := false;

                    Repeat

                      writeln(‘*** Телефонный справочник ***’);

                      writeln(‘ Выберите вид работы: ‘);

                      writeln(‘ 1 — создание нового файла’);

                      writeln(‘ 2 — просмотр’);

                      writeln(‘ 3 — изменение записи’);

                      writeln(‘ 4 — дополнение’);

                      writeln(‘ 5 — сортировка’);

                      writeln(‘ 6 — поиск’);

                      writeln(‘ 0 — exit’);

                      write(‘Ваш выбор ‘);

                      readln(vid);

                      Case vid Of

                        1:  Create_book_phone;

                        2:  Outputallrec;

                        3:  Updaterec;

                        4:  Addrectoend;

                        5:  sort(bookfile);

                        6:  search_pavarde;

                        0:  end_menu := true;

                      End;

                      writeln(‘для продолжения нажмите Enter’);

                      readln;

                      clrscr;

                    Until end_menu;

                   End.

                Guru

                Romtek



                Сообщ.
                #8

                ,
                24.05.05, 11:26

                  пропагандист

                  *******

                  Рейтинг (т): 188

                  Файл не компилируется — неполная версия.
                  Что значит «белибрда» ?

                  Добавлено 24.05.05, 11:29
                  Почему work описана как глобальная переменная, а ты вводишь её ещё как локальную в Sort ?

                  Сообщение отредактировано: Romtek — 24.05.05, 11:30

                  Guru

                  volvo877



                  Сообщ.
                  #9

                  ,
                  24.05.05, 11:37

                    Moderator

                    *******

                    Рейтинг (т): 878

                    #MadCat#,
                    я тебе и без компиляции скажу, где проблема:

                    ExpandedWrap disabled

                      Procedure Sort (var bookfile:tipfile);

                      var

                        a,b:array[1..100] of string[20];

                      begin

                        for i:=0 to filesize(bookfile)-1 do begin

                          read(bookfile,work);

                          a[i]:=work.vardas; { <— Вот тут проблема }

                          b[i]:=work.phone;

                        end;

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

                    ExpandedWrap disabled

                      var count: integer;

                      count := 0;

                      while not eof(bookfile) do begin

                        read(bookfile,work); inc(count);

                        a[count]:=work.vardas;

                        b[count]:=work.phone;

                      end;

                      for i:=1 to pred(count) do

                        for j:=i+1 to count do begin

                          …

                        end;


                    #MadCat#



                    Сообщ.
                    #10

                    ,
                    24.05.05, 12:03

                      Цитата Romtek @ 24.05.05, 11:26

                      Файл не компилируется — неполная версия.
                      Что значит «белибрда» ?

                      Добавлено 24.05.05, 11:29
                      Почему work описана как глобальная переменная, а ты вводишь её ещё как локальную в Sort ?

                      Белиберда — это я имел ввиду, что там пишет какие-то неясные символы.

                      А кто мне мешает переменную Work использовать в процедуре? Ну и что, что она глобальная, она как вспомогательная идет и в разных процедурах принимает разные значения типа списка.

                      Цитата

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

                      Да этот способ куда лучше, теперь нормально, т.е. теперь я могу не задавать в масиве String[20]? Можно просто, как String и переполнений не будет?

                      Добавлено 24.05.05, 12:06
                      А, нет ругается все все-таки надо задавать ограничение.

                      Guru

                      volvo877



                      Сообщ.
                      #11

                      ,
                      24.05.05, 12:13

                        Moderator

                        *******

                        Рейтинг (т): 878

                        Цитата #MadCat# @ 24.05.05, 12:03

                        Можно просто, как String и переполнений не будет?

                        :no: Не меняй на String… Опять получишь «Stack Overflow», у тебя же опять размер локальных переменных увеличится…

                        А хочешь еще одно улучшение? Смотри:

                        ExpandedWrap disabled

                          Procedure Sort (Var bookfile:tipfile);

                          Var

                            tmps: RecBook;

                            arr: array[1..100] Of RecBook;

                          Begin

                            …

                            Count := 0;

                            While not Eof(bookfile) Do Begin

                              Inc(count);

                              Read(bookFile, arr[count]);

                            End;

                            for i:=1 to pred(count) do

                              for j:=i+1 to count do begin

                                if arr[i].vardas > arr[j].vardas then begin

                                  tmps := arr[i]; arr[i] := arr[j]; arr[j] := tmps;

                                end;

                            reset(bookfile);

                            For i:=1 To count do

                              write(bookfile, arr[i]);

                            …

                        Guru

                        Romtek



                        Сообщ.
                        #12

                        ,
                        24.05.05, 12:23

                          пропагандист

                          *******

                          Рейтинг (т): 188

                          Цитата #MadCat#

                          ExpandedWrap disabled

                               close(bookfile);

                               reset(bookfile);

                               For i:=0 To filesize(bookfile)-1 Do

                                 With work Do

                                   Begin

                                      vardas := a[i];

                                      phone := b[i];

                                      write(bookfile,work);

                                   End;

                               close(bookfile);

                          Ты сначала закрываешь файл, потом снова открываешь. Зачем?
                          Можно просто установить указатель файла на нулевую запись (начало) с помошью Seek (bookfile, 0);
                          Тогда

                          ExpandedWrap disabled

                               close(bookfile);

                               reset(bookfile);

                          можно удалить.

                          Добавлено 24.05.05, 12:27

                          Цитата #MadCat# @ 24.05.05, 12:03

                          А кто мне мешает переменную Work использовать в процедуре? Ну и что, что она глобальная, она как вспомогательная идет и в разных процедурах принимает разные значения типа списка.

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

                          Кстати, значения полей записи не нужно менять, т.к. ТП7 допускает присвоение записи значения другой записи, т.е.

                          ExpandedWrap disabled

                            temp := work1;

                            work1 := work2;

                            work2 := temp;


                          #MadCat#



                          Сообщ.
                          #13

                          ,
                          24.05.05, 12:40

                            Цитата volvo877 @ 24.05.05, 12:13

                            Цитата #MadCat# @ 24.05.05, 12:03

                            Можно просто, как String и переполнений не будет?

                            :no: Не меняй на String… Опять получишь «Stack Overflow», у тебя же опять размер локальных переменных увеличится…

                            А хочешь еще одно улучшение? Смотри:

                            ExpandedWrap disabled

                              Procedure Sort (Var bookfile:tipfile);

                              Var

                                tmps: RecBook;

                                arr: array[1..100] Of RecBook;

                              Begin

                                …

                                Count := 0;

                                While not Eof(bookfile) Do Begin

                                  Inc(count);

                                  Read(bookFile, arr[count]);

                                End;

                                for i:=1 to pred(count) do

                                  for j:=i+1 to count do begin

                                    if arr[i].vardas > arr[j].vardas then begin

                                      tmps := arr[i]; arr[i] := arr[j]; arr[j] := tmps;

                                    end;

                                reset(bookfile);

                                For i:=1 To count do

                                  write(bookfile, arr[i]);

                                …

                            А понятно всё. Тоже вариант неплохой.

                            Цитата

                            Ты сначала закрываешь файл, потом снова открываешь. Зачем?
                            Можно просто установить указатель файла на нулевую запись (начало) с помошью Seek (bookfile, 0);

                            Точно.Попробую.


                            #MadCat#



                            Сообщ.
                            #14

                            ,
                            24.05.05, 20:01

                              Цитата volvo877 @ 24.05.05, 10:54

                              #MadCat#, массивы

                              ExpandedWrap disabled

                                a, b:array[1..100] of string;

                              занимают в стеке 2 * 100 * 255 байт… Это больше 50Кб.

                              2*100*255=51000 байт, а 51000/1024=49,8kb… < 50kb

                              Guru

                              volvo877



                              Сообщ.
                              #15

                              ,
                              24.05.05, 20:28

                                Moderator

                                *******

                                Рейтинг (т): 878

                                Смысл от этого не изменился. Это все равно больше значения по умолчанию.

                                Guru

                                Romtek



                                Сообщ.
                                #16

                                ,
                                25.05.05, 06:49

                                  пропагандист

                                  *******

                                  Рейтинг (т): 188

                                  Цитата #MadCat# @ 24.05.05, 20:01

                                  2*100*255=51000 байт, а 51000/1024=49,8kb… < 50kb

                                  Цитата volvo877 @ 24.05.05, 20:28

                                  Смысл от этого не изменился. Это все равно больше значения по умолчанию.

                                  А по-моему ошибка не из-за этого.

                                  ExpandedWrap disabled

                                    var

                                       a, b: array[1..100] of string;

                                       s: string;

                                       i: byte;

                                    begin

                                         s := »;

                                         for i := 1 to 255 do

                                             s := s + chr(i);

                                         for i := 1 to 100 do

                                             a[i] := s;

                                         a := b;

                                    end.

                                  Почему тогда здесь такой ошибки не возникает?

                                  Guru

                                  volvo877



                                  Сообщ.
                                  #17

                                  ,
                                  25.05.05, 06:59

                                    Moderator

                                    *******

                                    Рейтинг (т): 878

                                    Цитата Romtek @ 25.05.05, 06:49

                                    Почему тогда здесь такой ошибки не возникает?

                                    здесь a и b — глобальные переменные, следовательно размещаются они в сегменте данных, а не в стеке… А размер DS = 64К. Но попробуй сделать так:

                                    ExpandedWrap disabled

                                      var

                                         a, b, c: array[1..100] of string;

                                    Что будет? Сегмент данных переполняется и … «Too many variables» :whistle: В случае же локальных переменных — переполняется стек. Кстати, попробуй в исходной программе добавить {$M 65520, 0, 0} и переполнения уже не будет.

                                    Guru

                                    Romtek



                                    Сообщ.
                                    #18

                                    ,
                                    25.05.05, 22:49

                                      пропагандист

                                      *******

                                      Рейтинг (т): 188

                                      Я пробовал также и с локальными переменными в процедуре, и тоже не было проблем (только если не больше двух переменных).
                                      В программе Ash только 2 переменные.

                                      Guru

                                      volvo877



                                      Сообщ.
                                      #19

                                      ,
                                      26.05.05, 06:13

                                        Moderator

                                        *******

                                        Рейтинг (т): 878

                                        Ты хочешь сказать, что вот это:

                                        ExpandedWrap disabled

                                          procedure test;

                                          var

                                            a, b: array[1..100] of string;

                                            s: string;

                                            i: byte;

                                          begin

                                            s := »;

                                            for i := 1 to 255 do

                                              s := s + chr(i);

                                            for i := 1 to 100 do

                                              a[i] := s;

                                            a := b;

                                          end;

                                          begin

                                            test;

                                          end.

                                        у тебя компилируется и отрабатывает без ошибок? :wacko: В Турбо-Паскале? У меня при входе в процедуру — «Stack Overflow». Может в FPC это и сработает, но в TP — нет… Кстати, возможно дело в этом: зайди в «Options -> Memory Sizes» и посмотри установленный по умолчанию размер стека. Может ты его переустанавливал. У меня он равен 16384…

                                        Guru

                                        Romtek



                                        Сообщ.
                                        #20

                                        ,
                                        26.05.05, 07:49

                                          пропагандист

                                          *******

                                          Рейтинг (т): 188

                                          Цитата volvo877 @ 26.05.05, 06:13

                                          Ты хочешь сказать, что вот это:

                                          ExpandedWrap disabled

                                            procedure test;

                                            var

                                              a, b: array[1..100] of string;

                                              s: string;

                                              i: byte;

                                            begin

                                              s := »;

                                              for i := 1 to 255 do

                                                s := s + chr(i);

                                              for i := 1 to 100 do

                                                a[i] := s;

                                              a := b;

                                            end;

                                            begin

                                              test;

                                            end.

                                          у тебя компилируется и отрабатывает без ошибок? :wacko: В Турбо-Паскале?

                                          :yes:
                                          В настройках ничего не менял, стоит 16384 :unsure:

                                          Guru

                                          volvo877



                                          Сообщ.
                                          #21

                                          ,
                                          26.05.05, 07:54

                                            Moderator

                                            *******

                                            Рейтинг (т): 878

                                            «Options -> Compiler -> Stack Checking» включен? При выключенном и у меня работает, но … Сам понимаешь, чем это может кончиться ;)

                                            Guru

                                            Romtek



                                            Сообщ.
                                            #22

                                            ,
                                            26.05.05, 08:03

                                              пропагандист

                                              *******

                                              Рейтинг (т): 188

                                              Цитата volvo877 @ 26.05.05, 07:54

                                              «Options -> Compiler -> Stack Checking» включен?

                                              …выключен.

                                              Цитата volvo877 @ 26.05.05, 07:54

                                              ам понимаешь, чем это может кончиться

                                              Buffer Overflow? :D

                                              Guru

                                              volvo877



                                              Сообщ.
                                              #23

                                              ,
                                              26.05.05, 08:21

                                                Moderator

                                                *******

                                                Рейтинг (т): 878

                                                Цитата Romtek @ 26.05.05, 08:03

                                                Buffer Overflow? :D

                                                А попробуй запустить вот эту (правильную) программу:

                                                ExpandedWrap disabled

                                                  {$m 60000, 0, 0}

                                                  procedure test;

                                                  var

                                                    a, b: array[1..100] of string;

                                                    s: string;

                                                    i, count: byte;

                                                  begin

                                                    s := »;

                                                    for i := 1 to 255 do

                                                      s := s + chr(i);

                                                    for i := 1 to 100 do

                                                      a[i] := s;

                                                    for i := 1 to 100 do

                                                      if a[1] <> a[i] then inc(count);

                                                    writeln(count);

                                                    a := b;

                                                  end;

                                                  begin

                                                    test;

                                                  end.

                                                и свою:

                                                ExpandedWrap disabled

                                                  procedure test;

                                                  var

                                                    a, b: array[1..100] of string;

                                                    s: string;

                                                    i, count: byte;

                                                  begin

                                                    s := »;

                                                    for i := 1 to 255 do

                                                      s := s + chr(i);

                                                    for i := 1 to 100 do

                                                      a[i] := s;

                                                    for i := 1 to 100 do

                                                      if a[1] <> a[i] then inc(count);

                                                    writeln(count);

                                                    a := b;

                                                  end;

                                                  begin

                                                    test;

                                                  end.

                                                И посмотри на результаты :blink: Чувствуешь разницу?

                                                Guru

                                                Romtek



                                                Сообщ.
                                                #24

                                                ,
                                                26.05.05, 09:41

                                                  пропагандист

                                                  *******

                                                  Рейтинг (т): 188

                                                  Без галочки:
                                                  0 — твоя (проблем нет)
                                                  0 — моя (проблем нет)

                                                  С галочкой:
                                                  0 — твоя (проблем нет)
                                                  Stack overflow error (понятное дело! Вопрос: «на что это может повлиять?»)

                                                  Guru

                                                  volvo877



                                                  Сообщ.
                                                  #25

                                                  ,
                                                  26.05.05, 09:50

                                                    Moderator

                                                    *******

                                                    Рейтинг (т): 878

                                                    Я не о том, что есть или нет проблемы :) Сколько она тебе печатает? У меня без директивы {$M} (и без галочки, естественно) печатает число 24, то есть 24 (!!!) несовпадения 1-го элемента с последующими, а с директивой {$M} несовпадений нет…

                                                    А сколько по-твоему НЕсовпадений должно быть?

                                                    Guru

                                                    Romtek



                                                    Сообщ.
                                                    #26

                                                    ,
                                                    26.05.05, 09:58

                                                      пропагандист

                                                      *******

                                                      Рейтинг (т): 188

                                                      Я же написал, печатает 0 (ноль) без галки в обеих программах. Проверял 5 раз: то есть никаких отклонений не было найдено.

                                                      Цитата volvo877 @ 26.05.05, 09:50

                                                      А сколько по-твоему НЕсовпадений должно быть?

                                                      Наверно зависит от того, насколько переполнен стек…не хочу гадать.

                                                      Добавлено 26.05.05, 10:19
                                                      Я считаю, что проверки компилятора нужны только на этапе отладки программы, а в релизе программист должен учесть все варианты.

                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                                      0 пользователей:

                                                      • Предыдущая тема
                                                      • Pascal
                                                      • Следующая тема

                                                      [ Script execution time: 0,0804 ]   [ 15 queries used ]   [ Generated: 9.02.23, 11:32 GMT ]  

                                                      Понравилась статья? Поделить с друзьями:

                                                      Читайте также:

                                                    • Error 2015 others hikvision при активации
                                                    • Error 2015 iphone
                                                    • Error 2015 hiwatch
                                                    • Error 2014 fnis
                                                    • Error 2013 lost connection to mysql server during query sql statement

                                                    • 0 0 голоса
                                                      Рейтинг статьи
                                                      Подписаться
                                                      Уведомить о
                                                      guest

                                                      0 комментариев
                                                      Старые
                                                      Новые Популярные
                                                      Межтекстовые Отзывы
                                                      Посмотреть все комментарии