Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Record direk kullanmakmı, pointera çevirmek mi ?
#1
Merhaba üstadlarım. Bir record nesnesini neden pointera çevirip kullanıyorlar ? Direk kullanımda mümkünken neden pointer çevirip kullanıyorlar ? Artıları nedir, doğru kullanım hangisidir açıklayabilecek birisi olursa çok sevinirim. 


 Söyle bir kullanım mümkünken ?

Isımler = packed record
   Isim : String;
   Soyisim : String;
   Yasi : Integer;
 end;

var
Isim : Isımler ;
begin
Isim.Isim : 'Ahmet';
Isim.Soyisim : 'Alkan';
Isim.Yasi : 15;
end;


Isımler = ^TIsımler;  -> Neden Pointera çeviriyoruz ? 
TIsımler = packed record
  Isim : String;
  Soyisim : String;
  Yasi : Integer;
end;

var
Isim : Isımler ;
begin
New(Isim);
Isim.Isim : 'Ahmet';
Isim.Soyisim : 'Alkan';
Isim.Yasi : 15;
end;
Finalize(Isim);
Cevapla
#2
Delphi ile derlediğiniz EXE programın kullanabildiği bir StackSize denen belleği var.

{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}

Eğer değişkenleri pointer yaparsanız bu belleğin dışında bilgisayarın bütün belleğini kullanabilirsiniz. Aksi halde MaxStakSize kadar bellete yer açabilirsiniz. (Diye biliyorum)
Cevapla
#3
Gerçek hayattan örnek vermek gerekirse:

Mesela bir projeden bir dll'ye çoklu veri göndereceksiniz. Önce o veriyi bir record tipiyle depo eder, hafızadaki bu yığının adresini parametre olarak yollarsınız. Karşı taraf ilgili adrese bakar ve eliyle koymuş gibi veriye ulaşır.

Yeri gelir bir başka dll'deki fonksiyon iş yapar bir yığın içerik üretir. Bu içeriği geri almak için bir record kümesine yığar ve sadece adresini geri döndürür. Siz de bu result ile gider toplanmış veriye ulaşırsınız.

Aynı proje içinden biriktirdiğiniz belki de bir sürü create edilmiş tip barındıran  içeriği, başka bir procedure içinde hafızayı boşaltmak  isterseniz de bu referans olarak pointer iyi bir şeydir.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#4
unit SharedMemory;

interface

uses
 Windows;

type
 TSharedMemory = class( TObject )
 private
   hFileMapping: THandle;
   FHandle: string;
   lp: pointer;
   FSize: integer;
   procedure SetContents(const Value: string);
   procedure SetHandle(const Value: string);
   function GetContents: string;
   procedure SetSize(const Value: integer);
 protected
 public
   constructor Create;
   destructor Destroy; override;
   property Contents: string read GetContents write SetContents;
 published
   property Handle: string read FHandle write SetHandle;
   property Size: integer read FSize write SetSize default 255;
 end;


implementation

constructor TSharedMemory.Create;
begin
//  inherited Create( AOwner );
 FSize := 255;
end;

destructor TSharedMemory.Destroy;
begin
 inherited Destroy;
 if lp <> nil then
   UnmapViewOfFile( lp );
 if hFileMapping <> 0 then
   CloseHandle( hFileMapping );
end;

function TSharedMemory.GetContents: string;
begin
 if lp = nil then
   Result := ''
 else
   Result := PChar( lp );
end;

function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;
asm
       PUSH    EDI
       PUSH    ESI
       PUSH    EBX
       MOV     ESI,EAX
       MOV     EDI,EDX
       MOV     EBX,ECX
       XOR     AL,AL
       TEST    ECX,ECX
       JZ      @@1
       REPNE   SCASB
       JNE     @@1
       INC     ECX
@@1:    SUB     EBX,ECX
       MOV     EDI,ESI
       MOV     ESI,EDX
       MOV     EDX,EDI
       MOV     ECX,EBX
       SHR     ECX,2
       REP     MOVSD
       MOV     ECX,EBX
       AND     ECX,3
       REP     MOVSB
       STOSB
       MOV     EAX,EDX
       POP     EBX
       POP     ESI
       POP     EDI
end;

function StrPCopy(Dest: PChar; const Source: string): PChar;
begin
 Result := StrLCopy(Dest, PChar(Source), Length(Source));
end;

procedure TSharedMemory.SetContents(const Value: string);
begin
(* If a mapping does not exist, do nothing *)
 if lp = nil then
   Exit;
 StrPCopy( lp, Value );
 FSize:=Length(Value);
end;

procedure TSharedMemory.SetHandle(const Value: string);
begin
 if FHandle = Value then
   Exit;
 FHandle := Value;
(* Close down any file mapping that may be currently open *)
 if lp <> nil then
   UnmapViewOfFile( lp );
 if hFileMapping <> 0 then
   CloseHandle( hFileMapping );
(* See if a file mapping already exists with this name *)
 hFileMapping := OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE, PChar( FHandle ) );
(* If not, create a new one *)
 if hFileMapping = 0 then
   hFileMapping := CreateFileMapping( $ffffffff, nil, PAGE_READWRITE or SEC_COMMIT, 0, FSize, PChar( FHandle ) );
 if hFileMapping = 0 then
 Begin
//    raise Exception.Create( 'CreateFileMapping failed with error code ' + IntToStr( GetLastError) );
 End;
(* Map the view of the file *)
 lp := MapViewOfFile( hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, FSize );
 if lp = nil then
 Begin
//  raise Exception.Create( 'MapViewOfFile failed with error code ' + IntToStr( GetLastError ) );
 End;
end;

procedure TSharedMemory.SetSize(const Value: integer);
begin
 FSize := Value;
end;

end.

Var
 OMemory:String='';
XSMemory:TSharedMemory;


procedure TForm1.Timer1Timer(Sender: TObject);
Var
MapName:String;
SMemory:TSharedMemory;

begin
// \BaseNamedObjects\G3:4441
Timer1.Enabled:=False;
MapName:=Edit1.Text;
If Length(MapName)>0 Then
Begin
 Form1.Caption:='Open';
 Application.ProcessMessages;
 SMemory:=TSharedMemory.Create;
 SMemory.Handle:=MapName;
 If (OMemory<>SMemory.Contents) Then
 Begin
  OMemory:=SMemory.Contents;
  Memo1.Lines.Add('>'+OMemory+'|');
 End;
 SMemory.Destroy;
 Form1.Caption:='Close';
 Application.ProcessMessages;
End;
Timer1.Enabled:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 xSMemory.Handle:=Edit1.Text;
 xSMemory.Contents:=Edit2.Text;
end;

Begin
xSMemory:=TSharedMemory.Create;
end.
Cevapla
#5
Cevap verdiğiniz için teşekkür ederim ustalarım. Anladığım kadarı ile bellek kullanımınu düzenli tutmak istersek pointer kullanımı her zaman daha ideal bir çözüm.
Cevapla
#6
(11-10-2021, Saat: 21:06)seci20 Adlı Kullanıcıdan Alıntı: Merhaba üstadlarım. Bir record nesnesini neden pointera çevirip kullanıyorlar ? Direk kullanımda mümkünken neden pointer çevirip kullanıyorlar ? Artıları nedir, doğru kullanım hangisidir açıklayabilecek birisi olursa çok sevinirim. 


 Söyle bir kullanım mümkünken ?

Isımler = packed record
   Isim : String;
   Soyisim : String;
   Yasi : Integer;
 end;

var
Isim : Isımler ;
begin
Isim.Isim : 'Ahmet';
Isim.Soyisim : 'Alkan';
Isim.Yasi : 15;
end;


Isımler = ^TIsımler;  -> Neden Pointera çeviriyoruz ? 
TIsımler = packed record
  Isim : String;
  Soyisim : String;
  Yasi : Integer;
end;

var
Isim : Isımler ;
begin
New(Isim);
Isim.Isim : 'Ahmet';
Isim.Soyisim : 'Alkan';
Isim.Yasi : 15;
end;
Finalize(Isim);

Selamlar,

