Tablice Dynamiczne Pascal

0

Napisałem program którego zadaniem jest skopiowanie zawartosci jednego pliku do drugiego:

var
plik1,plik2 : file;
n1,n2 : string;
i1,i2 : Longint;
type TLongint = array[0..0] of char;
p_wskaznik=^TLongint;
var wskaznik:p_wskaznik;
i3,bufor :Longint;

begin
writeln('Podaj nazw© pliku do skopiowania');
readln(n1);
writeln('Podaj nazw© pliku docelowego');
readln(n2);
assign(plik1,n1);
assign(plik2,n2);
reset(plik1);
i3:=filesize(plik1);
rewrite(plik2);
repeat
Getmem(wskaznik,i3);
blockread(plik1,bufor,filesize(plik1),i1);
blockwrite(plik2,bufor,i1,i2);
Freemem(wskaznik,i3);
until i1<>256;
close(plik1);
close(plik2);
end.

Kompiluje sie, urchamia, nie wyswietla zadnych błędów. problem z tym, że stworzyłem dwa pliki na dysku (plik1.txt,plik2.txt) i zrobiłem test. niestety tylko wyczyscilo mi zawartosc drugiego, a po operacji kopiowania ani sladu. Na setlenght było by o wiele prościej :< ale operuje na TP7 bez możliwości zmiany niestety. Proszę o wskazanie błędów

0
type TLongint = array[0..0] of char;
 p_wskaznik=^TLongint;
 var wskaznik:p_wskaznik;
 i3,bufor :Longint;

opracuj jakieś jednolite nazewnictwo zmiennych i typów, bo w twojej szybko się można pogubić. Co linijka to inna konwencja.

repeat
 Getmem(wskaznik,i3);
 blockread(plik1,bufor,filesize(plik1),i1);
 blockwrite(plik2,bufor,i1,i2);
 Freemem(wskaznik,i3);
 until i1<>256;

po co getmem i freemem za każdym przebiegiem pętli? tracisz na to mnóstwo czasu. daj getmem przed całą pętlą, a freemem za pętlą.

rób wcięcia.

i3:=filesize(plik1);

i3? dlaczego rozmiar pliku to i3? a może i2 albo i4? a może jednak po prostu rozmiarPliku?

until i1<>256;

co to jest to 256 i jak się ma do dopiero co pobranego rozmiaru pliku?

Proszę o wskazanie błędów
bałagan straszny. nie panujesz nad kodem i tracisz poczucie co jest czym.

0

domyślna wielkość rekordu to 128 bajtów

0

i3:=filesize(plik1);
rewrite(plik2);
repeat
Getmem(wskaznik,i3);
blockread(plik1,bufor,filesize(plik1),i1);
blockwrite(plik2,bufor,i1,i2);
Freemem(wskaznik,i3);
until i1<>256;

Tylko po co ci pętla skoro bufor i tak ma rozmiar pliku. I czemu warunkiem wyjścia jest i1<>256?!
poza tym, ja zamiast bawić się w tworzenie 'tablicy dynamicznej' z przydzielonej pamięci, po prostu użyłbym przydzielonej pamięci (wskaznik^ & wskaznik:pointer;).

Kompiluje sie, urchamia, nie wyswietla zadnych błędów.

Jest takie śmieszne narzędzie które się nazywa debugger i jest on nawet w TP7. Skorzystaj z niego, to oszczędzisz sobie czasu i cierpienia.

rób wcięcia.

Dołączam się do żądania.

0

Używam trybu krokowego... Pozmieniałem troche, a bałagan jestmiedzy innymi daltego ze to tylko modyfikacja programu. A ja mam za zadanie zmodyfikować program tak aby używał funkcji filesize.

var
plik1,plik2 : file;
n1,n2 : string;
i1,i2,rozmiarpliku,bufor :integer;
type
    TLongint = array[0..0] of char;
    p_wskaznik=^TLongint;

var wskaznik:p_wskaznik;


begin
writeln('Podaj nazw© pliku do skopiowania');
readln(n1);
writeln('Podaj nazw© pliku docelowego');
readln(n2);
assign(plik1,n1);
assign(plik2,n2);
reset(plik1);
    rozmiarpliku:=filesize(plik1);
rewrite(plik2);
       Getmem(wskaznik,rozmiarpliku);
repeat
    blockread(plik1,bufor,filesize(plik1),i1);
    blockwrite(plik2,bufor,i1,i2);
until i1=0;
       Freemem(wskaznik,rozmiarpliku); //TU WYSKAKUJE MI KOLEJNY BŁĄD KTÓREGO NIE ROZUMIEM: ERROR 203 INVALID POINTER OPERATION//
close(plik1);
close(plik2);
end.

Dlaczego invalid pointer operation ? według mnie wszystko jest okej biore poprzez Getmem 'rozmiarpliku' pamieci a nastepnie uwalniam tyle samo. Proszę nie krzyczeć, dopiero się uczę, jesteście bardzo pomocni :)

0

getmem dostarcza ci 128 razy za mało pamięci

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