[Delphi] Procedúra MOVE - Paranormálne javy

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod 8ball (novy) 2. 4. 2006 12:10

Kto mi vysvetlí toto:

Kód: Vybrat vše
var
  S1, S2: string;
begin
  S1 := 'Obsah reťazca';
  Move(S1, S2, 4);
  ShowMessage(S2); // Vypíše to 'Obsah reťazca'
end;[/co


Ako je možné že keď procedúra move skopíruje reťazec S1 do reťazca S2 pričom veľkosť je nastavená na 4 Byte tak sa reťazec skopíruje celý?

Nemal by mať S2 iba hodnotu 'Obsa' ?
Naposledy upravil 8ball (novy) dne 2. 4. 2006 13:36, celkově upraveno 1
8ball (novy)
Junior

Odeslat příspěvekod Wikan 2. 4. 2006 12:38

Delphi uz si moc nepamatuju, ale neni String jenom ukazatel?
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod JanFiala 2. 4. 2006 12:46

Presne tak. Ten Move zkopiroval pouze ukazatel na retezec.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod 8ball (novy) 2. 4. 2006 13:34

Keby sa skopíroval iba pointer potom by S1 aj S2 ukazovali na to isté miesto v pameti? To ale znmená že ak zmením hodnotu S1 := '', mal by sa rovnako zmeniť aj obsah S2, čo sa ale nedeje.

Kód: Vybrat vše
var
  S1, S2: string;
begin
  S1 := 'Obsah reťazca';
  Move(S1, S2, 4);
  S1 := '';
  ShowMessage(S2); // Vypíše to 'Obsah reťazca'
end;[/co
ako dereferencovať pointer, ktorý ukazuje na reťazec S1?

Nie takto?
PString(S1)^;

Potreboval by som vytvoriť duplikát obsahu celého reťazca do dynamicky alokovanej pamäte, na ktorú ukazuje pointer.

Kód: Vybrat vše
var
  S1: string;
  Mem: Pointer;
begin
  S1:='Obsah reťazca';
  GetMem(Mem, Length(S1));
  Move(S1, Mem^, 4);
  ShowMessage(PString(Mem)^);
end;[


Ale ak procedúra Move naozaj kopíruje iba pointer na reťazec tak je to prúser.
8ball (novy)
Junior

Odeslat příspěvekod 8ball (novy) 2. 4. 2006 13:59

Už som na to došiel:

Kód: Vybrat vše
var
  S1: string;
  Mem: Pointer;
begin
  S1 := 'Obsah reťazca';
  SetLength(string(Mem), Length(S1));
  Move(PString(S1)^, Mem^, Length(S1));
  ShowMessage(string(Mem));
end;[
8ball (novy)
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků