Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.15;
Скачать: CL | DM;

Вниз

Ошибка: "Project xxxx raised exception class..."   Найти похожие ветки 

 
Werewolf-Prankster   (2008-05-18 23:33) [0]

Делаю Сапер.
Код открытия пустых клеток:
Procedure TForm1.Open (x1,y1:integer); //Открытие клетки
var a,b:integer;
begin
 a:=x1;
 b:=y1;
 if (a<10) and (a>0) and (b<10) and (b>0) then
 begin
if (pole[a,b]=" ") then
  begin
   TLabel(FindComponent ("B"+inttostr(a)+inttostr(b))).visible:=false;
   open(a+1,b);
   open(a-1,b);
   open(a,b+1);
   open(a,b-1);
   //По диагонали
   open(a+1,b+1);
   open(a-1,b+1);
   open(a-1,b-1);
   open(a+1,b-1);
  end
  else
    if (pole[a,b]<>"©") and (pole[a,b]<>" ") then
     TLabel(FindComponent ("B"+inttostr(a)+inttostr(b))).visible:=false;
 end;      
end;


Но при приближении "уничтожения" кнопок к краю, выскакивает такая ошибка:http://img225.imageshack.us/img225/1844/errorib2.jpg

Не пойму в чем проблемма, помогите пожалуйста )


 
Сергей М. ©   (2008-05-18 23:54) [1]

Проблема в переполнении стека, вызванного бесконечным рекурсивном вызове процедуры.

Ищи ошибку в логике определения условия выхода из рекурсивного вызова


 
No_Dead ©   (2008-05-18 23:56) [2]

> Project xxxx

))) это ж какое имя должно быть%) ... секретное:)... наверно какое-то магическое слово


 
Werewolf-Prankster   (2008-05-19 00:01) [3]

2No_Dead
Нет, просто копирнул с Help"a, т.к. влом былопереписывать код ошибки.
ЗЫ Лежит скрином

2Сергей М.
Не подскажете что можно сделать?


 
Amoeba ©   (2008-05-19 00:39) [4]

Судя по приведенному коду интерфейс спроектирован крайне неудачно. Такие задачи решаются иначе. Для игрового поля сапера надо использовать DrawGrid. И никакого полчища Label"ов тогда не не понадобится.


 
guav ©   (2008-05-19 01:00) [5]

Ну допустим  a = 9 b = 5, из Open вызывается open(a+1,b); a = 10, b = 5 , оттуда open(a-1,b); снова a = 9, b = 5...


 
Германн ©   (2008-05-19 01:13) [6]


> Amoeba ©   (19.05.08 00:39) [4]
>
> Судя по приведенному коду интерфейс спроектирован крайне
> неудачно. Такие задачи решаются иначе. Для игрового поля
> сапера надо использовать DrawGrid. И никакого полчища Label"ов
> тогда не не понадобится.
>

Автору на это намекали, но он не внял.
http://delphimaster.net/view/2-1210427273/


 
Renegat   (2008-05-19 08:56) [7]

У меня однажды была ситуация, когда рекурсивная процедура не учитывала границы массива, и в итоге выходила за его пределы настолько, что рушила всю секцию данных :)


 
Werewolf-Prankster   (2008-05-19 14:50) [8]

2Германн
Чесно, большую чать этой темы увидел только что.
2All
У меня уже нет времени что либо переделывать. Можно ли как-то подправить этот код?


 
Palladin ©   (2008-05-19 14:54) [9]

Можно. Я даже вижу что ты не сделал для полного счастья.


 
Werewolf-Prankster   (2008-05-19 14:54) [10]

2Palladin
И что же? :)


 
Palladin ©   (2008-05-19 14:55) [11]


> Werewolf-Prankster   (19.05.08 14:54) [10]

а ты подумай... что значит условие if (pole[a,b]=" ") ?


 
Werewolf-Prankster   (2008-05-19 14:56) [12]

2Palladin это значит что поле без цифр и мин.


 
Сергей М. ©   (2008-05-19 14:57) [13]


> У меня уже нет времени что либо переделывать


А что за спешка ?


 
Werewolf-Prankster   (2008-05-19 14:58) [14]

2Сергей М.
Я только учусь, и если не сдам на этой неделе, не получу 5 ))

PS То что оговаривалось в другой теме, я не понял лишь по своей неосведомленности, т.к. визуальный режим Delphi мы начали учить 4-5 пар назад )


 
Palladin ©   (2008-05-19 14:59) [15]

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


 
Werewolf-Prankster   (2008-05-19 15:01) [16]

2Palladin
Я мельком слыщал про переменную Tag, она, насколько я понимаю, уникальна для каждого объекта. Как к ней обратиться?


 
Palladin ©   (2008-05-19 15:03) [17]

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


 
Сергей М. ©   (2008-05-19 15:04) [18]


> если не сдам на этой неделе, не получу 5


А раньше, когда времени было достаточно, ты чем был занят ?)


> визуальный режим Delphi мы начали учить 4-5 пар назад


Да он здесь собственно и ни причем.
Только не говори, что понятие рекурсии вам не преподавали)


 
Werewolf-Prankster   (2008-05-19 15:10) [19]

