Форум: "Начинающим";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];
ВнизОшибка: "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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.007 c