Çok Yakında Yeni Bir Arayüzle karşınızdayız! http://yeni.delphican.com/

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Prosedür veya Fonksiyonda Değişken Zorunluluğu
#1
Herkese merhabalar,

Konuyu hangi başlıkla açmam gerektiğini pek çözemedim desem yeridir. Fonksiyon veya prosedür oluştururken bazen kullanıcının girmesi gereken tanımlamalara ihtiyaç duyarız. Delphi'de bazı fonksiyonlarda bu tanımlama var ama kullanıcı girmediği zaman bunu sanırsam default bir değere atıyor. Peki bunu nasıl yapıyor?

Örneğin FileExists() boolean fonksiyonunda FollowLink tanımı istenmekte; fakat ben buraya bir tanım girmediğim zaman yine de derlemeye devam ediyor ve hata istemiyor. 

Fonksiyonun kod yazılımına baktığımda: 

function FileExists(const FileName: string; FollowLink: Boolean = True): Boolean;
{$IFDEF MSWINDOWS}

 function ExistsLockedOrShared(const Filename: string): Boolean;
 var
   FindData: TWin32FindData;
   LHandle: THandle;
 begin
   { Either the file is locked/share_exclusive or we got an access denied }
   LHandle := FindFirstFile(PChar(Filename), FindData);
   if LHandle <> INVALID_HANDLE_VALUE then
   begin
     Winapi.Windows.FindClose(LHandle);
     Result := FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0;
   end
   else
     Result := False;
 end;

var
 Flags: Cardinal;
 Handle: THandle;
 LastError: Cardinal;
begin
 Flags := GetFileAttributes(PChar(FileName));

 if Flags <> INVALID_FILE_ATTRIBUTES then
 begin
   if faSymLink and Flags <> 0 then
   begin
     if not FollowLink then
       Exit(True)
     else
     begin
       if faDirectory and Flags <> 0 then
         Exit(False)
       else
       begin
         Handle := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil,
           OPEN_EXISTING, 0, 0);
         if Handle <> INVALID_HANDLE_VALUE then
         begin
           CloseHandle(Handle);
           Exit(True);
         end;
         LastError := GetLastError;
         Exit(LastError = ERROR_SHARING_VIOLATION);
       end;
     end;
   end;

   Exit(faDirectory and Flags = 0);
 end;

 LastError := GetLastError;
 Result := (LastError <> ERROR_FILE_NOT_FOUND) and
   (LastError <> ERROR_PATH_NOT_FOUND) and
   (LastError <> ERROR_INVALID_NAME) and ExistsLockedOrShared(Filename);
end;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
var
 StatBuf: _stat;
 M: TMarshaller;
begin
 if lstat(M.AsAnsi(FileName, CP_UTF8).ToPointer, StatBuf) = 0 then
 begin
   if S_ISLNK(StatBuf.st_mode) then
   begin
     if not FollowLink then
       Exit(True)
     else
     begin
       if stat(M.AsAnsi(FileName, CP_UTF8).ToPointer, StatBuf) = 0 then
         Exit(not S_ISDIR(StatBuf.st_mode));
       Exit(False);
     end;
   end;

   Exit(not S_ISDIR(StatBuf.st_mode));
 end;

 Result := False;
end;
{$ENDIF POSIX}

Şeklinde bir sonuç ortaya çıkıyor. Aklıma takılan bu olay nasıl oluyor. Kodu okumakta sorun yaşıyorum. Hele ki kaynak kodlarını...


Teşekkürler Smile
Yazılım Topluluğumuz -> Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Kişisel Tanıtım Sitem -> Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
19 y/o, sadece öğrenmeye odaklanmış, insancık..
WWW
Cevapla
#2
"Değişken:Tip = Değer" şeklinde tanımladığında varsayılan değeri vermiş olursun.

"FollowLink: Boolean = True" ile varsayılan olarak true verdiği için parametreyi tekrar belirtmene gerek kalmıyor.

Bunun dışında OVERLOAD (aşırı yükleme) dedikleri hemen her dilde geçerli basit bir yöntem de var. Özellikle C#'ta çok fazla sayıda kullanılıyor.

Overload yokken aynı işin farklı durumlarının her biri için ayrı fonksiyon hazırlardık.
Şimdi ise temelde aynı yöntem olmakla birlikte sadece parametreleri farklılaştırarak aynı isimde fonksiyonlar yazıp karmaşayı azaltıyoruz.

function Min(const A, B: Integer): Integer; overload; inline;
function Min(const A, B: Int64): Int64; overload; inline;
function Min(const A, B: UInt64): UInt64; overload; inline;
function Min(const A, B: Single): Single; overload; inline;
function Min(const A, B: Double): Double; overload; inline;
function Min(const A, B: Extended): Extended; overload; inline;

Bazen de sadece kendi kodumuzu düzende tutmak amacıyla veya parametreye değer atamanın yeterli gelmediği durumlar için kullanırız ve sahte fonksiyonlardan gerçek fonksiyonu çağırırız. INLINE'yi de tek satır kod için alt yordam çağrısı yapmak yerine kodu çağrıldığı kısma gömmesi için kullanırız.


procedure İşlemYap(a,b,c,d,e,f,g); overload;
begin
  //Asıl işlemler burada...
  ...
end;

