Szybka pomoc z klasą w Pascalu.

0

Witam,

Mam do napisania program z klasą statyczną do obliczeń na wektorach. Mam problem, bo wywala mi program gdy się odwołuje do elementu z tablicy w obiekcie. Pisze "Cannot access memory"
Problem może być trywialny, ale muszę to napisać na jutro. Proszę o szybką pomoc ;)

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };
type
   TWektor = class(TObject)
   protected
       const ROZMIAR = 2;
   private
     _w3:TWektor;
     wektor:array of Integer;
     procedure wpisz(_x,_y:Integer);
     function dodaj(_w2:TWektor):TWektor;
     function odejmij(_w2:TWektor):TWektor;
     function iloczSk(_w2:TWektor):Integer;
     function iloczWek(_w2:TWektor):Integer;
   public
     constructor Create; overload;
     procedure wyswietl;
end;

   constructor TWektor.Create;
      begin inherited Create;
          SetLength(wektor, 2);
      end;
   procedure TWektor.wyswietl;
  // var
    // i:Integer;
      begin
          //writeln('Skladowe tego wektora to: ');
         // for i:= 0 to TWektor.ROZMIAR do
          //        begin
          //             write(wektor[i]);
          //             write(' ,');
           //       end;
          write(wektor[0], ',', wektor[1]);
      end;
     procedure TWektor.wpisz(_x,_y:Integer);
     begin
         wektor[0]:= _x;
         wektor[1]:= _y;
     end;
     function TWektor.dodaj(_w2:TWektor):TWektor;
     begin
          _w3:= TWektor.Create;
          _w3.wpisz(wektor[0]+_w2.wektor[0],wektor[1]+_w2.wektor[1]);
          Result:=_w3;
     end;
       function TWektor.odejmij(_w2:TWektor):TWektor;
     begin
          _w3:= TWektor.Create;
          _w3.wpisz(wektor[0]-_w2.wektor[0],wektor[1]-_w2.wektor[1]);
          Result:=_w3;
     end;
        function TWektor.iloczSk(_w2:TWektor):Integer;
     begin
          Result:= wektor[0]*_w2.wektor[0] +  wektor[1]*_w2.wektor[1];
     end;
          function TWektor.iloczWek(_w2:TWektor):Integer;
     begin
          Result:= abs(wektor[0]*_w2.wektor[1] +  wektor[1]*_w2.wektor[0]);
     end;
var
     w1,w2,_w3:TWektor;
begin
     w1:= w1.Create;
     w2:= w2.Create;
     w1.wpisz(1, 3);
    // w2.wpisz(3, 4);
    // writeln('Wektor A: ');
   //  w1.wyswietl;
   //  writeln('Wektor B: ');
   //  w2.wyswietl;
   //  writeln('Suma wektorow A i B: ');
   //  _w3:=w1.dodaj(w2);
   //  _w3.wyswietl;
      //w1.wektor[0]:=1;
     w1.Free;
     w2.Free;
   //  _w3.Free;
     readln();
end.
0

Chcesz użyć tablicy dynamicznej a nigdzie nie masz SetLength() ?
Nie może działać.

0

w konstruktorze mam SetLength()

3

A mnie ten zapis się nie podoba:

var
     w1,w2,_w3:TWektor;
begin
     w1:= w1.Create;
     w2:= w2.Create;

{...}

Ty w ogóle umiesz tworzyć obiekty...? (będę uprzejmy) Powinno być:

w1 := TWektor.Create();
w2 := TWektor.Create();

A tak poza tym to sformatuj kod - źle się go analizuje i poucz się obsługi debugera;

3

"Pisze "Cannot access memory"", masz na myśli tu: w1.wektor[0]:=1;

0

Dzięki wielkie, zwykłe nie dopatrzenie ;) Miałem przerwę od Pascala ze 3 lata i nie ogarniam do końca składni.

0

weź mi wytłumacz po jaki grzyb tam jest tablica, w dodatku dynamiczna a nie dwie zmienne???

0

w poleceniu było napisane że mam użyć tablicy, a w konstruktorze ustalić rozmiar tablicy, zrobiłem tak na pól sztywno, by się zorientować z czym mam problem, potem to zmieniałem na całkowicie dynamiczne

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