Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Alakasız satırların programa etkisi
#1
Merhabalar,
Uygulamamda kullandığım bir fonksiyonun son satırlarında değerleri takip etmek için Memo ya bilgi olarak aktarıyorum.

(Kodu mantığı bozmayacak şekilde sadeleştirdim.)

Sorun yok:
function cc(c0 : TPointF; ................ sa1 : Single; out yx, xy : TPointF; ) : Integer;
var i0, i1, i2, i3 : single; //..........
begin
//....................
       if a and b then c := True;
       Form1.Memo1.Lines.Add(yx.X.ToString+'_'+xy.X.ToString);
       Form1.Memo1.Lines.Add(i0.ToString+'_'+i3.ToString);
       Form1.Memo1.Lines.Add(i1.ToString+'_'+i2.ToString);
   end;
end;
Bu şekilde kodu derleyip çalıştırırsam sorun yok.

Memoya bilgi aktarımını geçici süre durdurmak için aşağıdaki şekilde ilgili 3 satırı açıklama satırına döndürdüğümde foksiyon yanlış değer dönüyor olacak ki uygulama sıkıntı yaratıyor.

Sıkıntılı:
function cc(c0 : TPointF; ................ sa1 : Single; out yx, xy : TPointF; ) : Integer;
var i0, i1, i2, i3 : single; //..........
begin
//....................
       if a and b then c := True;
//       Form1.Memo1.Lines.Add(yx.X.ToString+'_'+xy.X.ToString);
//       Form1.Memo1.Lines.Add(i0.ToString+'_'+i3.ToString);
//       Form1.Memo1.Lines.Add(i1.ToString+'_'+i2.ToString);
   end;
end;
 Normal şartlarda bir sorun yaratmaz görünüyor. Ancak öyle değil.

 Bakın aşağıda sadece iki değerin aktarılmasından vazgeçtim ve yine sıkıntı yaşattı.
Sıkıntılı:
function cc(c0 : TPointF; ................ sa1 : Single; out yx, xy : TPointF; ) : Integer;
var i0, i1, i2, i3 : single; //..........
begin
//....................
       if a and b then c := True;
       Form1.Memo1.Lines.Add(yx.X.ToString+'_'+xy.X.ToString);
       Form1.Memo1.Lines.Add(i0.ToString+'_'+i3.ToString);
       Form1.Memo1.Lines.Add('_');
   end;
end;

Yani bu açıklama satırları kodların çalışmasını engelliyor. Bunun nasıl olduğunu anlamış değilim.

// Memo1.Lines.Add('xyzzz'); if a=b then c; şeklinde bir satırda iki kod satırı olsa kazara siliyorum diyeceğim. Ancak böyle bir durum söz konusu değil. Eğer kodlama yapısında bir hata yapmadıysam BUG görünüyor.

 Sorunu bulmak için biraz vakit alacağından öncelikle buraya yazdım. Bu şekilde bir sorunla karşılaştınız mı? Belki benden kaynaklıdır bu sorunları yaşamamak için ne önerirsiniz.






Daha önce benzer sorunu çok önceleri MikroPascal ile yaşamıştım.

//Kod1:
//.....
a:=5;
if a=5 then b:=10;
//........



//Kod2:
//........
a:=5;
a:=a;
if a=5 then b:=10;
//........


Sizce kod1 ve kod2'de b değeri kaç? Normal şartlarda her ikisinde b:=10 ancak MikroPascalda bazı durumlarda BUG oluşuyordu ve iki satır arasına Kod2'deki gibi herhangi bir kod yazarak bu BUG aşıyordum. Bu olayın ne zaman hangi satırda olacağı ise piyangoydu. Farkedebilirsen sac baş yolmaktan kurtuluyordun.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#2
try-finally bloğu içerisine kodlarınızı alıp tekrar deneyin..
Amatör Küme Bilgisayar Programcısı
WWW
Cevapla
#3
Hocam fonksiyonun içerisinde tanımladığın değişkenlerin ilgili form yada uses ile eriştiğin diğer formların genel VAR bloğunda tanımlı olmadığından emin ol. Yoksa fonksiyon arada açıklama satırları var diye yanlış çalışmaz, eğer çalışıyorsa yandık ki ne yandık Smile
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#4
1) Sadeleştirdiğim dediğin bu kodda da aynı sıkıntı var mı?
2) Memo'nun event'lerinde her hangi bir kod var mı?
Cevapla
#5
@barutali Herhangi bir hata almıyorum. Uygulama farklı çalışıyor.
@esistem uses ile math gibi sadece kurulumda gelen bileşenler eklendi. Formun var bloğunda tanımladığım bir değişken yok.
@edo 1) Sadeleştirmeyi sadece yayınlamak için yaptım. 2) Memo için herhangi özel bir şey yapmadım. Memo ile ilgili Add ve clear haricinde de bir kod yok.

Şimdi bir şey denedim. Çok ilginç.
Uygulamayı 32 bit geliştiriyorum. 64 bit derlemeyi denedim ve sıkıntı çıkmıyor.
Bu işte bir sıkıntı var.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#6
try - except değil.. try - finally içine almanı tavsiye etmiştim.

Benimde delphi de başıma gelen saçma bir olay olmuştu.. TPoint kullanmıştım. showmessage ile kontrol ettiğimde kod doğru çalışıyordu. showmessage ı kapatınca yine çalışmıyordu..
try - finally bloğuna aldıktan sonra düzelmişti.
Amatör Küme Bilgisayar Programcısı
WWW
Cevapla
#7
@barutali denedim ancak tam çözmüyor. Bu yüzden tam güvenme derim. En iyi çözüm fonksiyonu kullandıktan sonra ShowMessage kullanmak yada 32 bit yerine 64 bit derlemek.

Dediğin gibi bende TPointF kullanıyorum. Hatta ilgili fonksiyon 2 TPointF veri dönüyor. Buralara bir şey yapabilir miyim bir bakayım.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#8
(28-10-2016, Saat: 21:25)engerex Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol@barutali denedim ancak tam çözmüyor. Bu yüzden tam güvenme derim. En iyi çözüm fonksiyonu kullandıktan sonra ShowMessage kullanmak yada 32 bit yerine 64 bit derlemek.

Dediğin gibi bende TPointF kullanıyorum. Hatta ilgili fonksiyon 2 TPointF veri dönüyor. Buralara bir şey yapabilir miyim bir bakayım.

Merhaba,  
Uygulamam 64bit olarak çalışıyor uygulama.. try finally olayı işimi çözmüştü.. Hatta şimdi kontrol ettim. TPoint i de değiştirmişim. Kendim bir Record tanımlayarak yapmışım.
Amatör Küme Bilgisayar Programcısı
WWW
Cevapla
#9
Şimdilik iki fonksiyonu birleştirerek çözdüm. Bu konuyu ileride daha açık şekilde tekrar ele almak gerekecek.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi