[Delphi] Problem z tablicami dynamicznymi - Access violation

0

Witam

Właśnie piszę program, do którego muszę używać tablicy dynamicznej (bowiem ma to być edytor do plików, gdzie liczba zmiennych wpisywanych do danej tablicy w każdym pliku jest inna). Problem jest jednak taki, że wyskakuje mi przy uruchamianiu programu błąd "Access violation...". Gdy zamienię tablice dynamiczne na zwykłe tablice z określoną długością to wszystko jest ok... I nie mam pojęcia co się dzieje [???] . Proszę pomóżcie. Poniżej kawałek programu:

var

  Plik              :  TFileStream;
  Path             :  String;
  TextZPliku    :  array of String;
  PointZPliku   :  array of integer;
  PierwPointer, P  :  integer;

begin

  Path := 'E:\test\1.psn' ;
  Plik := TFileStream.Create(Path, fmShareDenyNone);
  Plik.Position := 0;
  Plik.Read(PierwPointer, 4); //PierwPointer wskazuje na wartość pierwszego wskaźnika, (wartość = adres gdzie jest pierwszy text)
  P := round(PierwPointer/4); //bo integer jest czterobajtowy i wskaźników jest 4 razy mniej niż liczby bajtów pomiędzy początkiem pliku a pierwszym textem
  SetLength(PointZPliku, P); //długość tablicy to dokładna liczba wskaźników
  SetLength(TextZPliku, P); //długość tablicy to dokładna liczba textów
  Plik.Position := 0;
  Plik.Read(PointZPliku, 4);
  Memo1.SelText := IntToStr(PointZPliku[1]); //sprawdzam wartość pierwszego wskaźnika

end;

Jak ktoś się dopatrzy to bardzo proszę o wskazanie błędu... Gdy zamienię tablice dynamiczne na zwykłe to wszystko działa, ale muszę mieć tablice dynamiczne :(

0

Hmm... Niebardzo pojmuję ideę tego programu.

  1. Stosuj tagi < delphi > i < /delphi >, będzie prościej analizować kod
  2. Nie widzę nigdzie przypisania do tablicy (może ślepy jestem?)
  3. Może zbyt późno ustawiasz odpowiednią długość tym tablicom?
    Dopisane:
    Pierwszy element tablicy dynamicznej to Tablica[0], nie Tablica[1]. To może powodować błąd...
0

AD 1. Dzięki pq za wstawienie znaczników (zapomniałem o nich :-| )
AD 2. [ Plik.read(PointZPliku, 4); ] - to jest przypisanie do tablicy (nie martw się, też bym nie zobaczył ;P )
AD 3. Ciężko ustawić je trochę wcześniej, gdyż poprzednie instrukcje są potrzebne do ustawienia długości tablicy.

Propo AD 2 - zamiast tego "4" wpisać można cokolwiek i też nie działa, więc to na pewno nie to...
Jeśli chodzi o pierwszy wyraz tablicy to wiem, że od zera się zaczyna, ale ustawiając na 0 dalej jest to samo :/ .

Cóż, na razie ustawię sobie tablicę 500-elementową i jak dojdę do momentu gdzie znów będzie mi to potrzebne będę dalej główkował (a może ktoś do tego czasu coś tu jeszcze napisze ;) ).

W każdym razie wielkie dzięki :)

0
  1. Z tego co wiem, powinno być chyba plik.read(PointZPliku[0],4);.
    PS: to chyba tobie wczyta tylko pierwszy wskaźnik?
  2. Adam ma racje: pierwszy element tablicy dynamicznej ma indeks 0, a nie 1.
0

Spróbuj dodawać jeden element tablicy przed dodaniem każdego kolejnego wskaźnika:

SetLength(Tablica, Length(Tablica)+1);

A tak przy okazji, to to chyba powinno być wszystko w pętli, nie? Znaczy jak chodzi o ładowanie?

0

Jakieś dziwne kombinacje stosujecie, szczególnie z tym rozmiarem pliku... Zrób sobie zmienną typu File of Integer, a potem przypisz jej ten swój plik i przez FileSize sprawdź rozmiar. Moim zdaniem problem leży właśnie gdzieś tam, przez te magiczne wyliczenia rozmiaru. Możesz też całkowicie zdać się na File of Integer i z niego odczytywać normalnie przez Read(plik, wartosc).

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