Welcome Guest Search | Active Topics | Members | Log In

Kasowanie podobiektu pointerowego - problem. Options · View
galin
Posted: Sunday, January 09, 2011 12:37:43 PM
Rank: Newbie

Joined: 1/9/2011
Posts: 2
Points: 6
Location: Warszawa
Witam,

Mam problem z usuwaniem podobiektu pointerowego...
Przyjmijmy że mam 2 klasy C_A i C_B
I instancje obiektów O_A i O_B

W klasie C_A mam np REFB: ref O_B [0..1] reverse REFA;
W klasie C_B mam np REFA: ref O_B [0..1] reverse REFB;

Tworzę dwa obiekty O_B1 i O_B2 oraz jeden O_A - na razie bez ustawiania pointerów.
Gdy przypiszę do obiektu A Pointer do któregoś obiektu B
self :<< REFB(ref (O_B1)) to tworzy się para pointerów dwukierunkowych.
gdy chcę zmienić przypisanie wywołuję:
self.REFB:=(ref (O_B2))
I to wszystko ładnie działa ... po wywołaniu ostatniej komendy z obiektu O_B1 usuwany
jest podobiekt O_B1.REFA a jest tworzony nowy podobiekt O_B2.REFA

Ale co zrobić gdy chcę wogóle usunąć taki podobiekt pointerowy?
Chcę aby O_A nie był powiązany ani z O_B1 i O_B2.

W klasie C_A definiuję metodę DelB(OB:O_B)
{
// Próbowałem:
delete (O_B where ID=OB.ID).REFA;
//oraz
delete (self.REFB as x) where (x=ref(OB));
}
Oba warianty wywalaja mi mniej więcej takie błądy:
*** Runtime error : (runtime error) Cardinality error for 'REFA[0..0]' Unable to delete an object. Object is obligatory. in procedure 'DelB' Line:
171 column: 13 (delete(((((O_B) where ((((deref(ID))) = ((deref(((OB) . (ID))))))))) . (REFA)))) for opcode del

*** Runtime error : (runtime error) Cardinality error for 'REFA[0..0]' Unable to delete an object. Object is obligatory. in procedure 'DelB' Line:
173 column: 6 (delete(((((self) . (REFB))) where ((((deref(REFB))) = ((ref(OB)))))))) for opcode de

Pytanie... jak zatem pozbyć się takiego pointera ??

Pozdrawiam i mam nadzieję, że umieściłem mojego posta w dobrym miejscu.
Marcin Galiński


EDITED 17:00 09-01-2011
Wykonałem dodatkowe testy...
Wygląda na to, że problem ten istnieje jeśli się użyje wskaźników dwukierunkowych.
W momencie gdy przepisałem kod tak aby nie używać wskaźników dwukierunkowych to nie ma problemu aby kasować podobiekt pointerowy.
Oczywiście trzeba pamiętać wtedy aby kasować podobiekty pointerowe po obu stronach - ale jest to niewielki koszt za umożliwienie kasowania :)

Ewentualne komentarze mile widziane.



subieta
Posted: Sunday, January 09, 2011 12:52:47 PM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
Obawiam się, że to jest stary problem z elipsą, która referencję do pointera zamienia na referencję do obiektu. Nie wiem kto wpadł na ten genialny pomysł z elipsą w tym miejscu, ale jedno jest pewne tak czy inaczej trzeba się z tego wycofać. Nie jest jednak wykluczone, ze chodzi o coś innego, np. wadliwą dynamiczna kontrolę typologiczną. Panie Radku, ma pan pomysł co to może być?
galin
Posted: Saturday, January 15, 2011 6:45:16 PM
Rank: Newbie

Joined: 1/9/2011
Posts: 2
Points: 6
Location: Warszawa
Chmmm tym razem mam kolejny problem z którego nie wiem jak wybrnąć.

Obiekt klasy A (O_A) ma zbiór Referencji do obiektów klasy B (Ref_B o kardynalności [0..*]
(ref O_B, ref O_B1)

będąc w obiekcie klasy B (O_B (który posiada referencję do obiektu klasy A (ref O_A) )
chciałbym usunąć jedną z referencji z O_A - tą która wskazuje na O_B.
Nie mam pojęcia jak to zrobić...
Takie coś:
me:Klasa_B;
me:=self;
it : Klasa_A;
it:=me.Ref_A;
delete ((it.Ref_B) where (it.Ref_B=ref(me)));
działa jeśli instnieje tylko jeden obiekt O_A.Ref_B.
jeśli są już 2 to dostaję runtime error ODRY:

*** Runtime error : (runtime error) single value required, found: bag (2) ->bag(&161670 &161870 )<- in procedure 'DEL' Line: 250 column: 40 ((de
ref(((it) . (Ref_B))))) for opcode single

Założenie jest takie że w zbiorze referencji Ref_B obiektu A referencja do jakiegokolwiek obiektu B może wystąpić tylko raz.
Ale jak wybrać tą właściwą referencję do skasowania?
Bardzo proszę o pomoc.


radamus
Posted: Monday, January 17, 2011 8:23:39 AM

Rank: Advanced Member

Joined: 1/25/2005
Posts: 325
Points: 108
Location: Łódź
subieta wrote:
Obawiam się, że to jest stary problem z elipsą, która referencję do pointera zamienia na referencję do obiektu. Nie wiem kto wpadł na ten genialny pomysł z elipsą w tym miejscu, ale jedno jest pewne tak czy inaczej trzeba się z tego wycofać. Nie jest jednak wykluczone, ze chodzi o coś innego, np. wadliwą dynamiczna kontrolę typologiczną. Panie Radku, ma pan pomysł co to może być?

Stawiam jednak na problem na poziomie dynamicznej kontroli. Błąd dotyczy obiektu pointerowego (więc o elipsie nie może być mowy). Runtime stwierdza, że ma do czynienia z licznością [1..1] (mimo tego że zadeklarowana jest [0..1]) i nie pozwala usunąć pointera. Musiałbym to przetestować, żeby coś więcej na ten temat powiedzieć.
Users browsing this topic
Guest


Forum Jump
You cannot post new topics in this forum.
You cannot reply to topics in this forum.
You cannot delete your posts in this forum.
You cannot edit your posts in this forum.
You cannot create polls in this forum.
You cannot vote in polls in this forum.

Main Forum RSS : RSS

Powered by Yet Another Forum.net version 1.9.1.6 (NET v2.0) - 11/14/2007
Copyright © 2003-2006 Yet Another Forum.net. All rights reserved.
This page was generated in 0.081 seconds.