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 -> Tıklayın
Kişisel Tanıtım Sitem -> Tıklayın
20 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, Poliüretan
WWW
Cevapla
#4
(02-02-2019, Saat: 23:40)ssahinoglu Adlı Kullanıcıdan Alıntı: "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ı: Ç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 -> Tıklayın
Kişisel Tanıtım Sitem -> Tıklayın
20 y/o, sadece öğrenmeye odaklanmış, insancık..
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Exe veya Dll'yi Unit haline dönüştürmek carsoft 4 519 12-05-2020, Saat: 00:39
Son Yorum: carsoft
  Memo bileşeni Duplicate veya Put hakkında yardım kofmaster 6 756 11-04-2020, Saat: 22:39
Son Yorum: kofmaster
  Chromium (CEF4) ile sayfa kaynağını veya javascript çalıştırıp dönen değeri nasıl? adeministrator 8 1.037 04-04-2020, Saat: 19:56
Son Yorum: Ahmet İPEKÇİ
  değişken değerlere göre filtreleme seyyah 12 1.971 12-01-2020, Saat: 03:37
Son Yorum: seyyah
  Twebbrowser kullanmadan indy veya türevi bir bileşene js ve ajax ı kullanmak mümkünmü Ahmet İPEKÇİ 13 2.262 25-12-2019, Saat: 10:53
Son Yorum: Halil Han Badem



Konuyu Okuyanlar: 1 Ziyaretçi