Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.014 c
1-1156153706
DelphiLexx
2006-08-21 13:48
2006.10.01
Создать отменить и восстановить для редактора


15-1157964847
Курдль
2006-09-11 12:54
2006.10.01
Вспоминаю ООП. С трудом :(


3-1154509680
yaral
2006-08-02 13:08
2006.10.01
Запрет перемещения по DataSet


15-1157996312
Nic
2006-09-11 21:38
2006.10.01
Аутосорсинг


4-1148483533
Raptoridzevv
2006-05-24 19:12
2006.10.01
Tchecklistbox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский