Halt benzeri bir komut ariyorum

Başlatan bunalmis, 04 Nisan 2010, 18:12:26

z


Exeption kullanın denmiş fakat,

100 tane fonskiyonum olsa herbirine tek tek exeption ilave etmem gerekmeyecekmi?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

orhanc

sorunu söylersen ona göre cevap vermek daha kolay olur.
i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

#17
Alıntı yapılan: Tagli - 09 Nisan 2010, 11:52:41
t2,
Bunlar dolambaçlı yöntemler. Exception yöntemi ise tam da bu tür işler için idealdir. Hataların sınıflandırılmasını, istenilen yerde istenilen şekilde çözülmelerini ve programın her yerinde "if" kullanmadan kontrol edilebilmelerini sağlar. "Hata" dediğim şey gerçek anlamda bir hata olmayıp kullanıcının oluşturduğu bir durum da olabilir.

orhanc,
bunalmis sadece örnek vermiş. 100 değil de 5 tane olsun, mantık aynı. Sayı az diye her fonksiyonun içine bir boolean değişken koyup kontrol etmek doğru olmaz. Belki iş görür ama iyi bir programcının yapacağı şey değil, özellikle de exception desteği veren yüksek seviye bir dil ile uğraşılıyorsa.

Aynı değil işte. Her soruna değişik çözümler bulunabilir.

Bu yazıyı bir incelemenizi tavsiye ederim.
http://en.wikipedia.org/wiki/Spaghetti_code

Ben PIC programlamaya yeni başladım ve görüyorum ki pic programcılarının çoğu çok gereksiz ve uzun kodlar yazıyorlar. Biz web veya windows programcılığında en kısa haliyle işi çözmek için uğraşırız.
i'm doing nothing... Giddy Up  http://www.drorhan.com

Tagli

Alıntı yapılan: bunalmis - 09 Nisan 2010, 11:56:36100 tane fonskiyonum olsa herbirine tek tek exeption ilave etmem gerekmeyecekmi?
Hayır. Bir fonksiyonda exception oluşursa ve içerde çözümlenemezse, oluştuğu fonksiyonu sonlandırarak bunu çağıran bir üst fonksiyona gider (benim deyimimle "kaçar"). Herhangi bir "catch" bloğunda yakalanmadığı sürece yukarı doğru kaçmaya devam eder ve yolu üzerindeki fonksiyonları da sonlandırır. En sonunda kendini yakalayabilecek bir "catch" bloğuna denk geldiğinde, o bloktaki işlemler yapılır. Exception'lar da birer nesnedir. Oluşturulduğu yerde içlerine bilgiler yüklenebilir, bu bilgilere yakalandıkları yerde erişilebilir. Ayrıca sınıflandırılabilirler. Bunu, Java için konuşmak gerekirse, Exception class'ını extend ederek kendimiz bir class oluşturarak yaparız. "catch" bloklarını da kendi oluşturduğumuz bu class'ı (yani exception'u) yakalayacak şekilde ayarlayabilirz.

Delphi'deki exception'ların Java'dakilerden ne kadar farklı olduklarını bilmiyorum. Delphi'de exception olduğunu da zaten 10 dakika önce Google'da yazınca öğrendim.
Gökçe Tağlıoğlu

hasangurlek

Birbirini çağırmış 100 tane fonksiyon 100 katlı bina ve 100. Fonksiyon "Çatı" ise, Halt komutu çatıya çıkanın "aşağı atlaması" olur.

Eğer sub rutini çağırmışsanız bir üste dönmeniz şarttır.

Birinci sebebi stack yönetimi ilk giren ilk çıkar kaidesiyle yönetilir.

İkincisi sistem sizin üst rutinlerde yarattığınız nesnelerin sonlandırma bilgisine ihtiyaç duyar ve bu bilgi rutin sonlandırıldığında ortaya çıkar bu sayede çöp toplayıcı bellekten artık kullanmadığınız alanları temizler.

