Hata mesajı "Stack overflow"?...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Hata mesajı "Stack overflow"?...

Mesaj gönderen sertkayasalih »

Merhaba;

- Delphi'de yeni sayılırım :( Delphi 6 ve WinXP pro kullanıyorum.
Hazırladığım projemde EasyTable veritabanı kullanıyorum.

- Projemi derledikten sonra herşey çok güzel çalışıyor :lol:

- Derlediğim programımdan çıktıktan sonra "Stack overflow" mesajlı bir kutucuk çıkıyor. Tamam düğmesine tıkladıktan sonra kutucuk kapanıp yeni bir mesaj kutusu çıkıyor ve mesajı "Acces violation at address 00000000. Read of address 00000000." dır.
Bu mesaj kutusunun Tamam düğmesine defalarca tıklamama rağmen kapanmıyor. Ancak Windows Görev Yöneticisi'nden kapatabiliyorum.

- İngilizcem iyi olmadığı için problemin ne olduğunu anlayamadım :?:

- Bu problemi nasıl çözebilirim :?:

Yardımcı olan herkese şimdiden teşekkürler.
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Stack overflow kısır döngü sonucu oluşur. bir yerde programın kısır döngüye giriyor. kapanırken demişsin ozaman aklıma gelen eğer tablonun kapanışında tekrar tabloyu kapatmaya çalışırsan burada kısır döngü oluşur. Genelde bu hata bir component ın event ına yazdığın kod sebep olur. kapanışta çalışabilecek kod larını incele. Break point koyarak nerede kısır döngüye girdiğini bulabilirsin.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

freeman35 yazdı:Stack overflow kısır döngü sonucu oluşur. bir yerde programın kısır döngüye giriyor.
sizin tabirinizle kısır döngü sebeplerden birisi olabilir. belki sizin başınıza hep o durumlar için gelmiş olabilir.
Stack Overflow kısaca taşma olarak değerlendirilen standart programcı hatalarından birisidir. Haddinizi aştığınızı veya sisteme kullanmayı taahhüt ettiğiniz ve sistemin size (programınıza) ayırdığı hafıza alanından başka alanlara erişmeye çalıştığınızda oluşur.
Zaten devamındaki
Acces violation at address... hatası bunu anlatıyor.
Programınızdaki işaretçi kullanımını gözden geçirmeniz yardımcı olabilir. Genelde işaretçileri acemi kullanmaktan veya bir bileşene kullandırmaktan oluşur.
Ancak çok genel bir hata olduğunu akılda tutarak yaklaşırsanız daha verimli çözümler üretebilirsiniz.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

bu tarz hatalarda ben hep adım adım çalıştırma ile buluyorum problemi. F5 ile çalıştırdığınız olayın baına bir breakpoint koyun. Program o satıra geldiği zaman kontrol Delphi'ye geçer, F8 ile adım adım çalıştırarak devam edin ve sorunlu kodu tespit edip temizleyin.

Kolay gelsin.
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba Mustafa Hocam, freeman35 ve warder;

Öncelikle ilginiz için teşekkür ederim, çok sağolun.
Tavsiyeleriniz doğrultusunda projemi tekrar gözden geçirdim.
- Süzgeç olarak kullandığım form, AnaForm ile birlikte Create oluyor.
AnaForm'un OnDestroy olayında Free kodlamayı kullanıyorum.

- Alt form olarak kullandığım Süzgeç Formun Events-OnDestroy'da kullandığım Free kodlamayı iptal edince herşey normal oldu :)

Bu alt formda free olayını kaldırmam doğru mu :?:
En son sertkayasalih tarafından 05 Nis 2004 11:41 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

eğer Free'yi kaldırırsan (ve formun büyükse), programı 5-10 açış kapatıştan sonra memoryin dolacak ve eğer windows 98 kullanıyorsan mav bir ekran çıkacak(dadından yenmez)

şaka bir yana eğer Free kullanmazsan memorry kısa sürede dolarve sistem acaip derecede dengesiz çalışır.
En son mege tarafından 05 Nis 2004 11:53 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

OnDestroy yerine OnClose'da Free etmeyi dene.

Kolay gelsin.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

biraz karışık yazmışsın :?: bir şeyi tesadüfen kaldırman yada koyman sorunu çözebilir, ama mutlaka neden? diye sor kendine olmadık bir yerde başına problem çıkartabilir.
süzgeç gibi bir şey kullanacaksan o formu modal aç ve kapanana kadar kalsın yoksa karmaşa çıkabilir. gerektiği yerde göstermek içinse şöyle bir şey kullan

