Tfilestream.read co to jest "buffer" w delphi?

0

Witam.
No wlasnie Tfilestream.read(a,liczba) odczytuje ze strumnieja pod "buffer" a maxymalnie liczba bajtow. I o ile a to jakas zmienna (integer, array of... albo record) to mi dziala a jak to jest wskaźnik to nie, dlaczego?
Dlaczego nie dziala dla p:pchar lub p:pointer instrukcja i:=Tfilestream.read(p^,liczba) ? To tym dziwniejsze ze i przyjmuje wartosc liczba co powinno oznaczac ze zostalo skopiowane tyle bajtow ile zażądano czyli liczba.
Chyba mysle w jezyku c i dla mnie buffer to jest void * a więc pointer albo inaczej adres pod ktory ma byc zapisywane ale widze ze w delphi to jest jakos inaczej, moze to kwestia akiejs opcji kmpilatora? A mzoe robie jakis błąd?
Jesli ktos zna odpowiedz to bylbym wdzieczny.

0

Ah, przepraszam, zapomnailem jeszcze o jednym przy tej okazji. Mianowicie jesli a to jest string to wywolanie filestream(a[1],liczba) dziala "chyba" prawidlowo, to znaczy odwiednia liczba bajtow zostaje skopiowana pod a z tym że pojawia sie nastepne pytanie. Czy zmienna string stanowi spojny obszar pamieci? Pytam bo mnie sie buffer kojarzy ze spojnym obszarem pamieci wiec jesli string takim nie jest albo byc nie musi to by ozanczalo ze nie zawsze filesteam.read(a[1],liczba) dla a:string; zadziala poprawnie.
Z gory dziekuje za odpowiedzi i przepraszam ze to tak na raty.

0

ACzy zmienna string stanowi spojny obszar pamieci?

Tak. Na pewno z punktu widzenia programisty, a więc move, blockread TFileStream.Buffer itp. będą działać poprawnie ze string. Fizycznie chyba zresztą też.

0

Nie mam zielonego pojęcia, dlaczego nie działa odwołanie do wskaźnika. Powinno działać, jak działa w przypadku blockwrite/blockread/move/fillchar i innych.

Co do pytania zawartego w temacie ...
var zmienna jest raczej odpowiednikiem void& zmienna,
Ale w c chetniej uzywa się wskaźników, w pascalu zaś referencji.

0

Wydaje mi sie ze problem tkwi w tym ze zapominasz o przydziale pamieci dla zmiennych dynamicznych tutaj zamieszczam przyklad (dziala na pewno).

procedure TForm1.Button1Click(Sender: TObject);
var
  Plik: TFileStream;
  Znak: PChar;
begin
  GetMem(Znak, 100);
  FillChar(Znak^, 100, 0);
  Plik:=TFileStream.Create('C:\p.jpg', fmOpenRead);
  Plik.Read(Znak^, 20);
  Plik.Free;
  MessageBox(Handle, Znak, 'Kupa', MB_OK);
  FreeMem(Znak);
end;

Do postu ponizej:
Wiesz co, nawet jeszcze raz sprawdzilem na jakims pliku tekstowym dla pewnosci i wszystko dziala jak ma dzialac, jesli u Ciebie nie dziala to dziwna sprawa to jest.

0

Dzięki pq, to jest jakies rozwiazanie, co nie zmienia faktu ze filestream.read dziala dziwnie. Tym bardzoiej to dziwne ze FillChar(var X; Count: Integer; Value: Byte); dziala poprawnie w wywolaniu FillChar(p^,a,b) choc jej deklaracja co do parametru var X jest taka sama jak var buffer przy Tfilestream.read.
Faflik jestes pewein, że Twoj kod zadziala?
Bo ja niestety nie popelnilem tego prostego bledu z przydzialem pamieci.
Oki flabra, ja sie troche zasugerowalem tym ze w helpie dla postaci buildera deklaracją jest void*, ale to szczegol
Dzięki za posty : ))

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