procedure İşlemYap(); overload; inline;
begin
  // Bazı geçici işlemler burada...
  ...
  İşlemYap(a,b,c,d,e,f,g);
end;

En sonunda derleyici hangi fonksiyonun çağrıldığını anlamak için parametrelerin tiplerine bakıyor ve doğru fonksiyona gidiyor. Tabi overload edilen fonksiyonların parametre türleri sırayla aynı olduğunda da "ben bunların hangisinin çağrıldığını bulamayacağım" diyerek hata veriyor.
Cevapla
#3
Çok basit fonksiyon veya procedure çağırırken parametre girmeszsen varsayilan True değerine göre çalışıyor. Varsayilan değer atamak istediğin parametre sonuna eşittir ekle ve değer ver.

Sadece şuna dikkat et (bence bu Delphi de yapısal bir sorun ve bu şekilde katı kural olmamalı veya bilmediğim bir direktif var) Varsayilan değeri olan paratmetreden sonra normal Varsayilan değeri olmayan parametre veremiyorsun.
Örnek telefondan yazdığım için biraz formatsiz olacak ama

procedure getPersonelBilgi(pAd: string; pTip: integer = 1; pSoyad: string)
Yapamazsın Varsayilan değer verdiğin parametre sonda olmak zorunda.
PostgreSQL - Linux - Delphi, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#4
(02-02-2019, Saat: 23:40)ssahinoglu Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız."Değişken:Tip = Değer" şeklinde tanımladığında varsayılan değeri vermiş olursun.

"FollowLink: Boolean = True" ile varsayılan olarak true verdiği için parametreyi tekrar belirtmene gerek kalmıyor.

Bunun dışında OVERLOAD (aşırı yükleme) dedikleri hemen her dilde geçerli basit bir yöntem de var. Özellikle C#'ta çok fazla sayıda kullanılıyor.

Overload yokken aynı işin farklı durumlarının her biri için ayrı fonksiyon hazırlardık.
Şimdi ise temelde aynı yöntem olmakla birlikte sadece parametreleri farklılaştırarak aynı isimde fonksiyonlar yazıp karmaşayı azaltıyoruz.

function Min(const A, B: Integer): Integer; overload; inline;
function Min(const A, B: Int64): Int64; overload; inline;
function Min(const A, B: UInt64): UInt64; overload; inline;
function Min(const A, B: Single): Single; overload; inline;
function Min(const A, B: Double): Double; overload; inline;
function Min(const A, B: Extended): Extended; overload; inline;

Bazen de sadece kendi kodumuzu düzende tutmak amacıyla veya parametreye değer atamanın yeterli gelmediği durumlar için kullanırız ve sahte fonksiyonlardan gerçek fonksiyonu çağırırız. INLINE'yi de tek satır kod için alt yordam çağrısı yapmak yerine kodu çağrıldığı kısma gömmesi için kullanırız.


procedure İşlemYap(a,b,c,d,e,f,g); overload;
begin
  //Asıl işlemler burada...
  ...
end;

procedure İşlemYap(); overload; inline;
begin
  // Bazı geçici işlemler burada...
  ...
  İşlemYap(a,b,c,d,e,f,g);
end;

En sonunda derleyici hangi fonksiyonun çağrıldığını anlamak için parametrelerin tiplerine bakıyor ve doğru fonksiyona gidiyor. Tabi overload edilen fonksiyonların parametre türleri sırayla aynı olduğunda da "ben bunların hangisinin çağrıldığını bulamayacağım" diyerek hata veriyor.

Bilgilendirme için teşekkür ederim hocam.

(02-02-2019, Saat: 23:43)3ddark Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Çok basit fonksiyon veya procedure çağırırken parametre girmeszsen varsayilan True değerine göre çalışıyor. Varsayilan değer atamak istediğin parametre sonuna eşittir ekle ve değer ver.

Sadece şuna dikkat et (bence bu Delphi de yapısal bir sorun ve bu şekilde katı kural olmamalı veya bilmediğim bir direktif var) Varsayilan değeri olan paratmetreden sonra normal Varsayilan değeri olmayan parametre veremiyorsun.
Örnek telefondan yazdığım için biraz formatsiz olacak ama

procedure getPersonelBilgi(pAd: string; pTip: integer = 1; pSoyad: string)
Yapamazsın Varsayilan değer verdiğin parametre sonda olmak zorunda.

Teşekkür ederim üstat.
Yazılım Topluluğumuz -> Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Kişisel Tanıtım Sitem -> Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
19 y/o, sadece öğrenmeye odaklanmış, insancık..
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  değişken sayıyı belirli sayılara dağıtma osiso 6 279 10-09-2019, Saat: 11:28
Son Yorum: osiso
  Çözüldü Fastreport degisken alan yazdırma cinarbil 5 839 25-04-2019, Saat: 16:37
Son Yorum: cinarbil
  Değişken' den sql in içerisini doldurma onurakman 5 494 25-04-2019, Saat: 03:46
Son Yorum: onurakman
  Ethernet kablosu takılı veya değil. ? Bay_Y 18 1.570 21-03-2019, Saat: 15:34
Son Yorum: Bay_Y
  SQL Tablo Var veya Yok Kontrolu !! OZCANK 8 1.110 13-02-2019, Saat: 08:30
Son Yorum: Tuğrul HELVACI



Konuyu Okuyanlar: 1 Ziyaretçi