SIGSEGV na tworzeniu obiektu.

0

Mam problem, gdyż po zakończeniu konstruktora debugger ustawia się na end; i jak chce przejść dalej to wali mi SIGSEGV... Wiem, że gdzieś cieknie, ale nie wiem gdzie ... Oto kot konstruktora.

 constructor TFBConnection.Create(DataBaseS: TDataBase);
begin
  FConnection:=TIBConnection.Create(nil);
  SetDataBase(DataBaseS);
  FConnection.Transaction := TSQLTransaction.Create(nil);
  FConnection.Connected:=True;
  SetAvailable(True);
end;

a tworzenie obiektu :

constructor TFBConnectionCollection.Create(DataBaseD: TDataBase);
var
  pCon:p_TFBConnection;
begin
  Connections:=TList.Create;
  New(pCon);
  pCon^.Create(DataBaseD);
  Connections.Add(pCon);
end; 

Możecie podpowiedzieć gdzie jest błąd??

0

A nie powinno być inherited?

0

No też tak myślałem, ale przy wywołaniu inherited na początku konstruktora krzyczy

dbobject.pas(150,12) Error: Wrong number of parameters specified for call to "Create"

Zarówno jak wywołuję samo inherited czy z Create. Moja klasa dziedziczy po TObject więc teoretycznie nie powinno się wywalać.

__edycja

Jednak nie o to chodzi - podziedziczyłem po TComponent a nie TObject tym razem, udało mi się wywołać konstruktor klasy bazowej a nadal SIGSEGV...

0

No ale co to za dziwne wywołanie konstruktora tej samej klasy w jej własnym konstruktorze

FConnection:=TIBConnection.Create(nil);

Po mojemu to jest coś nie tak:

 constructor TFBConnection.Create(DataBaseS: TDataBase);
begin
  inherited; //ewentualnie Create z parametrem
  SetDataBase(DataBaseS);
  Self.Transaction := TSQLTransaction.Create(nil);
  Self.Connected:=True;
  SetAvailable(True);
end;

Oczywiście może być bez Self bo domyślnie wiadomo że chodzi o właściwość należącą do tej klasy.

0

Ale FConnection to TIBConnection a moja klasa to TFBConnection. Biorę FConnection i dodaje kolejne atrybuty, czyli FConnection to pole więc muszę je utworzyć.

TFBConnection = class(TObject)
    private
      FConnection: TIBConnection;
      FAvailable: Boolean;
      { Available }
      function GetConnection: TIBConnection;
      function GetDataBase: TDataBase;
      procedure SetAvailable(Value: Boolean);
      function GetAvailable: Boolean;
      { Transaction }
      procedure SetTransaction(Value: TSQLTransaction);
      function GetTransaction():TSQLTransaction;
      { DataBase }
      procedure SetDataBase(Value: TDatabase);
      function GetDatabBase():TDataBase;
   public
      property Available: Boolean read GetAvailable write SetAvailable;
      property DataBase: TDataBase read GetDataBase write SetDataBase;
      property Transaction: TSQLTransaction read GetTransaction write SetTransaction;
      property Connection: TIBConnection read GetConnection;
      constructor Create(DataBaseS: TDataBase);
  end;   
 
0

A no tak jedna literka nie zauważyłem no to w takim razie nie wiem o co jeszcze może chodzić musiałbym widzieć cały kod tej klasy to może bym coś wymyślił.

2

Tu masz babola

pCon^.Create(DataBaseD);

zmień na:

pCon^:= TFBConnection.Create(DataBaseD);

bo (przynajmniej w Delphi) tak jak miałeś nie przejdzie.

Poza tym zamiast TList lepiej było użyć TObjectList .

1

@serge - a od kiedy to konstruktor powinien wyglądać tak, jak Twój? :

constructor TFBConnection.Create(DataBaseS: TDataBase);
begin
  FConnection:=TIBConnection.Create(nil);

Co to w ogóle ma znaczyć? Polecam więc zapoznać się z kursem programowania obiektowego, bo jeśli tworzysz klasę na bazie innej (w sumie zawsze tak się dzieje, bo każda dziedziczy przynajmniej z TObject) to w konstruktorze należy wywołać konstruktor bazowej albo przez samo słówko Inherited, albo dodając nazwę konstruktora (ew. plus parametry):

constructor TFBConnection.Create(DataBaseS: TDataBase);
begin
  inherited Create(); // i gotowe
</del> ____

dbobject.pas(150,12) Error: Wrong number of parameters specified for call to "Create"

Zarówno jak wywołuję samo inherited czy z Create.

W tym wypadku bez względu na to, czy wpiszesz samo słowo Inherited czy dodasz jeszcze Create - i tak nie zgadza się ilość argumentów wywoływanego konstruktora; Wciskając Shift+Ctrl+Space pokaże Ci się dymek z liczbą parametrów, a skoro ich liczba się nie zgadza, to w podpowiedzi zobaczysz ich listę: ilość, nazwy i typy; Mogłeś od razu się zorientować, że skoro nie zgadza się liczba parametrów to znaczy, że wywoływany konstruktor nie pochodzi z klasy TObject, bo tamten w ogóle nie posiada argumentów; Następnym razem najpierw przeanalizuj kod, a później szukaj pomocy na forum;


Kolejna sprawa to tworzenie instancji klasy:

var
  pCon:p_TFBConnection;

Po co używasz osobnego typu będącego wskaźnikiem (sądząc po nazwie typu) na klasę? Przecież zmienna przechowująca referencję do klasy de fact jest sama w sobie wskaźnikiem; Niepotrzebnie kombinujesz, przez co komplikujesz sobie sprawę i generujesz niepotrzebne błędy; Jeśli już koniecznie chcesz mieć ten "jawny" wskaźnik na klasę to twórz jej instancję tak, jak pokazał @kAzek, czyli dodaj operator ^;

Więc wniosek - czytaj komunikaty kompilacji, bo one mówią wszystko na temat zaistniałych błędów; Do tego szukaj informacji w Google i przede wszystkim dokumentacjach, bo jest tam naprawdę sporo opisane i wytłumaczone; Forum traktuj jako ostateczność;

EDIT: Z uwagi na moją złą analizę kodu, skreślam zbędną treść posta; Reszta, która zawiera wskazówki dotyczące czytania komunikatów kompilacji, podglądania listy parametrów, zaprzestania kombinacji ze wskaźnikami do instancji klas, czytania kursów oraz szukania informacji w sieci jest aktualna.

0

Może próbowałeś stworzyć singletona?

0

Nie, nie próbowałem zrobić Singletona ( chyba ;p ). Próbuję i to z sukcesami zrobić Connecion Pooling

Co do błędu to rozwiązaniem jest ostatni post kAzka. Dzięki wielki. Niestety @Furious Programming chyba wstałeś lewą nogą i chciałeś się wyżyć na mnie przez swój sarkazm ;p Wszystkie twoje zarzuty są kiepskie bo wiedziałem co się dzieje, i pisałem o tym wcześniej, a i twoje rozwiązanie nic nie pomogło, i w zasadzie jest błędne, zresztą chyba sam nie doczytałeś, że ja nie wywołuję konstruktora w konstruktorze, a po prostu tworzę pole ... Mam nadzieję, że ulżyło Ci, jednak apeluję, o inny stosunek do userów- a wiem, że potrafisz być pomocny i stosownie się zachowywać, a moim zdaniem przesadziłeś dziś. Fakt, nie jeszcze problemy ze zrozumieniem pewnych konstrukcji w pascalu, ale to forum mi pomaga, i nie zamierzam rezygnować z tej drogi nauki bo przynosi rezultaty.

Co do wskaźników - na forum tutaj ktoś mi polecił taki sposób, ale fakt - twój jest bardziej czytelny i też taki zastosowałem, troszkę poczytałem o wskaźnikach w pascalu - za to dziękuję.

@kAzek - dzięki wielkie, trafiłeś w sedno.

0

Niestety @Furious Programming chyba wstałeś lewą nogą i chciałeś się wyżyć na mnie przez swój sarkazm ;p

Nigdy nie wstaję lewą nogą, bo feng shui w mieszkaniu na to nie zezwala;

Wszystkie twoje zarzuty są kiepskie bo wiedziałem co się dzieje, i pisałem o tym wcześniej, a i twoje rozwiązanie nic nie pomogło, i w zasadzie jest błędne, zresztą chyba sam nie doczytałeś, że ja nie wywołuję konstruktora w konstruktorze, a po prostu tworzę pole ...

Faktycznie, nie zauważyłem wcześniej, że to o pole chodzi, więc zwracam honor - mój post w tej sytuacji nic nie wnosi; Mimo wszystko mój post ma po części sens, bo trafnie zwróciłem Ci uwagę żebyś czytał i starał się zrozumieć komunikaty kompilacji; Poza tym trafna jest uwaga, że pasowało by przeglądnąć kurs OOP, bo jak @kAzek zauważył - źle wywoływałeś konstruktor klasy;

Mam nadzieję, że ulżyło Ci, jednak apeluję, o inny stosunek do userów- a wiem, że potrafisz być pomocny i stosownie się zachowywać, a moim zdaniem przesadziłeś dziś.

Przepraszam bardzo - w czym przesadziłem? Uraziłem Cię tym, że zaapelowałem o czytanie komunikatów, o szukanie informacji w sieci? Czy może stwierdzeniem, że kombinujesz (z uwagi na błędną analizę nie ma to znaczenia)? Wybacz, ale nie czuję się winny domniemanego ubliżania ani Tobie, ani innym użytkownikom;

Fakt, nie jeszcze problemy ze zrozumieniem pewnych konstrukcji w pascalu, ale to forum mi pomaga, i nie zamierzam rezygnować z tej drogi nauki bo przynosi rezultaty.

I nie zniechęcaj się, bo nie masz powodu; Gdybym od początku zakapował, że próbujesz stworzyć pole - nie było by połowy mojego posta (z resztą nie tylko ja nie skapowałem że o pole chodzi);

Co do wskaźników - na forum tutaj ktoś mi polecił taki sposób

No to ktoś polecił Ci tworzenie wskaźnika na wskaźnik, co nie ma sensu; Słuchaj dokumentacji, nie czyichś eksperymentów:

In the Delphi approach to Object Oriented Programming, everything revolves around the concept of ’Classes’. A class can be seen as a pointer to an object, or a pointer to a record, with methods associated with it.

Źródło: http://www.freepascal.org/docs-html/ref/refch6.html

Nie jest to wskaźnik w dosłownym znaczniu (może być tak postrzegany), ale działa na podobnej zasadzie; Więc pozbądź się czyichś praktyk na rzecz swoich wyuczonych z wiarygodnych źródeł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1