Kod: Tümünü seç

try
 XFrom := TSuzgecForm.Create(Application);// Modal açacaksananız Mutlaka Owner verin
XForm.Showmodal;
finally
if Assigned(XForm)then FreeAndNil(XForm);
end;
XFormun onclose yada destroy unda XForm u nilleme yada free leme

eğer modless yani show ile açılan bir formun memoryden tamamen gitmesi için
manual create ederken

Kod: Tümünü seç

  TForm.Create(Nil);
onclose eventinde

Kod: Tümünü seç

Action := caFree;
ondestroy event inde

Kod: Tümünü seç

 Form1 := nil;
kullanın.

create sırasında nil verme sebebim, eğer applicaiton yada bir owner form verilirse, bu memory bloğu application terminate edilene kadar memory tutuluyor. illegallik vs bir hata vermiyor, defalarcada create edip free leyebiliyorsunuz. Ama o memory bloğu tutuluyor, sanırım performans için böyle bir şey yapıyorlar. ben o yüzden nil veriyorum. Ama eğer ShowModal açılacaksa mutlaka owner verin. yoksa olmadık yerde hata veriyor. Tecrübeyle sabittir :)

Ayrıca ayrıca OnDestroy component ın handle ı yani memory bloğu bırakılmadan önceki son event tir. Ustalar manual create ettiğiniz işlemleri burda freeleyebilirsiniz derler.
Ben şahsen onclose yada OnCloseQuery de yapmayı tercih ediyorum. Hata olması durumunda hatayı yakalayıp, geriye dönebileyim diye
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba;

Sorunumu tavsiyelerinizle AnaFormdan SuzgeçFormunu açmak için aşağıdaki kodlamayla halletiğimi düşünüyorum. Şu anda saat gibi çalışıyor :)

Kod: Tümünü seç

Procedure AnaForm.btSuzClick(Sender);
begin
  SuzgecForm := TSuzgecForm.Create(Self);
  SuzgecForm.ShowModal;
  SuzgecForm.Free;
end;
freeman35,

- Son yazdığınız önerilerinizi de tekrar deneyeceğim.
Yukarda ki kodlama ile ilgili görüşünüz nedir :?:

İlginiz için tekrar teşekkür ederim.
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

Konu gayet açık aslında ama arkadaşlar alınmasın önerilerin tamamı temelde hatalı.
Nedir bu bahsettiğim temel.
OnCreate olayı içerisinde yarattırdığınız veya oluşturduğunuz hiç bir bileşen veya değişkeni free etmeye gerek yoktur. eğer öyle yaparsanız program kapanırken aynı kaynakları tekrar serbest bırakmaya çalışacaktır. inatla da bu isteğine devam edecektir. Bereket XP de çalışıyorsunuz. böyle durumlar sistem göçüğüne kadar gidilebilir. bu durumda access violation devreye girecektir.
Olmayan kaynağı (daha önce free ettiğiniz için) serbest bırakmaya çalışıyorsunuz. onDestroy değilde OnClose de free etseniz de aynı hatayı yapmışsınız demektir.
Neden herhangi bir yerde oluşturduğunuz bileşen veya değişkeni hemen oracıkta işi bitince serbest bırakabiliyorsunuz da OnCreate olayında oluşturduğunuzu bırakamıyorsunuz? vurgulamak istediğim ayrıntı burada yatıyor. Nesneler oluşturulurken OnCreate çalışır. siz birşey yazsanızda yazmasanızda çalışır. ve yok edilirkende OnDestroy çalışır. Yine sizin kod yazıp yazmadığınıza bakmaz. Size sunulan ekleme yapıp yapmayacağınızla ilgili bir events başka bir şey değil.
Buna göre OnCreate sırasında oluşturulmasını eklediğiniz hiç bir şeyi yok etmeye çalışmamanız gerekir. OnCreateye yazmak onların sorumluluğunu programa yüklemektir. Onlar otomatik yok edileceklerdir. Eğer amaç gerçekten bu değilse o zaman Nesne yönelimli programlama bilgisi eksikliği dolayısı ile acemiliktir.

Yazılan tüm mesajlardaki problem ve öneriler sınıflar hakkındaki eksik bilgilenmeden kaynaklanıyor.
Tabii bu durumu daha önceden derleyici farkedip eniyileme işlemi sırasında düzeltmediyse.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Kod: Tümünü seç

