Меню

Stack overflow ошибка pascal

Stack overflow error pascal

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

Источник

Stack overflow error pascal

s_a_s_h_a
Дата 18.4.2005, 17:47 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 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
Дата 18.4.2005, 17:55 (ссылка) | (нет голосов) Загрузка .

Спамер 🙂

Профиль
Группа: Участник
Сообщений: 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
Дата 18.4.2005, 18:14 (ссылка) | (нет голосов) Загрузка .

Днепрянин

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

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

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

Код
<$M 65384,0,655360>

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

SPrograMMer
Дата 18.4.2005, 18:32 (ссылка) | (нет голосов) Загрузка .

Спамер 🙂

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

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

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

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

Fedor
Дата 18.4.2005, 18:49 (ссылка) | (нет голосов) Загрузка .

Днепрянин

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

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

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

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

SPrograMMer
Дата 18.4.2005, 21:34 (ссылка) | (нет голосов) Загрузка .

Спамер 🙂

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

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

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

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

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

Fedor
Дата 18.4.2005, 22:15 (ссылка) | (нет голосов) Загрузка .

Днепрянин

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

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

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

volvo877
Дата 19.4.2005, 00:07 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Комодератор
Сообщений: 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
Дата 19.4.2005, 01:18 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Завсегдатай
Сообщений: 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 размер стека можно указать таким

Код
<$M 20150,0,655360>

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

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

Zero
Дата 19.4.2005, 01:51 (ссылка) | (нет голосов) Загрузка .

Эксперт

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

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

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

Код
<$S->

И узё.
Добавлено @ 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 прошивка под всех операторов

>
Ошибка «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,1201 ]   [ 15 queries used ]   [ Generated: 29.01.23, 02:02 GMT ]  

                                                      Узнай цену своей работы

                                                      Формулировка задачи:

                                                      во время выполнения процедуры, вылетает с ошибкой stack overflow error

                                                      Код к задаче: «Stack overflow error»

                                                      textual

                                                      Листинг программы

                                                      type strok=string[20]; //или сколько нужно

                                                      Полезно ли:

                                                      14   голосов , оценка 3.786 из 5

                                                      Похожие ответы

                                                      1. Рекурсивная функция Error 87
                                                      2. Error in statement
                                                      3. Ошибка Error 85: ‘;’ expected
                                                      4. Error: Incompatible types: got «Extended» expected «SmallInt»
                                                      5. Вывести фамилии, имена и отчества всех студентов мужского пола, старших 18 лет
                                                      6. Найти значение функции Y(X) при заданном X
                                                      7. Траектория на Паскале или на С++
                                                      8. Программа формирования из вектора
                                                      9. Определить суммы всех элементов матрицы, лежащих на диагоналях
                                                      10. Найти максимальное число и уменьшить все элементы массива на 5
                                                      11. Среднее арифметическое наибольшего и наименьшего значений элементов матрицы ниже главной диагонали

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

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

                                                      А вот еще интересные материалы:

                                                    • Яшка сломя голову остановился исправьте ошибки
                                                    • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
                                                    • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
                                                    • Stabilitrak ошибка опель astra
                                                    • Stabilitrak ошибка opel insignia