Stack overflow ошибка делфи

jaguarchuk

0 / 0 / 0

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

Сообщений: 20

1

19.06.2012, 23:03. Показов 8230. Ответов 5

Метки нет (Все метки)


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

Ну ни как не хочет работать

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function p: string;
var
plist: TStringList;
c: integer;
ss: string;
begin
p := '';
plist := TStringList.Create;
plist.LoadFromFile('configp.txt');
 for c := 0 to plist.Count -1 do begin                 \выделяет и все
ss := plist.Strings[c];
p := p+ss+'ololo';
end;
if Form1.CheckBox5.Checked = false then
p := '';
end;
...
S.send(p);



0



Programming

Эксперт

94731 / 64177 / 26122

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

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

19.06.2012, 23:03

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

Ошибка stack overflow
Вылетает ошибка "stack overflow", менял Max stack size с $00100000 на %00999999, не помогло.
Что…

Stack is overflow в игре
Доброго времени суток, уважаемые эксперты. Я занялся созданием программы, но в ходе ее работы у…

ошибка Overflow Stack
Доброго времени суток!
Дело в том что у меня в B. Delphi 7 проект перед этим работал. А теперь…

Stack overflow в чате
Здравствуйте, делаю чат(клиент-сервер) в Delphi 7 на сокетах. После каких то(ошибку обнаружил не…

5

421 / 351 / 19

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

Сообщений: 1,437

19.06.2012, 23:23

2

Что именно не работает?Выдает ошибку, или еще что?…



0



0 / 0 / 0

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

Сообщений: 20

19.06.2012, 23:34

 [ТС]

3

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

Что именно не работает?Выдает ошибку, или еще что?…

ошибка же stack overflow



0



421 / 351 / 19

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

Сообщений: 1,437

19.06.2012, 23:41

4

ошибка Overflow Stack смотри здесь

Добавлено через 36 секунд
может быть ты бесконечно раз вызываешь функцию?..



0



429 / 337 / 36

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

Сообщений: 1,156

19.06.2012, 23:41

5

Ошибка видимо в другом месте кода



0



Одиночка

3943 / 1868 / 337

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

Сообщений: 3,880

20.06.2012, 07:53

6

Скорее всего в строке 12 выложенного кода компилятор интерпретирует p как функцию и происходит рекурсивное обращение к самой себе. Пиши так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function p: string;
var
plist: TStringList;
c: integer;
ss: string;
begin
  Result := '';
  if Not Form1.CheckBox5.Checked then Exit;
 
  plist := TStringList.Create;
  plist.LoadFromFile('configp.txt');
  for c := 0 to plist.Count -1 do 
  begin
    ss := plist.Strings[c];
    Result := Result+ss+'ololo';
  end;
end;
...
S.send(p);



3



The default maximum stack size for a thread is 1 MB. The three local variables of Button1Click total 131,070 + 65,535 * 4 + 65,535 * 8 = 917,490 bytes. When you call getProcessedData, you pass the parameter by value, which means that the function makes a local copy of the parameter on the stack. That adds SizeOf(TRawInts) = 262,140 bytes to bring the stack to at least 1,179,630 bytes, or about 1.1 MB. There’s your stack overflow.

You can reduce the stack use by passing the TRawInts array by reference instead. Then the function won’t make its own copy. Zdravko’s answer suggests using var, but since the function has no need to modify the passed-in array, you should use const instead.

function getProcessedData(const rawInts: TRawInts): TProcessedData;

Naively, we might expect the tempData and Result variables in getProcessedData to occupy additional stack space, but in reality, they probably won’t. First, large return types typically result in the compiler changing the function signature, so it would act more like your function were declared with a var parameter instead of a return value:

procedure getProcessedData(rawInts: TRawInts; var Result: TProcessedData);

Then the call is transformed accordingly:

getProcessedData(rawInts, processedData);

Thus, Result doesn’t take up any more stack space because it’s really just an alias for the variable in the caller’s frame.

Furthermore, sometimes the compiler recognizes that an assignment at the end of your function, like Result := tempData, means that tempData doesn’t really need any space of its own. Instead, the compiler may treat your function as though you had been writing directly into Result all along:

begin
  scaleFactor := 0.01;

  for i := 0 to 65534 do
    Result[i] := rawInts[i] * scaleFactor;
end;

However, it’s best not to count on the compiler to make those sorts of memory-saving changes. Instead, it’s better not to lean so heavily on the stack in the first place. To do that, you can use dynamic arrays. Those will move the large amounts of memory out of the stack and into the heap, which is the part of memory used for dynamic allocation. Start by changing the definitions of your array types:

type
  TRawData = array of Byte;
  TRawInts = array of Integer;
  TProcessedData = array of Double;

Then, in your functions that return those types, use SetLength to assign the length of each array. For example, the function we’ve seen already might go like this:

function getProcessedData(const rawInts: TRawInts): TProcessedData;
var
  i: Integer;
  scaleFactor: Double;
begin
  Assert(Length(rawInts) = 65535);
  SetLength(Result, Length(rawInts));

  scaleFactor := 0.01;

  for i := 0 to High(rawInts) do
    Result[i] := rawInts[i] * scaleFactor;
end;

Срабатывает обработчик, в нем вызывается Next, это вызывает срабатывание обработчика… и так до бесконечности, пока не забивается стек.

Как костыль — можно завести булеву переменную для блокировки обработчика: в начале обработчика проверять флаг, если его значение false — выставлять в true и выполнять остальную часть, в противном случае (если true) — выходить. Тогда при попытке повторно зайти в обработчик его выполнение тут же прекратится. Переменная должна быть объявлена не в самом обработчике, а выше (в модуле, в классе).

Другой костыль — в начале обработчика, выставлять вашему набору данных AfterScroll := nil, а в конце — возвращать обратно AfterScroll := ....

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

А вообще лучше разобраться, что у вас там с вычисляемым полем.


Форум программистов Vingrad

Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> DelphiX. — Странная ошибка «Stack Overflow» 

:(

   

Опции темы

Uxas
  Дата 7.11.2009, 00:08 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

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

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

Прошу подсказать, изучаю DelphiX четвертый день, решил просто потренироваться — квадратом бегаю по экрану, в разных местах появляются еще почти такие же но другого класса, и хотел сделать так чтобы при столкновении происходило изменение координат у последних(вначале хотел сделать что то типа змейки) в общем всё как бы ничего и если пишу в столконовении Dead то они уничтожаются, но вот если пишу в DoMove главного квадрата сохранение координат в две переменные(x1:=x; y1:=y; ) а потом в DoMove квадратов которые появляются пишу x:=x1; y:=y1; в запущеной игре при столкновении вылазит ошибка «Stack Overflow» и игра закрывается немогу понять в чем дело. Может и это не будет походить на змейку и что то подобное ей а просто квадраты будут лепиться друг ко другу но меня интересует откуда берется эта ошибка и как от нее избавиться. Ну если кто то подскажет как написать змейку буду более благодарен.  smile 

PM MAIL   Вверх
~FoX~
Дата 7.11.2009, 11:40 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

НЕ рыжий!!!
****

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

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

Uxas, Код в студию, а то все телепаты сегодня с похмелья… smile 

———————

user posted image
…множественность никогда не следует полагать без необходимости…

PM MAIL WWW ICQ Jabber   Вверх
Uxas
Дата 7.11.2009, 22:29 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

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

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

Код в студии smile

Код

var
  Form1: TForm1;
  x1,y1: double;
  k: integer;

implementation

{$R *.dfm}

type
 TK1 = class(TimageSprite)
 protected
  procedure DoMove(MoveCount: Integer); override;
 public
 end;

 TK2 = class(TimageSprite)
 protected
  Procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
  Procedure DoMove(MoveCount: Integer); override;
 public
 end;

Procedure TK1.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);

if isLeft in Form1.DXInput1.States then begin k:=1; end;
if isRight in Form1.DXInput1.States then begin k:=4; end;
if isUp in Form1.DXInput1.States then begin k:=2; end;
if isDown in Form1.DXInput1.States then begin k:=3; end;

if k=4 then x:=x+5;
if k=1 then x:=x-5;
if k=2 then y:=y-5;
if k=3 then y:=y+5;

      if y>=form1.DXDraw1.SurfaceHeight-image.Height then
       y:=form1.DXDraw1.SurfaceHeight-image.Height;
      if  x >= form1.DXDraw1.SurfaceWidth -image.Width  then
       x:=form1.DXDraw1.SurfaceWidth -image.Width;
      if  y<=0 then
       y:=1;
      if  x<=0 then
       x:=1;
end;

Procedure tk2.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is Tk1 then k:=5;
Collision;
end;

Procedure TK2.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
 if k=5 then
  begin
  x:=x1;
  y:=y1;
  end;
Collision;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Dxdraw1.Cursor:=crNone;
with TK1.Create(Dxspriteengine1.Engine) do
 begin
 PixelCheck := True;
  Image := form1.dxImageList1.Items.Find('k1');
  x:=0;
  y:=0;
  Width := Image.Width;
  Height := Image.Height;

    AnimCount := Image.PatternCount;
    AnimLooped := True;
    AnimSpeed := 10 / 500;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
with TK2.Create(Dxspriteengine1.Engine) do
 begin
 PixelCheck := True;
  Image := form1.dxImageList1.Items.Find('k2');
  x:=random(1024-50);
  y:=random(768-50);
  x1:=x;
  y1:=y;
  Width := Image.Width;
  Height := Image.Height;
    AnimCount := Image.PatternCount;
    AnimLooped := True;
    AnimSpeed := 10 / 500;
 end;
end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw1.CanDraw then exit;
  DXInput1.Update;
  DXSpriteEngine1.Move(LagCount);
  DXSpriteEngine1.Dead;
  DXDraw1.Surface.Fill(0);
  DXSpriteEngine1.Draw;
  DXDraw1.Flip;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=VK_ESCAPE then application.Terminate;
end;

end.

PM MAIL   Вверх
Bitter
Дата 9.11.2009, 13:03 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный лентяй
***

Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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

Отличный код, ничего не понятно.. что за функции DoMove, Collision. ну вобщем ставишь брекпоинт где нить на inherited, жмешь F7 и смотришь куда заходит. Stack Overflow это когда курсор бесконечно заходит в одну или несколько функций, и не может выйти из за того, что либо одна функция вызывает сама себя либо несколько функций вызывают одна другую и наоборот

PM MAIL ICQ Skype   Вверх
~FoX~
Дата 9.11.2009, 22:35 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

НЕ рыжий!!!
****

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

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

Цитата(Uxas @  7.11.2009,  23:29 Найти цитируемый пост)
Procedure TK1.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);

