[ query @ 23.04.2005. 21:05 ] @
1. Trebam da napravim obican program sto ce zamjenuti mjesta od dva pointera (tip ^String).
Primjer prije zamjene mjesta:
pointer1 - majmun
pointer2 - zec

Poslije zamjene mjesta:
pointer2 - majmun
pointer1 - zec

2. drugi program mora da zamjeni vrijednosti u dva pointer-a.
primjer prije zamjene:
pointer1 - majmun
pointer2 - zec

Poslije zamjene mjesta:
pointer1 - zec
pointer2 - majmun

Kako da ovo napravim? By the way nemam pojma kako se radi sa pointerima. Ovo mi treba za skolu.

Unaprijed hvala
[ Srki_82 @ 24.04.2005. 01:58 ] @
Mozes koristiti nesto ovako za promenu mesta bilo kojeg tipa promenljive. Jedino ti treba da znas koja je velizina te promenljive, a to se lako uradi samo pozivanjem SizeOf funkcije (SizeOf(Pointer) vraca velicinu pointera, SizeOf(Integer) velicinu integera, itd)
Code:
procedure SwapVar(var V1; var V2; Size: Integer);
var
  Temp: Pointer;
begin
  GetMem(Temp, Size);
  Move(V1, Temp, Size);
  Move(V1, V2, Size);
  Move(V2, Temp, Size);
  FreeMem(Temp, Size);
end;

Znaci ako imas dva pointera (P1 i P2) treba samo da pozoves
Code:
SwapVar(P1, P2, SizeOf(Pointer));
[ Rapaic Rajko @ 25.04.2005. 09:54 ] @
Evo primer nekog koda za rad sa string pointerima:

Code:

var 
  pstr1, pstr2: ^string; // u VCL-u postoji PString, koji je BAS TO
  atempstr: string;
begin
  // alociramo memoriju za pointere/stringove
  new(pstr1);
  new(pstr2);
  try
    pstr1^  := 'majmun';
    pstr2^ := 'zec';
    // neka zamena
    atempstr := pstr1^;
    pstr1^ := pstr2^;     
    pstr2^ := atempstr;
  finally    // oslobadjamo memoriju pointera/stringova
    dispose(pstr1);
    dispose(pstr2);
    pstr1 := nil; // ovo je dobra praksa, jer dispose() to NE RADI
    pstr2 := nil;
  end;  
end;


Vecinu programera zbunjuje to sto je string vec dinamicka konstrukcija, to jest neki string je POINTER na memoriju na heap-u. Pa po toj logici, ispada da je neki PString pointer na pointer na neku memoriju. Jeste, tako je, pa? Sve su to tekovine jezika sa kojima Pascal compiler (u slucaju Delphi 6-ice, verzija 14, racunato od legendarnog TurboPascal-a 1.0) izlazi lako na kraj; problem je u glavama programera da to shvate/prihvate. Za sve je potrebno iskustvo; samo polako...

Rajko
[ query @ 26.04.2005. 16:44 ] @
Hvala lijepo na odgovorima.

Napravila sam i tek sad vidim da i nije toliko tesko. :)
prvi primjer:

Code:

procedure TForm1.btnVerwisselClick(Sender: TObject);
var
 psP1,
 psP2,
 psP3 : ^String;
begin
  // 
  New (psP1);
  // 
  New (psP2);
  // 
  psP1^ := edtWoord1.Text;
  psP2^ := edtWoord2.Text;
  //Pointers omwisselen
  psP3 := psP1;
  psP1 := psP2;
  psP2 := psP3;
  //
  edtWoord1.Text :=  psP1^;
  edtWoord2.Text :=  psP2^;
  // Geef geheugen weer vrij
  Dispose (psP1);
  psP1 := NIL;
  Dispose (psP2);
  psP2 := NIL;
end;


Drugi primjer:
Code:

procedure TForm1.btnVerwisselClick(Sender: TObject);
var
 psP1,
 psP2,
 psP3 : ^String;
begin
  // 
  New (psP1);
  New (psP2);
  New (psP3);
  //
  psP1^ := edtWoord1.Text;
  psP2^ := edtWoord2.Text;
  // 
  psP3^ := psP1^;
  psP1^ := psP2^;
  psP2^ := psP3^;
  //
  edtWoord1.Text :=  psP1^;
  edtWoord2.Text :=  psP2^;
  // 
  Dispose (psP1);
  psP1 := NIL;
  Dispose (psP2);
  psP2 := NIL;
  Dispose (psP3);
  psP3 := NIL;
end;