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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка переполнения стэка 
:(
    Опции темы
K17rus
Дата 1.12.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть две формы. Одна основная (А), другая (Б) для ввода вызывается. При первом вызове (Б) всё нормально проходит, при втором в одной из функций (процедур) модуля стэк в любом случае переполняется. Чего по-идее быть не должно вообще. "С чем это могло быть вызвано?"(с)

Это сообщение отредактировал(а) K17rus - 1.12.2008, 18:57
PM MAIL   Вверх
Exai1e
Дата 1.12.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Добавлено через 4 минуты
и покажи что у тебя в fromCreateБ или formShowБ происходит


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
K17rus
Дата 1.12.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Код

procedure TForm4.Edit1Change(Sender: TObject);
var j: integer;
    str: string[5];
begin
 for j:=1 to length(Edit1.Text) do
 if (Edit1.Text[j]<>'0')and
    (Edit1.Text[j]<>'1')and
    (Edit1.Text[j]<>'2')and
    (Edit1.Text[j]<>'3')and
    (Edit1.Text[j]<>'4')and
    (Edit1.Text[j]<>'5')and
    (Edit1.Text[j]<>'6')and
    (Edit1.Text[j]<>'7')and
    (Edit1.Text[j]<>'8')and
    (Edit1.Text[j]<>'9') then begin
                               str:=Edit1.Text;
                               delete(str,j,1);
                               Edit1.Text:=str;
                              end;
if MainWindow.Turnir.TOT=valleyball then
 begin
   if (Edit1.Text<>'') and
    (Edit1.Text<>'0')and
    (Edit1.Text<>'1')and
    (Edit1.Text<>'2')and
    (Edit1.Text<>'3') then Edit1.Clear;
   If (Edit2.Text=Edit1.Text) then Edit2.Clear;
 end;
end;



procedure TForm4.Button1Click(Sender: TObject);
var Code,j:integer;
     pt:pspisok;
begin
if (Combobox1.Text='') or
   (Combobox2.Text='') or
   (Edit1.text='') or
   (Edit2.Text='') then Application.MessageBox('Не все поля команд/партий заполнены','Внимание',mb_Ok)
                   else
begin
 val(Edit1.Text,FirstN,Code);
 val(Edit2.Text,SecondN,Code);
 if MainWindow.Turnir.TOT=football
   then
    begin
     if (Combobox1.Text='') or (Combobox2.Text='') or (Edit1.text='') or (Edit2.Text='') then Application.MessageBox('Не все поля команд/голов заполнены','Внимание',mb_Ok)
           else
           begin
            pt:=MainWindow.Turnir.First;
            for j:=1 to MainWindow.Turnir.NumOfTeams do begin
                                                         if ComboBox1.Text=(pt^.team^.name+' '+'('+pt^.team^.city+')') then pt^.team.AddResult(FirstN,SecondN);
                                                         if ComboBox2.Text=(pt^.team^.name+' '+'('+pt^.team^.city+')') then pt^.team.AddResult(SecondN,FirstN);
                                                         pt:=pt^.next;
                                                        end;
            MainWindow.Turnir.Sort;
            MainWindow.Form3.Image1.canvas.Rectangle(-200,-200,10000,10000);
            MainWindow.Turnir.DrawTable(MainWindow.Form3.Image1,MainWindow.ScrollPos1);
            form3.Show;
            Form4.Destroy;
           end;
    end;
 if MainWindow.Turnir.TOT=valleyball then
                 begin
                  Application.MessageBox('Введите счёт партий','Внимание',mb_Ok);
                  Application.CreateForm(TForm6,Form6);
                  ValleyScoreLine.Form6.Show;
                  ValleyScoreLine.StartWork();
                 end;


end;
end;


Это сообщение отредактировал(а) K17rus - 1.12.2008, 21:06
PM MAIL   Вверх
Exai1e
Дата 1.12.2008, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выдели весь код и нажми кнопочку "Код" чтобы заключить код в тэги, а то с таким форматированием и кач-вом  smile  smile  smile , да еще и без подсветки...
Код

            MainWindow.Form3.Image1.canvas.Rectangle(-200,-200,10000,10000);

это нормально ?...

так при появлении какой формы у тебя ошибка ? form6, form3 ? 


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
K17rus
Дата 1.12.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ошибка не при появлении формы, а при работе в ней. В 4ой, где показанные процедуры находятся. Т.е. при прохождении какого-то из операторов появляется ошибка "stack overflow"
PM MAIL   Вверх
Christoph
Дата 1.12.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кинь проект


--------------------
user posted image
PM MAIL ICQ   Вверх
K17rus
Дата 1.12.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Christoph, через что кинуть?
PM MAIL   Вверх
Exai1e
Дата 1.12.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



выложи например на ifolder.ru
или атач к форуму, 
"Вы можете загрузить файл в это сообщение.
Максимальный размер файла: 1мб"
нажми на кнопку "Обзор" и прикрепи фаил


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
K17rus
Дата 1.12.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Форма (А) - MainWindow
Форма (Б) - NewResult

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  ________.rar 448,23 Kb
PM MAIL   Вверх
Christoph
Дата 2.12.2008, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ошибка в юните CupInfo 

Код

procedure TForm2.Button3Click(Sender: TObject);
begin
 CupName:=Edit4.Text;

 MainWindow.Turnir:=TTour.Create(MainWindow.TOT1,CupName,n,MasOfTeams);


 Form2.Hide;
 MainWindow.Form3.Show;
 if MainWindow.Turnir.TOT=football then MainWindow.Form3.Label2.Caption:='ГЗ - голов забито, ГП - голов пропущено, РГ- разница голов'
                                   else MainWindow.Form3.Label2.Caption:='ПВ - партий выиграно, ПП - партий проиграно, РП - разница партий, МВ - мячей выиграно, МП - мячей проиграно, РМ - разница мячей';
 MainWindow.Form3.Image1.canvas.Rectangle(-200,-200,10000,10000);
 MainWindow.Turnir.DrawTable(MainWindow.Form3.Image1,0);
 If n<=7 then MainWindow.Form3.ScrollBar1.SetParams(0,0,1)
         else MainWindow.Form3.ScrollBar1.SetParams(0,0,70+n*45-MainWindow.Form3.Image1.Height);
 if n<=7 then MainWindow.Form3.ScrollBar1.Enabled:=false;
 form2.Destroy;
end;


Вместо form2.Destroy; Напиши

Form2.Close;

Так вроде прошелся по проге, вроде работает без глюков, проверь....




--------------------
user posted image
PM MAIL ICQ   Вверх
THandle
Дата 2.12.2008, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



K17rus, я не понял что надо нажать чтобы вызывать переполнение стека.


Цитата(K17rus @  1.12.2008,  19:25 Найти цитируемый пост)
 if (Edit1.Text[j]<>'0')and
    (Edit1.Text[j]<>'1')and
    (Edit1.Text[j]<>'2')and
    (Edit1.Text[j]<>'3')and
    (Edit1.Text[j]<>'4')and
    (Edit1.Text[j]<>'5')and
    (Edit1.Text[j]<>'6')and
    (Edit1.Text[j]<>'7')and
    (Edit1.Text[j]<>'8')and
    (Edit1.Text[j]<>'9') then


А не легче ли:

Код

if not (Edit2.Text[j] in ['0'..'9']) then


???
Да и вообще многое в коде можно улучшить...
PM   Вверх
K17rus
Дата 2.12.2008, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Насчёт проверки на вхождения в множество и close учту. А прога вылетает, если создать волейбольное соревнование и пару-тройку раз ввести результаты матчей.

Это сообщение отредактировал(а) K17rus - 2.12.2008, 01:35
PM MAIL   Вверх
THandle
Дата 2.12.2008, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



K17rus, 

Код

procedure TForm4.Edit1Change(Sender: TObject);
var j: integer;
    str: string[5];
begin

 for j:=1 to length(Edit1.Text) do
 if (Edit1.Text[j]<>'0')and
    (Edit1.Text[j]<>'1')and
    (Edit1.Text[j]<>'2')and
    (Edit1.Text[j]<>'3')and
    (Edit1.Text[j]<>'4')and
    (Edit1.Text[j]<>'5')and
    (Edit1.Text[j]<>'6')and
    (Edit1.Text[j]<>'7')and
    (Edit1.Text[j]<>'8')and
    (Edit1.Text[j]<>'9') then begin
                               str:=Edit1.Text;
                               delete(str,j,1);
                               Edit1.Text:=str;
                              end;
if MainWindow.Turnir.TOT=valleyball then
 begin
   if (Edit1.Text<>'') and
    (Edit1.Text<>'0')and
    (Edit1.Text<>'1')and
    (Edit1.Text<>'2')and
    (Edit1.Text<>'3') then Edit1.Clear;
   If (Edit2.Text=Edit1.Text) then Edit2.Clear;
 end;
end;


Чему по твоему будет равна длина строки в Edit1 при вводе первой буквы и возникновении события OnChange? smile
Я отвечу - она будет равна НУЛЮ.

Ну и соответственно цикл будет выполняться ой-ой-ой сколько раз. Это первое на что я наткнулся.

Дальше отлавливай сам подобные баги. Кстати то, что у тебя везде стандартные и одинаковые имена контролов тоже не очень хорошо...
PM   Вверх
K17rus
Дата 2.12.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я смотрел в отладке, при OnChange строка в Едите уже ненулевая, и я сколько ни смотрел - ничего не циклилось.


На зато заменив 

Код

 if (Edit1.Text[j]<>'0')and
    (Edit1.Text[j]<>'1')and
    (Edit1.Text[j]<>'2')and
    (Edit1.Text[j]<>'3')and
    (Edit1.Text[j]<>'4')and
    (Edit1.Text[j]<>'5')and
    (Edit1.Text[j]<>'6')and
    (Edit1.Text[j]<>'7')and
    (Edit1.Text[j]<>'8')and
    (Edit1.Text[j]<>'9') then


на
Код

if not (Edit1.Text[j] in ['0'..'9']) then


во всех местах, я устал тестить прогу, она не вылетает) Ну и клоуз сделал там, вобщем если всё же будет вылетать, я напишу, а так спасибо большое!


Это сообщение отредактировал(а) K17rus - 2.12.2008, 22:35
PM MAIL   Вверх
THandle
Дата 2.12.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



K17rus, кстати она у меня еще при ааоде названия команды и нажатии кнопки далее вылетела с ошибкой Abstract Error. В Delphi 7.


Цитата(K17rus @  2.12.2008,  21:31 Найти цитируемый пост)
и я сколько ни смотрел - ничего не циклилось. 


А у меня вот не всегда. Смотри, ошибка с этим связана.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.