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

Вниз

Корректна ли такая конструкция ?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.078 c
2-1157830754
Димон
2006-09-09 23:39
2006.10.01
Объявление типов


5-1139491280
Awex
2006-02-09 16:21
2006.10.01
TEditControl


1-1156235494
BronOS
2006-08-22 12:31
2006.10.01
Метод DeleteRow


15-1157802940
Сергуня
2006-09-09 15:55
2006.10.01
Какой телефон купить


15-1157699105
hhhhh
2006-09-08 11:05
2006.10.01
Как будет грамотнее?