Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизКорректна ли такая конструкция ? Найти похожие ветки
← →
PPartition (2006-09-07 01:22) [0]function Partition.Insert(WW, HH : Single): PPartition;
begin
Result := @Self;
end;
Потому, что иногда получаю Вайолэйшн Аксесс в такой строчке, причём только когда выполняю программу пошагово:
k1 := Part^.X;
Если же не пошагово, то X может оказаться нулевым, хотя таковым быть не должен.
← →
Zeqfreed © (2006-09-07 01:25) [1]А зачем тебе использовать указатель на указатель?
← →
PPartition (2006-09-07 01:28) [2]Код не мой. Я только прикручиваю к своей задаче не особо вникая как там конкретно чего устроено.
← →
PPartition (2006-09-07 01:30) [3]На самом деле там:
if TraLaLa then
Result := @Self;
else
Result := L^.Insert(WW, HH);
и т. д.
← →
PPartition (2006-09-07 01:32) [4]Рекурсия в общем.
← →
Германн © (2006-09-07 02:21) [5]
> PPartition (07.09.06 01:28) [2]
>
> Код не мой. Я только прикручиваю к своей задаче не особо
> вникая как там конкретно чего устроено.
> <Цитата>
>
> PPartition (07.09.06 01:30) [3]
>
> На самом деле там:
>
> if TraLaLa then
> Result := @Self;
> else
> Result := L^.Insert(WW, HH);
>
> и т. д.
> <Цитата>
>
> PPartition (07.09.06 01:32) [4]
>
> Рекурсия в общем.
>
Х.З. в общем.
Перестань "пороть чушь", она не виновата! :-)
Ну про "пальцы" я молчу. :-)
Сформулируй вопрос грамотно! С приведением реального исходного текста программы, поелику это возможно! :-)
← →
PPartition (2006-09-07 03:15) [6]Германн, а разговаривать вежливо?
unit Partitions;
interface
type
PPartition = ^Partition;
Partition = Class
X,Y,W,H: single;
L, R: PPartition;
TexInd: integer;
Children: boolean;
Constructor Create(XX,YY,WW,HH: single);
Function Insert(WW,HH: single): PPartition;
Destructor Free;
end;
const
Seam = 2;
implementation
Destructor Partition.Free;
begin
if L <> nil then L^.Free;
if R <> nil then R^.Free;
dispose(L);
dispose(R);
W := 0;
H := 0;
X := 0;
Y := 0;
TexInd := 0;
Children := false;
L := Nil;
R := Nil;
end;
Constructor Partition.Create(XX,YY,WW,HH: single);
begin
X := XX;
Y := YY;
W := WW;
H := HH;
Children := false;
L := Nil;
R := Nil;
TexInd := 0;
end;
Function Partition.Insert(WW,HH:single): PPartition;
Var NewNode: PPartition;
dw, dh: single;
begin
Result := Nil;
try
if Children = True then
begin
NewNode := L^.Insert(WW,HH);
if NewNode = nil then
begin
NewNode := R^.Insert(WW,HH);
end;
Result := NewNode;
end
else
begin
if TexInd = 0 then
if (WW <= (W)) and (HH <= H) then
begin
if (WW = (W)) and (HH = H) then
begin
Result := @Self;
Exit;
end;
New(L);
New(R);
dw := (W) - WW;
dh := H - HH;
if dw > dh then
begin
L^ := Partition.Create(X, Y, WW, H);
R^ := Partition.Create(X+Ww+1, Y, (W)-WW-1, H);
Children := true;
end
else
begin
L^ := Partition.Create(X, Y, (W), HH);
R^ := Partition.Create(X, Y+HH+1, (W), H-HH-1);
Children := true;
end;
Result := L^.Insert(WW,HH);
end;
end;
except
end;
end;
end.
← →
Mike Petrichenko (2006-09-07 04:35) [7]Кто так пишет?
Из серии: "Указатель на таблицу указателей на функции...".
Не ну бред...
А глюк происходит скорее всего вот тут
if Children = True then
begin
NewNode := L^.Insert(WW,HH);
if NewNode = nil then
begin
NewNode := R^.Insert(WW,HH);
end;
Result := NewNode;
end
А не в @Self
Потому как после второго Insert NewNode все таки может быть NIL
← →
PPartition (2006-09-07 06:54) [8]Возвращение nil вполне допустимо. Происходит когда таблица переполнена.
← →
MBo © (2006-09-07 07:21) [9]>PPartition
Приведенный код наводит на мысли, что ты только что перешел со старого Паскаля, однако в Дельфи работать нужно иначе.
Объекты в Дельфи - уже сами по себе указатели, и дополнительные указатели на классы объявлять и использовать, вкупе с ^ и @, не нужно.
Кроме того, приведенный код вполне можно реализовать с помощью записей, поскольку никаких преимуществ ООП (объектно- ориент. прогр) здесь не используется.
← →
PPartition (2006-09-07 07:31) [10]Повторюсь : Код не мой. Я только прикручиваю к своей задаче не особо вникая как там конкретно чего устроено.
Что именно тут надо поправить, чтобы не возникало ошибки?
← →
Loginov Dmitry © (2006-09-07 07:53) [11]До боли знакомый стиль. У меня на работе пол-проекта в таком стиле сделано.
Сам же работаю по принципу: работает - не трожжжж!
← →
Loginov Dmitry © (2006-09-07 08:07) [12]> PPartition (07.09.06 03:15) [6]
Destructor Free;
меняй на
destructor Destroy; override;
или же в конце Free вызови
inherited Free;
Кроме того в деструкторе нужны фактически только первые 4 строки. Остальные - лишние тормоза - можешь смело удалить.
В конструкторе нужны только первые 4 строки. Остальные можешь удалить, т.к. они ничего не меняют. Также по-хорошему в начале конструкторе не помешал бы вызов (inherited Create) (чаще всего так пишут, хотя для непосредственного потомка класса TObject в необходимости этого вызова сомневаюсь)
> try
> if Children = True then
> begin
> NewNode := L^.Insert(WW,HH);
>
> if NewNode = nil then
> begin
> NewNode := R^.Insert(WW,HH);
> end;
> Result := NewNode;
> end
И это еще и работает? Это же беcконечная рекурсия...
Также убери оператор try..except..end из метода Insert. В данном случае это совершенно дилетанская конструкция. Зачем маскировать исключения, когда в их причинах лучше разобраться.
← →
PPartition (2006-09-09 01:19) [13]
> Loginov Dmitry © (07.09.06 08:07) [12]
>
> > PPartition (07.09.06 03:15) [6]
>
> Destructor Free;
> меняй на
> destructor Destroy; override;
Дело в том, что ошибка возникает до этого.
> Также по-хорошему в начале конструкторе не помешал бы вызов
> (inherited Create) (чаще всего так пишут, хотя для непосредственного
> потомка класса TObject в необходимости этого вызова сомневаюсь)
Да. Она не нужна.
Этот вызов просто возвращается ни с чем.
> И это еще и работает? Это же беcконечная рекурсия...
Работает. Выход из рекурсии как раз в строке :
Result := @Self;
> Также убери оператор try..except..end из метода Insert.
Убрал - ничего не изменилось.
← →
PPartition (2006-09-09 01:24) [14]Я обнаружил, что в строке
Result := @Self;
В Result пишутся правильные данные.
А после того, как из функции осуществляется выход, в её результате, иногда оказываются совсем другие данные. Чаще всего просто нули и nil. То есть в момент выхода они как то непонятно теряются и обнуляются.
Почему так?
И можно ли вернуть указатель на Self каким нибудь другим способом?
← →
Германн © (2006-09-09 01:42) [15]
> PPartition (09.09.06 01:24) [14]
>
> Я обнаружил, что в строке
> Result := @Self;
> В Result пишутся правильные данные.
>
> А после того, как из функции осуществляется выход, в её
> результате, иногда оказываются совсем другие данные. Чаще
> всего просто нули и nil. То есть в момент выхода они как
> то непонятно теряются и обнуляются.
>
> Почему так?
> И можно ли вернуть указатель на Self каким нибудь другим
> способом?
А что ты подразумеваешь под Self?
← →
Германн © (2006-09-09 01:50) [16]И ещё раз напомню замечания MBO:
> MBo © (07.09.06 07:21) [9]
>
> >PPartition
> Приведенный код наводит на мысли, что ты только что перешел
> со старого Паскаля, однако в Дельфи работать нужно иначе.
>
>
> Объекты в Дельфи - уже сами по себе указатели, и дополнительные
> указатели на классы объявлять и использовать, вкупе с ^
> и @, не нужно.
>
← →
palva © (2006-09-09 01:51) [17]Result := @Self; - вполне корректная конструкция.
> И можно ли вернуть указатель на Self каким нибудь другим способом?
Можно вернуть результат оператором присваивания, где слева стоит имя функции. Но если у вас получатся разные результаты, то, наверно, нужно выкинуть компилятор.
← →
PPartition (2006-09-09 02:47) [18]> нужно выкинуть компилятор.
Напишите жалобу в Борланд, если тебе больше нечего ответить.
← →
Loginov Dmitry © (2006-09-09 09:54) [19]> Работает. Выход из рекурсии как раз в строке :
> Result := @Self;
Да тут я вижу нереход не с паскаля, а с С++.
НО! Result в Object Pascal не прерывает выполнение процедуры. Поэтому всеже рекурсия. А критерием выхода из рекурсии, я полагаю, является генерация исключения переполнения стека, которая успешно отлавливается оператором try..except.
← →
Loginov Dmitry © (2006-09-09 09:56) [20]Все же решил на код посмотреть
> begin
> Result := @Self;
> Exit;
> end;
А вы пишите
> Работает. Выход из рекурсии как раз в строке :
> Result := @Self;
Зачем так обманывать? Выход из рекурсии как раз в следующей строке.
← →
PPartition (2006-09-10 01:37) [21]
> Loginov Dmitry © (09.09.06 09:56) [20]
> Все же решил на код посмотреть
То есть даём советы не глядя на код?
> Зачем так обманывать? Выход из рекурсии как раз в следующей
> строке.
Да ну? Что, серьёзно?
* * *
В общем я избавился от чёртовой конструкции Result := @Self;, и всё стало работать более менее нормально.
Вопрос можно считать закрытым.
← →
Германн © (2006-09-10 02:01) [22]
> В общем я избавился от чёртовой конструкции Result := @Self;
> , и всё стало работать более менее нормально.
>
> Вопрос можно считать закрытым.
>
Но ты так и не ответил на Германн © (09.09.06 01:42) [15]
← →
Loginov Dmitry © (2006-09-10 10:30) [23]> То есть даём советы не глядя на код?
Я до этого смотрел на данный код раз двадцать. Но весь так и не запомнил.
> В общем я избавился от чёртовой конструкции Result := @Self;
> , и всё стало работать более менее нормально.
А это как это "более менее нормально"?
Забавно! Программа по принципу лохотрона. Седня работает, завтра нет.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.012 c