[Delphi] Kłopoty z Array of String

0

Postanowiłem wykorzystać pomysł zawarty w przykładowym programiku SplitDemo .
Jest tam taka konstrukcja:
Daklaracja klasy w module SplitUnit
type
TSplit = array of String;
a następnie deklaracja obiektu w module MainFrm
var
Output : TSplit;
Wszystko działa OK
Jeśli jednak zadeklaruję wiecej obiektów tego typu czyli np:

var
Output,Info,Name,Code : TSplit;
kompilator nie zgłasza błędów i program się kompiluje. Jednak przy próbie uruchomienia gdy dochodzi do wiersza określającego długoś którejkolwiek z doatkowych tablic np.
SetLength(Name,1);
Name[0]:= 'Name';
program się wysypuje i pojawia się komunikat "Acces Violation" o konieczności jego zamknięcia.
Byłbym bardzo zobowiązany za wyjaśnienie tego zjawiska.

0

Sprobuje cos pomóc, choc nie wiem czy to zadziala.
Mianowicie:
Moze w Delphi przybiera automatycznie tablice od 1 a nie od 0, wiec sprobuj:
Name[1]:= 'Name';
Ale nie wiem dokladnie czy to jest to.
Pozdrawiam.

0

Sprobuje cos pomóc, choc nie wiem czy to zadziala.
Mianowicie:
Moze w Delphi przybiera automatycznie tablice od 1 a nie od 0, wiec sprobuj:
Name[1]:= 'Name';
Ale nie wiem dokladnie czy to jest to.
Pozdrawiam.

Przykro mi, ale się mylisz. Tablice dynamiczne są numerowane od 0.
A wracając do problemu.
Taki komunikat pojawia się, jeżeli nie zarezerwowałeś pamięci tablicy przez SetLength. Pewien jesteś, że odwołujesz się do tej zmiennej, dla której ustawiłeś SetLength?
U mnie taki kod działa:

type TSplit = array of string;
var
q, w: TSplit;
begin
SetLength(q, 1);
q[0] := 'Ala ma';
SetLength(w, 1);
w[0] := ' kota';
ShowMessage(q[0]+w[0]);
end;

0

Taki komunikat pojawia się, jeżeli nie zarezerwowałeś pamięci tablicy przez SetLength. Pewien jesteś, że odwołujesz się do tej zmiennej, dla której ustawiłeś SetLength?

Tak, bo podaje długość i zaraz w następnym wierszu przypisuję wartość pierwszego stringu. Problem tylko w tym ,że tych tablic jest razem 12. Czy może to mieć wpływ ? Przyjrzę sie jeszcze raz wieczorem ,jutro przytoczę ewwntualnie wiekszy fragment.

Przy okazji pyatnie : Czy można przypisywać wartości wierszy tablicy w dowolnej kolejności ,tzn czy można tak:

type w=array of string
begin
SetLength(w,5);
w[4]:= 'ala';
w[0]:='ma';
w[3]:='kota'
end;

0

Tak, bo podaje długość i zaraz w następnym wierszu przypisuję wartość pierwszego stringu. Problem tylko w tym ,że tych tablic jest razem 12. Czy może to mieć wpływ ? Przyjrzę sie jeszcze raz wieczorem ,jutro przytoczę ewwntualnie wiekszy fragment.

Jeżeli dużo pamięci rezerwujesz, to pewnie jej zabrakło.

Przy okazji pyatnie : Czy można przypisywać wartości wierszy tablicy w dowolnej kolejności

Oczywiście. Przecież to tablica, a nie plik. Masz dostęp do któregokolwiek jej elementu.

0

Jeżeli dużo pamięci rezerwujesz, to pewnie jej zabrakło.

A jak to obliczyć liczbowo, ewntualnie czy jest jakiś sposób na zobaczenie co zajmuje ile pamieci w trakcie pracy programu ?

0

obliczanie zajetej pamieci - popatrz encyklopedia Delphi, procedura SizeOf, lub pomoc samego delphi :)

0

Thx wszystkim za pomoc. Znalazłem błąd i podam go ku przestrodze innych zaczynajacych tą zabawę. Mianowicie moja deklaracja wygladała tak:

SetLength(Tablica,num);
Tablica[num] := coś tam

Błąd polega na tym ,iż ponieważ wiersze tablicy są numerowane od 0 to wpis jest robiony do wiersza tablicy przekraczającego o 1 jej rozmiar.

W przykładzie Adama jest OK , ale przy własnej konstrukcji nie zwróciłem na to uwagi.

0

Błąd polega na tym ,iż ponieważ wiersze tablicy są numerowane od 0 to wpis jest robiony do wiersza tablicy przekraczającego o 1 jej rozmiar.

A na forum podałeś:
SetLength(Name, 1);
Name[0] :=...

I nic dziwnego, że się nie mogliśmy dogadać :)

0

I nic dziwnego, że się nie mogliśmy dogadać :)

Very sorry [wstyd] . Program został w domu, pisałem z pamięci i głowę bym sobie dał uciąć , że było jak podałem. Mea culpa.
Przekonałem się ,że większość problemów wynika z drobnych przeoczeń i literówek.Co gorsza, jak człowiek się zasugeruje ,to patrząc na tekst widzi to co spodziewa się zobaczyć , a nie to co jest tam napisane.

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