Mam maly problem.
Delphi nie pozwala zapisywac tablicy dynamicznej do pliku, nawet po zdefiniowniu jej dlugosci.
Czy ktos moglby pomoc rozwiazac ta kwestia?
Jeżeli tablica jest recordowa to przez recordy.
Lub przez record jednobajtowy.
To wyjdzie napewo, może???? ort! przez strumień????
Ile jeszcze razy bede to pisal :-[ :-[
a: array of costam
f: file of costam
assignfile(f, nazwa);
zapis
Rewrite(f);
BlockWrite(F, a[0], Length(a));
odczyt
Reset(f);
SetLength(a,FileSize(F));
BlockRead(f, a[0], FileSize(f));
Ile jeszcze razy bede to pisal :-[ :-[
a: array of costam
f: file of costamassignfile(f, nazwa);
zapis
Rewrite(f);
BlockWrite(F, a[0], Length(a));odczyt
Reset(f);
SetLength(a,FileSize(F));
BlockRead(f, a[0], FileSize(f));
mozna i tez tak:
a: array of costam
f: file of costam
assignfile(f, nazwa);
zapis
Rewrite(f);
for i:=0 to n do
Write(f, a[i]);
odczyt
Reset(f);
i := 0;
while not Eof(f) do
begin
Read(f, a[i]);
i := i + 1;
end;
mozna i tez tak:
Pewnie, że można, tylko bedzie wolniej.
Gdyby to bylo tak proste jak to napisal Piasiu, to bym sie nie pytal. Jednakze typ plikowy w Delphi nie moze zawierac tablic dynamicznych.
A wracajac do blockwrite i blockread, pq jak bys mogl podac konkretny przyklad programu np. dla takiego typu
TTab = array of record
a:string[10];
b:string[10];
bo mi cos nie bardzo wychodzi.
No przeciez juz wlasciwie masz napisane... Ale jak nie rozumiesz, to ci napisze raz jeszcze.
type myrec = record a: integer; b: integer; end;
a: array of myrec
f: file of myrec
procedure zapisz(nazwa: string);
begin
assignfile(f, nazwa);
Rewrite(f);
BlockWrite(F, a[0], Length(a)); colsefile(f);
end;
procedure odczyt(nazwa: string);
begin
assignfile(f, nazwa); Reset(f);
SetLength(a,FileSize(F));
BlockRead(f, a[0], FileSize(f)); closefile(f);
end;
Prosciej sie nie da wytlumaczyc. Aha... Jakbys sie nie zorientowal, to zapisuje sie procedura zapis, a odczytuje procedura odczyt, podajac w parametrze nazwe pliku.
Adam.Pilorz nie zrozumiales mnie. Nie chce zapisywac poszczegolnych rekordow tylko od razu cala tablice. Budujac chociazby taka tablice
TRec = array of record
array of costam;
array of costam;
end;
juz jest problem.
pq jak bys mogl podac konkretny przyklad programu np. dla takiego typu
TTab = array of record
a:string[10];
b:string[10];
bo mi cos nie bardzo wychodzi.
Ja bym to zrobil tak
TRec=packed record
a: string[10];
b: string[10];
end;
AR: array of TRec;
F: file of TRec;
i dalej jak u mnie
jesli koniecznie musisz miec tyb tablicowy, to
po definicji typu rekordowego daj
TTab=array of TRec;
var
AR: TTab;
F: file of TRec;
i tak dalej
[quote
Ja bym to zrobil tak
TRec=packed record
a: string[10];
b: string[10];
end;
AR: array of TRec;
F: file of TRec;
i dalej jak u mnie
jesli koniecznie musisz miec tyb tablicowy, to
po definicji typu rekordowego daj
TTab=array of TRec;
var
AR: TTab;
F: file of TRec;
i tak dalej
</quote>
i tak dlej czyli
blockwrite(f,ar[0].a, ...itd.
To jest to samo co zaproponowal Adam.Pilorz. Zapisywanie pojedynczego rakordu. Mi chodz o zapisanie calej tablicy w jednej operacji tak jak to mozna zrobic ze zwykla tablica
Type
TRec = array[0..10] of costam;
procedure zapisz;
var
dane:TRec;
f:file of TRec;
begin
assignfile(...)
reset(...)
write(f,dane);
closefile(...);
end;
To wszyscy wiedza, ale gdyby teraz zamienic
TRec = array[0..10] of costam;
na
TRec = array of costam;
W jaki sposob zapisac zmienna 'dane', a nie poszczegolne komorki
(dane[0],dane[1]...)??
Gdyby to bylo tak proste jak to napisal Piasiu, to bym sie nie pytal. Jednakze typ plikowy w Delphi nie moze zawierac tablic dynamicznych.
A wracajac do blockwrite i blockread, pq jak bys mogl podac konkretny przyklad programu np. dla takiego typu
TTab = array of record
a:string[10];
b:string[10];
bo mi cos nie bardzo wychodzi.
type TTab=array of record
a:packed array of word;
b:packed array of byte;
end;
procedure save({const} name:pchar;var t:ttab); {const - if You want}
var f:file;
i,k:cardinal;
begin
assign(f,name);
rewrite(f,1);
k:=length(t);
blockwrite(f,k,sizeof(cardinal));
for i:=0 to length(t)-1 do
with t[i]do
begin
k:=length(a);
blockwrite(f,k,sizeof(cardinal)); {or 4 or sizeof(k) - whatever}
blockwrite(f,a,k*sizeof(word)); {or k*2 or k*sizeof(a[0]) - whatever}
k:=length(b);
blockwrite(f,k,sizeof(cardinal));
blockwrite(f,b,k*sizeof(byte)) {blockwrite- that's why array must be packed}
end;
closefile(f)
end;
procedure load({const} name:pchar;var t:ttab);
var f:file;
i,k:cardinal;
begin
assign(f,name);
reset(f,1);
blockread(f,k,sizeof(cardinal));
setlength(t,k);
for i:=0 to length(t)-1 do
with t[i]do
begin
blockread(f,k,sizeof(cardinal));
setlength(a,k);
blockread(f,a,k*sizeof(word));
blockread(f,k,sizeof(cardinal));
setlength(b,k);
blockread(f,b,k*sizeof(byte))
end;
closefile(f)
end;
function checkout:string;
const check:array[boolean]of string=('fuckin'' stupid flabra !!!','flabra is right.'); {we'll see}
var tab1,tab2:ttab;
j,k:cardinal;
flabra:boolean;
begin
randomize; {randomize: all in God's hands}
setlength(tab1,random(20));
for j:=0 to length(tab1)-1 do
with tab1[j]do
begin
setlength(a,random(100));
for k:=0 to length(a)-1 do a[k]:=random(65536);
setlength(b,random(200));
for k:=0 to length(b)-1 do b[k]:=random(256)
end;
save('tabsave.dat',tab1);
load('tabsave.dat',tab2);
flabra:=(length(tab1)=length(tab2)); {primo true/false}
if flabra then {if length(tab1)=length(tab2)then }
for j:=0 to length(tab1)-1 do {secundo ; tab1 or tab2 - whatever - the same length}
begin
flabra:=flabra and(length(tab1[j].a)=length(tab2[j].a)); {tercio - we'll check everything !!!}
flabra:=flabra and(length(tab1[j].b)=length(tab2[j].b)); {quadro}
if flabra then
begin
for k:=0 to length(tab1[j].a)-1 do {tab1/tab2 - whatever - the same length}
flabra:=flabra and(tab1[j].a[k]=tab2[j].a[k]);{quinto - H. Quinto - Vabanque! :) }
for k:=0 to length(tab2[j].b)-1 do {tab2/tab1}
flabra:=flabra and(tab1[j].b[k]=tab2[j].b[k]) {seks... jak to k***a było ?!}
end
end;
result:=check[flabra]
end;
var is_he_stupid:string;
begin
{proponuję wstawić brejkpojnta do następnej linii i sprawdzić wartość is_he_stupid w łotczach}
is_he_stupid:=checkout
{wersji w c/c++ nie chce mi się robić ;) }
end.
Łapiesz o co cho? Musisz również zapisać rozmiar
tablicy, żebyś wiedział ile komórek masz zawsze
czytać. :)
Może jeszcze to sie przyda (zapis dynamicznej tablicy dwuwymiarowej - rowniez nieprostokatnej):
Heh, sorka, pq, że Ci jeszcze nie podziękowałem za to, że mi pomogłeś, ale strasznie mnie pochłąnęła praca na Saperem, w każdym razie, dzięki, że mi wtedy pomogłeś... [hurra]
//spox Loczek. pq