Assembly ile stack yığınındaki dönüş adresi değiştirilebilir ancak yığın sayısı azaltılamaz. 100 rutin çağırmışsanız 99 tanesi stackde kalır. Bu durumda bir müddet sonra stack owerflow hatasının fırlatılmasına sebep olur.


Sub1(Kosul)
if Kosul=Dogru then Sub2(Dogru)
End Sub1

Sub2
if Kosul=Dogru then Sub3
End Sub2

Sub3
if PortXXX=H17 then Sub4
End Sub3

Sub4
if MemoryXXX<>H717234 then Sub5
End Sub4

Sub5
try
if Handle=DogruDeger then
return
else
SubXXX
end if
catch ex as exception
hatayı işle
end try
End Sub5


Stack yığını yukardaki yapı benzeri iç içe geçmiş 1000 alt rutin çağrısından oluşsa bile;

Top stacke geri dönmeyi gerektirecek en alt rutinden itibaren kod akışı hiç bir şeyi etkilemeyecek bir hızda roota döner. (çağrı yapan üst rutinlerde dönüş aşamasındada bir işlem yoksa)

Dönüş aşamasındada bir işlem varsa zaten oradaki işlemin yapılması gerekeceğinden Top stacke direk dönmek çözüm olamaz.

Hata yakalama için kullanılan Exception sınıfı hiç bir şekilde stack yığınını boşaltmaz. Kod akışını  try-catch bloğu içinde hatanın oluştuğu satırdan sonraki kodların işletilmeden catch satırına yönlendirilmesini sağlar. Yani bir üst rutine dönüşte exception sınıfının hiç bir etkisi yoktur. try blokları sadece programın kırılmasını engeller. Programın Trust olarak tanımlanabilmesi için her kritik kod için kullanılması zorunludur ve hatta kritik kodlar öncesinde "ben şu dizindeki şu dosyayı yazmak için açacağım, müsade edermisin ?", "Ben regde şunu değiştirecem" vs. diye sistemden izin alınması tavsiye edilir :)
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

z

#20
Mikroişlemci üzerinde kod yazıyor olsaydım örnek sorudaki gibi dallanıp budaklanıp programın ucra noktalarından bir yere gelmiş olsaydım ve herseye ilk kez başlıyormuşum durumuna dönmek isteseydim reset vektörüne uçmam yeterliydi yada Stack registeri stagın başına çekip ana rutine zıplayabilirdim.

(Tabi interrupları geçici süre için askıya alırdım. Bunlar teferruat kısmı.)

Burada ise windows gibi el dikiyle bir şeyler yapmaya çalışıyoruz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Alıntı yapılan: Tagli - 09 Nisan 2010, 12:06:36
Alıntı yapılan: bunalmis - 09 Nisan 2010, 11:56:36100 tane fonskiyonum olsa herbirine tek tek exeption ilave etmem gerekmeyecekmi?
Hayır. Bir fonksiyonda exception oluşursa ve içerde çözümlenemezse, oluştuğu fonksiyonu sonlandırarak bunu çağıran bir üst fonksiyona gider (benim deyimimle "kaçar"). Herhangi bir "catch" bloğunda yakalanmadığı sürece yukarı doğru kaçmaya devam eder ve yolu üzerindeki fonksiyonları da sonlandırır. En sonunda kendini yakalayabilecek bir "catch" bloğuna denk geldiğinde, o bloktaki işlemler yapılır. Exception'lar da birer nesnedir. Oluşturulduğu yerde içlerine bilgiler yüklenebilir, bu bilgilere yakalandıkları yerde erişilebilir. Ayrıca sınıflandırılabilirler. Bunu, Java için konuşmak gerekirse, Exception class'ını extend ederek kendimiz bir class oluşturarak yaparız. "catch" bloklarını da kendi oluşturduğumuz bu class'ı (yani exception'u) yakalayacak şekilde ayarlayabilirz.

Delphide Try Exception var. Bunları 1/0, strtoint gibi hata üretme ihtimali olan kodların hata durumunda özel işlemler yapmada kullanıyorum.
Fakat Try exception ı sorumdaki duruma nasıl uyarlayacağımı anlayamadım.



Delphi'deki exception'ların Java'dakilerden ne kadar farklı olduklarını bilmiyorum. Delphi'de exception olduğunu da zaten 10 dakika önce Google'da yazınca öğrendim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

hasangurlek

İşletim sistemlerinede hak vermek lazım,

1,2,3 bilemedin 4 tane işlemciyle binlerce process kontrol et, milyarlarca bit arasında git gel, bide bunlar yetmiyomuş gibi orana burana mikrofon, hoporlör jakı, usb konnektörü soksunlar,

"dünyanın en mutlu, en zengin, en sağlıklı adamı olcan, 500 senede ömür verecez deseler" windowsun arkada uğraştıklarıyla uğraşmam :)
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

Tagli

#23
hasangurlek, senin koda döktüğün yapı benim anlatmaya çalıştığımdan farklı olmuş. Ben "catch" bloğunun en derinde değil en üstte olmasından bahsetmiştim, yani sub1'de. sub5'te sadece "throw new Exception();" benzeri bir satır olacak, sub2, 3, 4 ve 5'te "catch" bloğu olmayınca exception 1'e kadar kaçıp sub1'deki catch'e yakalanacak. Bu durumda sub2, 3, 4 ve 5'in sonlanması gerekir, stack'te de adresleri kalmaz diye biliyorum.
Gökçe Tağlıoğlu

Klein

#24
Aradığınız komut EXIT olabilir mi?

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,qdialogs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  h,t,z:integer;
  sbit:boolean;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    h:=0;
    sbit:=false;
    while h < 1000 do
    begin
      t:=0;
      h:=h+1;
      canvas.TextOut(0,0,inttostr(h));
      application.ProcessMessages;
      while t < 1000 do
      begin
        z:=0;
        t:=t+1;
        canvas.TextOut(0,20,inttostr(t));
        application.ProcessMessages;
        while z < 1000 do
        begin
          z:=z+1;
          canvas.TextOut(0,40,inttostr(z));
          application.ProcessMessages;
          if sbit = true then exit;
        end;
      end;
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  application.MessageBox('Program sonlandı','EXIT Ornegi',0);
  sbit := true;
end;

end.


Düzeltme:  İstediğiniz şeyin , farklı fonksiyonları aynı anda sonlandırmak olduğunu, mesajı yazdıktan sonra farkettim.

hasangurlek

Alıntı yapılan: Tagli - 09 Nisan 2010, 12:29:29
hasangurlek, senin koda döktüğün yapı benim anlatmaya çalıştığımdan farklı olmuş. Ben "catch" bloğunun en derinde değil en üstte olmasından bahsetmiştim, yani sub1'de. sub5'te sadece "throw new Exception();" benzeri bir satır olacak, sub2, 3, 4 ve 5'te "catch" bloğu olmayınca exception 1'e kadar kaçıp sub1'deki catch'e yakalanacak. Bu durumda sub2, 3, 4 ve 5'in sonlanması gerekir, stack'te de adresleri kalmaz diye biliyorum.

Evet sizin yazdığınızda bir yöntem ama try-catch bloğu arasındaki her birim kod izlemeye alındığı için önemli derecede kaynak israfına sebep olur. Bunun için kritik kodların blok içine alınması daha doğrudur. Bu blok ilk rutinde olduğunda alttaki tüm kod hata izlemek üzere takibe alınır. Farklılıkları dosyanın varlığı, okuması vs. hakkında koda dökersek ;

    Private Sub FileProcesses()
        Try
            FileReadProcess("C:\test.txt")
        Catch ex As Exception
            MessageBox.Show("Dosya hatası")
        End Try
    End Sub

    Private Sub FileReadProcess(ByVal FileName As String)
        Dim FS As FileStream = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
        Dim SR As StreamReader = New StreamReader(FS, Encoding.UTF8)
        Dim Str As String = SR.Read()
        SR.Close()
        FS.Close()
    End Sub