Procedure AnaForm.btSuzClick(Sender); 
begin 
  SuzgecForm := TSuzgecForm.Create(Self); 
  SuzgecForm.ShowModal; 
  SuzgecForm.Free; 
end;
yukardaki kodda modal form kapandıktan sonra free etmeye gerek yok
bildigim kadarıyla Create yordamına gecilen parametre o nesneyi otomatik olarak yok edecek nesneyi isaret eder
yukardaki ornekte ise Self modal formu cagıran formdur
eger isinizi garantiye almak ve yarat/yoket seklinde kullanacaksanız Create(nil) seklinde kullanın bence. o zamn

Kod: Tümünü seç

Procedure AnaForm.btSuzClick(Sender); 
begin 
  SuzgecForm := TSuzgecForm.Create(nil); 
  try 
    SuzgecForm.ShowModal; 
  finally
    SuzgecForm.Free; 
  end;
end;
seklinde kullanmanız gerekmekte.

Ben Sadece kendi olusturdugum ozel sınıflar/bilesenler icin Create(self) seklinde yapılandırıcı kullanmaktayım.ki ana sınıfın destroyu yordamında free lemeye gerek kalmasın.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

ben de Gökmen'in kullandığı yöntemi kullanıyorum. Bunda temel amacımda, formu gerektiği zaman create edip, işi bittiği zaman hafızadan silmek. Formların kapatılmasını program sonlanmasına bırakmak hafıza kullanımı için biraz kötü bir teknik değil mi?

Daha uygun bir metod önerisi varsa, ben de öğrenmekten çok memnun olurum.

Kolay gelsin.
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Değerli Kardeşlerim;

- Problemin asıl kaynağı benim bilgi eksikliğim ve acemi olmamdan kaynaklanıyor :oops:

- Burada sizlerin yardımlarıyla uygulamalı olarak bu sorunu en iyi şekilde çözdüğüme inanıyorum.

- gkimirti kardeşimizin son olarak cevapladığı şekilde,
bellek kaçağına meydan vermeden alt formları rahatça kullanabilmenin yöntemini öğrendim :)

- Sizlere zahmet verdim. Zaman ayırarak emek veren tüm kardeşlerime teşşekür ederim. Hepinizden Allah razı olsun. Hakkınızı helal edin :oops:
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

genel kurar:

herkes kendi oluşturduğu nesneyi yok etmekle sorumludur.

x:=Tx.Create(Owner);

şeklinde create etmiş olmanız bile x nesnesini sizin yok etmeniz her hangi bir sorun oluşturmaz ve böyle yapılması çoğu duruma göre tercih edilen yöntemdir.
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

sadettinpolat yazdı:genel kurar:

herkes kendi oluşturduğu nesneyi yok etmekle sorumludur.

x:=Tx.Create(Owner);

şeklinde create etmiş olmanız bile x nesnesini sizin yok etmeniz her hangi bir sorun oluşturmaz ve böyle yapılması çoğu duruma göre tercih edilen yöntemdir.
Aslında buna cevap yazmayacaktım üslup "bana cevap yazma" diyor ama prensiplerimle ters düşmek istemiyorum.
Yanlış anlaşılmasın ama:
hep programcıyız veya olmaya çalışıyor bu arada böyle ortamlarda yardımlaşmaya çalışıyoruz.
Varmı böyle bir genel kural gerçekten.
Programcılık mangal yakmak olmamalı. "ben bu taraftan üfürüyorum yanıyor" demekle programcılık olurmu dersiniz.
önüne gelen kural koyarsa yürürmü dersiniz.
Hadi kuralı koydun. kuralınla mutlu ol mutlu kal. Buraya bilende geliyor bilmeyende. bilmeyen bir arkadaşımız gerçekten öyle olduğunu düşünüp yanlış yollarda enerji sarfederse yakışırmı dersiniz.
prensiplerimle neden çeliştiğini açıklamaya çalıştım. yanlış bilginin karşısındayım.
En azından bilmediğimiz veya az bildiğimiz konularda "bana göre" veya "sanıyorum" gibi terimlerle ilerde bu topikleri okuması muhtemel arkadaşlarada gerekli esnek yapıyı oluşturamazmıyız.
Özetle kural koyucu arkadaşım, madem böyle bir kural vardı da neden problem sahibi (midijor) her şey yolunda giderken çuvalla hata mesajına gömüldü. Bu kuralı koyarken onuda okuyup değerlendirmişmiydiniz.
Sınıf veya nesnel programlama nasıl yapılır. Olmazsa olmazları nelerdir biraz karıştırmanızı öneririm.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Cevapla