Yeni versiyon Delphi'lerde (XE serisinde ve D10'da) type safety olayını sağlayabilmek için, bu tür durumlarda pointer kullanmak yerine Generic Array ve bunların elemanı olarak da Class kullanılıyor. Eğer Delphi sürümünüz destekliyorsa, ben de size bu tür kullanımı öneririm.
Cevapla
#7
(12-10-2021, Saat: 02:19)mustafaozpinar Adlı Kullanıcıdan Alıntı:
(11-10-2021, Saat: 21:06)seci20 Adlı Kullanıcıdan Alıntı: Merhaba üstadlarım. Bir record nesnesini neden pointera çevirip kullanıyorlar ? Direk kullanımda mümkünken neden pointer çevirip kullanıyorlar ? Artıları nedir, doğru kullanım hangisidir açıklayabilecek birisi olursa çok sevinirim. 


 Söyle bir kullanım mümkünken ?

Isımler = packed record
   Isim : String;
   Soyisim : String;
   Yasi : Integer;
 end;

var
Isim : Isımler ;
begin
Isim.Isim : 'Ahmet';
Isim.Soyisim : 'Alkan';
Isim.Yasi : 15;
end;


Isımler = ^TIsımler;  -> Neden Pointera çeviriyoruz ? 
TIsımler = packed record
  Isim : String;
  Soyisim : String;
  Yasi : Integer;
end;

var
Isim : Isımler ;
begin
New(Isim);
Isim.Isim : 'Ahmet';
Isim.Soyisim : 'Alkan';
Isim.Yasi : 15;
end;
Finalize(Isim);

Selamlar,

Yeni versiyon Delphi'lerde (XE serisinde ve D10'da) type safety olayını sağlayabilmek için, bu tür durumlarda pointer kullanmak yerine Generic Array ve bunların elemanı olarak da Class kullanılıyor. Eğer Delphi sürümünüz destekliyorsa, ben de size bu tür kullanımı öneririm.

Delphi'de bunun için bir örnek yaptım, kendi Git projelerime ekledim, şuradan ulaşabilirsiniz. Bir iki gün içinde bunun yapılma şeklini de anlatıp ekleyeceğim.
Cevapla
#8
@seci20 bu DelphiCan linkinde  henüz sizin sorunuzu kapsayan bir soru sorulmuş, örnekli cevap yazdım incelemenizi öneririm.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#9
(14-10-2021, Saat: 13:43)mrmarman Adlı Kullanıcıdan Alıntı: @seci20 bu DelphiCan linkinde  henüz sizin sorunuzu kapsayan bir soru sorulmuş, örnekli cevap yazdım incelemenizi öneririm.

Hocam bir kaç gündür hastaydım bakamadım. Çok teşekkür ederim yardımlarınız için.

(13-10-2021, Saat: 15:34)mustafaozpinar Adlı Kullanıcıdan Alıntı:
(12-10-2021, Saat: 02:19)mustafaozpinar Adlı Kullanıcıdan Alıntı: Selamlar,

Yeni versiyon Delphi'lerde (XE serisinde ve D10'da) type safety olayını sağlayabilmek için, bu tür durumlarda pointer kullanmak yerine Generic Array ve bunların elemanı olarak da Class kullanılıyor. Eğer Delphi sürümünüz destekliyorsa, ben de size bu tür kullanımı öneririm.

Delphi'de bunun için bir örnek yaptım, kendi Git projelerime ekledim, şuradan ulaşabilirsiniz. Bir iki gün içinde bunun yapılma şeklini de anlatıp ekleyeceğim.

Teşekkür ederim hocam. Bakacağım tekrar.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Json Veriyi Record Tipe Deserializede eksik değerlerin Null yapılabilmesi LastCoder 3 171 28-08-2021, Saat: 01:26
Son Yorum: LastCoder
  Record IsEmpty? civata 9 1.115 25-04-2021, Saat: 15:44
Son Yorum: civata
  FastReport sayıyı yazıya çevirmek Mikdad 2 1.331 11-05-2020, Saat: 15:53
Son Yorum: adelphiforumz
  array of record Sıralama yhackup 2 1.526 27-12-2019, Saat: 16:43
Son Yorum: yhackup
  Record Temizleme Hayati 9 3.921 24-10-2019, Saat: 09:40
Son Yorum: uparlayan



Konuyu Okuyanlar: 1 Ziyaretçi