Bu kod daha performanslı koşacak durumda;

    Private Sub FileProcesses()
        If FileReadProcess("C:\test.txt") Then
            'İŞLEMLER
        End If
    End Sub

    Private Function FileReadProcess(ByVal FileName As String) As Boolean
        Dim FS As FileStream = Nothing
        Try
            FS = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
        Catch ex As Exception
            MessageBox.Show("Dosya okuma hatası")
            Return False
        End Try
        Dim SR As StreamReader = New StreamReader(FS, Encoding.UTF8)
        Dim Str As String = SR.Read()
        SR.Close()
        FS.Close()
        Return True
    End Function


Bu çok daha hızlı koşacaktır;

    Private Sub FileProcesses()
        If File.Exists("C:\test.txt") Then
            FileReadProcess("C:\test.txt")
            'İŞLEMLER
        Else
            MessageBox.Show("Dosya bulunamadı")
        End If
    End Sub

    Private Sub FileReadProcess(ByVal FileName As String)
        Dim FS As FileStream = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
        Dim SR As StreamReader = New StreamReader(FS, Encoding.UTF8)
        Dim Str As String = SR.Read()
        SR.Close()
        FS.Close()
    End Sub


Microsoft amcanın tavsiye ettiği;

    Private Sub FileProcesses(ByVal ReadOrWrite As Boolean, ByVal FileName As String)
        If ReadOrWrite Then
            If FileReadProcess(FileName) Then
                'ISLEMLER
            End If
        Else
            'YAZMA
        End If
    End Sub

    Private Function FileReadProcess(ByVal FileName As String) As Boolean
        If File.Exists(FileName) Then
            Dim Permission As New System.Security.Permissions.FileIOPermission( _
            System.Security.Permissions.FileIOPermissionAccess.Read, FileName)
            Try
                Permission.Demand()
                Try
                    Dim FS As FileStream = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
                    Dim SR As StreamReader = New StreamReader(FS, Encoding.UTF8)
                    Dim Str As String = SR.Read()
                    SR.Close()
                    FS.Close()
                    Return True
                Catch ex As Exception
                    MessageBox.Show("Dosya okuma hatası")
                End Try
            Catch ex As Exception
                MessageBox.Show("Kullanıcı yetkiniz dosya okuma işlemi için yeterli değil")
            End Try
        Else
            MessageBox.Show("Dosya bulunamadı")
        End If
        Return False
    End Function


En sondaki tavsiyeye uyuyormusun diye bana sorarsanız özellikle son 2 aydır sistemden izin almak dahil evet. Herhangi bir makinede hiç ummadık bir zamanda programın kırıldığına şahit olmuşluğum çok fazla. Vatandaş girmiş internete okumuş birşeyler ve hemen öğrendiklerini uygulamış sonra arıyor ;

Alıntı Yap
Şikayet : Program açılmıyor, bu ne yahu kullanamayacakmıyız biz bunu !

Soru : Programa tıklayınca hata mesajı vermedenmi kapanıyor ?
Kullanıcı: evet, hiçbişi yapmıyo

Soru : Şu klasöre bak, şu dosya duruyormu ?
Kullanıcı: (10 dakka sonra) Evet, burda

işi gücü bırakıp gidip bakıyorsun

Soru : Dosya izinleri ile kim oynadı ?
Kullanıcı : Virüs bozmasın diye biz yaptık !

İyide kardeşim veri dosyalarının, konfigürasyon dosyalarının izinlerini iptal edersen program nasıl okucek, yazcek ?
Cevap : Biz sandıkki şey, eeee


Bülent hocam affola, delphi arenasını basice döndürdüm, hakkını helal et.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

orhanc

Programını Yönetici olarak çalıştırırsan öyle bir sorunun oluşmaması gerekiyor.
i'm doing nothing... Giddy Up  http://www.drorhan.com