А почему инхеритед в начале?

———————

user posted image
…множественность никогда не следует полагать без необходимости…

PM MAIL WWW ICQ Jabber   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: Звук, графика и видео»
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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

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

FAQ раздела лежит здесь!


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

 

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

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Сообщение «Stack overflow» (исключение EStackOverflow)

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



    Сообщ.
    #1

    ,
    09.01.13, 06:20

      Full Member

      ***

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

      Добрый день! Подскажите пожалуйста, когда может появляться сообщение «Stack overflow» (исключение EStackOverflow)?
      Стало появляться после того, как написал обработчик события AfterScroll для ADODataSet:

      ExpandedWrap disabled

        with DataModule1.UmzDpd do

          begin

            if Active=True then

            begin

              First;

              while Eof<>True do

              begin

                Edit;

                if FieldByName(‘НаличиеРСТ’).AsBoolean=True then

                  FieldByName(‘НаличРСТ’).AsString:= ‘Да’

                else

                  FieldByName(‘НаличРСТ’).AsString:= ‘Нет’;

                Next;

              end;

              First;

            end;

          end;

      Здесь присваивается значение вычисляемому полю (оно исчезает в гриде всякий раз, как переходишь на другую строку). Метод Post не вызываю. т.к. мне не нужно отправлять в БД, нужно только чтобы показывалось в гриде. Я использую LockType=ItBatchOptimistic (тогда данные в БД отсылаются только методом TADODataSet.UpdateBatch). В чем может быть ошибка?


      MBo



      Сообщ.
      #2

      ,
      09.01.13, 07:43

        Наиболее вероятна причина — бесконечная рекурсия, в данном случае некие вызовы методов (Next?) внутри обработчика могут косвенно приводить к вызову этого же обработчика


        Leklerk



        Сообщ.
        #3

        ,
        09.01.13, 08:13

          Full Member

          ***

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

          Да, спасибо, так и оказалось, проблема решена.

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

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

          • Предыдущая тема
          • Delphi: Общие вопросы
          • Следующая тема

          Рейтинг@Mail.ru

          [ Script execution time: 0,0236 ]   [ 16 queries used ]   [ Generated: 4.06.23, 11:03 GMT ]  

          Понравилась статья? Поделить с друзьями:
        • Stable diffusion ошибка
        • Stability track опель астра ошибка
        • Stability track cadillac ошибка
        • Stabilitrak ошибка шевроле малибу
        • Stabilitrak ошибка опель astra