Tablice rekordow - kopiowanie nie dziala

0

Witam.
Deklaracja rekordu i tablicy:

TPracownikRek = record
  teczka: integer;
  imie: string;
  nazwisko: string;
  dzial: string;
  kierownik: boolean;
  idstr: integer;
  archiwalny: boolean;
end;

TablicaPracownikow = array of TPracownikRek;

No i pozniej taka funkcja w klasie TDzial dostaje taka ladnie wypelniona po brzegi tabele z rekordami

function TDzial.Wczytaj( _tabpr: TablicaPracownikow ): boolean;
begin

try

  SetLength( Self.tabPrac, Length(_tabpr) );
  if( Length(_tabpr) > 0 ) then
    Self.tabPrac:= _tabpr;

  result:= true;
  (...)

ale kopiowanie nie działa :/ Access violation przy przypisaniu rozmiaru tabPrac [lentgh() daje dobra wartosc]
O co moze chodzic bo trace czas i nie widze szczegolu w ktorym tkwi diabel? :/

Deklaracja tab w klasie:

TDzial = class
  protected
    tabPrac: TablicaPracownikow;
    (...)
0

nie możesz kopiować tablic przez zwykłe przypisanie, musisz skopiować każdy element tablicy osobno. w tej postaci kopiujesz jedynie wskaźnik do argumentu, który po zakończeniu funkcji znika z pamięci.

0
ŁF napisał(a)

nie możesz kopiować tablic przez zwykłe przypisanie, musisz skopiować każdy element tablicy osobno. w tej postaci kopiujesz jedynie wskaźnik do argumentu, który po zakończeniu funkcji znika z pamięci.

Hm, no ok, załóżmy, że masz rację ;)
To mam rozumiec, ze znikneła niby deklaracja tej tablicy rekordow skoro nie moge nawet jej rozmiaru ustawic?
Program nie wywala sie na kopiowaniu.
Cos nie tak..

0

Tablice, osobliwie takie dynamiczne, nie podlegaja "kopiowaniu". Sa traktowane jak stringi - zwiekszany jest licznik odwolan. Po wykonaniu instrukcji a := b w pamieci masz dalej jedna kopie tablicy, a i b pokazuja w to samo miejsce. UWAGA - wykonanie instrukcji SetLength powoduje rozerwanie tej zaleznosci (funkcja zwraca KOPIE tablicy, pod innym adresem, wiec wykonanie a := b; SetLength(a, 10) powoduje, ze b juz jest zupelnie inna tablica.
Mnie taki kawalek kodu jak wypisales dziala bez pudla. (D2007) Poszukalbym przyczyny AV raczej w danych oraz w innych miejscach programu - moze juz wczesniej zdazyles zniszczyc pamiec?. Moze dobrze by bylo przypomniec, ze to co widzimy jako pole rekordu to w rzeczywistosci wynik wykonania funkcji :)

0

*Oczywiscie to co napisalem o zwiekszaniu/zmniejszaniu licznika referencji oznacza po prostu, ze nie musisz manipulowac dlugoscia tablicy - zwykle a := b wystarczy :)

0
TheBigStaticObject napisał(a)

(...) moze juz wczesniej zdazyles zniszczyc pamiec?. (...)

Nie inaczej :/
Bardzo dziekuje!

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