2Сергей М.
>>Только не говори, что понятие рекурсии вам не преподавали)
Нет, чесно. Я сейчас в техникуме, и на первом курсе мы в основном проходили только основные алгоритмы и принципы, начиная с блок схем. Так про рекурсию я слышу в первые.
>>А раньше, когда времени было достаточно, ты чем был занят ?)
А раньше мучался сам ))

2Palladin
:)
Вот попробовал с флагом, но теперь другая ошибка:

if (pole[a,b]=" ") and (TLabel(FindComponent ("Label"+inttostr(a)+inttostr(b))).tag=1) then
  begin
   TLabel(FindComponent ("B"+inttostr(a)+inttostr(b))).visible:=false;
   TLabel(FindComponent ("Label"+inttostr(a)+inttostr(b))).tag:=0;    
   open(a+1,b);
   open(a-1,b);
   open(a,b+1);
   open(a,b-1);
   //По диагонали
   open(a+1,b+1);
   open(a-1,b+1);
   open(a-1,b-1);
   open(a+1,b-1);
  end


http://img222.imageshack.us/img222/4467/errorwd4.gif


 
Werewolf-Prankster   (2008-05-19 15:22) [20]

Код мне писать не надо, просто объясните в чем ошибка, а я уже буду пробовать разобраться.


 
Palladin ©   (2008-05-19 16:33) [21]


> TLabel(FindComponent ("Label"+inttostr(a)+inttostr(b))).
> tag=1

то есть все tag у всех TLabel изначально выставленны в 1 я так понял

а текст ошибки приведи здесь, я изображение посмотреть не могу


 
Palladin ©   (2008-05-19 16:35) [22]

что то нифига не понял, то у тебя компоненты с B начинаются, то с Label...


 
Werewolf-Prankster   (2008-05-19 16:45) [23]

2Palladin
>то есть все tag у всех TLabel изначально выставленны в 1 я так понял

Правильно

>а текст ошибки приведи здесь, я изображение посмотреть не могу

"Project Saper.exe raised exception class EAccessViolation with message "AccessViolation at address 0043141B in module" "Saper.exe". Read of address 00000057". Process stopped..."


 
Werewolf-Prankster   (2008-05-19 16:47) [24]

B - Это поле лейблов выполняющих роль кнопки (не надо меня ругать за такую криворукость)
Label - Само поле


 
Werewolf-Prankster   (2008-05-19 16:48) [25]

Вот забыл, еще так пробовал:

if (pole[a,b]=" ") and (pole[a,b]<>"X") then
  begin
   TLabel(FindComponent ("B"+inttostr(a)+inttostr(b))).visible:=false;
   pole[a,b]:="X";
   open(a+1,b);
   open(a-1,b);
   open(a,b+1);
   open(a,b-1);
   //По диагонали
   open(a+1,b+1);
   open(a-1,b+1);
   open(a-1,b-1);
   open(a+1,b-1);
  end


 
Werewolf-Prankster   (2008-05-19 16:50) [26]

Хэх, будут меня ругать за дабл пост...

>B - Это поле лейблов выполняющих роль кнопки (не надо меня ругать за >такую криворукость)
>Label - Само поле
Label - Поле из мин и цифр.


 
ANB   (2008-05-19 17:52) [27]


> У меня уже нет времени что либо переделывать. Можно ли как-
> то подправить этот код?

Сапер пишется с нуля на гриде за 2 часа.
Лучше все переделать.


 
Werewolf-Prankster   (2008-05-19 18:05) [28]

Только есть одна большая проблемма. Я не знаю что такое грид


 
Palladin ©   (2008-05-19 18:07) [29]

TDrawGrid, наверное, если ANB не имел ввиду TEhDBGrid :) вкупе с ораклом и реализацией открытия минных полей через хранимку

вот это было бы круто :)


 
Werewolf-Prankster   (2008-05-19 19:40) [30]

2Palladin
Чесно говоря, ничего не понял из того что ты сказал )


 
Amoeba ©   (2008-05-19 19:49) [31]

Речь идет о TDrawGrid с его событиями OnDrawCell и OnClick, методом MouseToCell и рядом свойств.


 
Anatoly Podgoretsky ©   (2008-05-19 22:02) [32]


> Werewolf-Prankster   (19.05.08 16:45) [23]

Что то не создано.


 
ANB   (2008-05-20 09:42) [33]


> TEhDBGrid :) вкупе с ораклом и реализацией открытия минных
> полей через хранимку

Милин. Такая идея мне в голову не приходила :) Кистате, возможно, реализация была бы еще проще.


 
Werewolf-Prankster   (2008-05-20 17:56) [34]

Наконец-то решил проблемму. Оказалось, всего-то не доставало еще нескольких влагов )



Страницы: 1 вся ветка

Текущий архив: 2008.06.15;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.016 c
3-1200209257
WladL
2008-01-13 10:27
2008.06.15
FireBird перестал видеть новосозданные поля и таблицы


15-1209988486
БарЛог
2008-05-05 15:54
2008.06.15
Где хранить "корзину" в интернет-магазине?


15-1209447922
sql
2008-04-29 09:45
2008.06.15
ЦАП


15-1209843685
No_Dead
2008-05-03 23:41
2008.06.15
Посоветуйте матемаический форум


2-1211525320
Newb
2008-05-23 10:48
2008.06.15
Разбиение строки.