Czy przydzielony obszar getmem jest zawsze ciągły?

0

Tzn. czy takie wskazanie Pbyte := Pointer(Integer(Pbufor) + 5) będzie zawsze wskazywało na 5 bajt obszaru Pbufor.

0

Sądzę, że obszra jest ciągły. A jeśli nie, to menedżer pamieci powinien zapewnić poprawne dodawanie wskaźników nawet w wypadku nieciągłości. Ale to jest tylko mój pogląd i nie mam dowodu.

0

Tego pewni rzeczywiście nie możemy być.. bo skoro na dysku dane nie są zapisywane w sposób ciągły (np. przed defragmentacją) to dlaczego nie miałoby być tak samo z pamięcią dynamiczną.

0

Tu nie ma dodawania wskaźników, więc może być kicha. To jak w takim razie określić wskażnik do 5-tego bajta przydzielonej pamięci?.

0

A dlaczego nie stosujesz dodawania wskaznikow tylko przechodzisz przez Integer?

0

Jakoś dziwnie ale nie można dodawać wskaźników. A może znasz sposób?

0

do wskaźnika można dodać/odjąć integera........w ten sposób uzyskasz wskaźnik do komórki : jak dodajesz to za pierwotnym wskaźnikiem ........a jak odejmujesz to do komórki przed

0

To bardzo ciekawe. Tak jest podane w helpie ale spróbuj podać działający przykład anonimie. ;-)

0

Moze tak juz nie jest w winzgrozie, ale jak sie nie myle to gdy sie rezerwowalo pamiec pod dosem to zadany obszar byl ciagly i wyrownany do granicy paragrafu. paragraf to 16Kb pamieci, wiec zawsze sie dostawalo "naddatek" pamieci chyba ze sie idealnie wstrzelilo w granice paragrafow. Prawda ze wirtualna pamiec moze i jak nic jest nieciagla, ale my takze programujac odnosimy sie do adresow logicznych a nie fizycznych, zatem dla nas powinno to byc ciagle i juz.
[cya]

0

To bardzo ciekawe. Tak jest podane w helpie ale spróbuj podać działający przykład anonimie. ;-)

Operator + i - działa tylko dla character pointers. Inne wskaźniki dodaje się i odejmuje przy pomocy Inc i Dec. Inc(P,1) zwiększa wskaźnik P o jedną wielkość typu, do którego odnosi się wskaźnik. Czyli dla byte pointer o 1, dla longword pointer o 4 itp.

Oto przykład:

procedure TForm1.Button1Click(Sender: TObject);
var
 PB:^Byte;
 PW:^Word;
 PL:^LongWord;
begin
 GetMem(PB,10);  //z nadmiarem, uzyje 4
 PB^:=255;
 Inc(PB,1);
 PB^:=255;
 Inc(PB,1);
 PB^:=0;
 Inc(PB,1);
 PB^:=0;
 Dec(PB,3);
 PW:=Pointer(PB);
 PL:=Pointer(PB);
 Label1.Caption:=IntToStr(PW^);
 Inc(PW,1);
 Label2.Caption:=IntToSTr(PW^);
 Label3.Caption:=IntToSTr(PL^);
 FreeMem(PB);
end;
0

No tak. Jednak jest sposób. Trochę czasu zajęło kombinowanie. Szkoda że nie ma przykładu w helpie. Pytałem i sam sobie odpowiedziałem ale dziękuję za rady. ;-)
Trzeba zrobić tak:

var
i : Integer;
Tekst : String;
Bufor : Pointer;
begin
Tekst := 'oooooooooo';
i := StrLen(PChar(Tekst));
GetMem(Bufor, i*sizeof(char));
Move(PChar(Tekst), Bufor, i);
(PChar(Bufor) + 4)^ := 'x';
messagebox(0,PChar(Bufor),'Tytuł',MB_OK);
FreeMem(Bufor);
end;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.