Delphi for dongusundeki gariplik

Başlatan z, 18 Mayıs 2014, 16:29:18

z

       for  a:=0 to 127
           begin
                Data=Buffer[a];
                ......
           end;


Gibi donguleri debug ederken integer tanimlanmis a degiskeninin sirayla 128, 127 126, 125 degerlerini aldigini  goruyorum. Haliyle kodlarim yanlis calisiyor.

For dongusunde bu tersligin sebebi nedir?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

A nin yerel degisken olmasi gerekiyor. Hatta bununla ilgili warning cikmis fakat gözardı edilmis olabilir

muuzoo

Delphi'den anlamam ama, acaba derleme sırasındaki optimizasyonla alakalı olabilir mi? 127'ye eşitliği kontrol etmektense 0 eşitliği kontrol etmek daha kolay, derleyici bu yüzden loop sırasını mı değiştiriyor acaba?
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

Klein

Evet a nın yerel değişken olması gerek. Ancak global bile olsa böyle bir şey yapmaması gerekir.  Ben hiç rastlamadım böyle bir duruma.
koddaki tek hata 'for...'  satırının sonunda 'do' olmaması,  o da buraya yazılırken atlanmıştır.

t2

Sorun sadece global olmasından ibaret değildir. değişken global ise başka fonksiyonlar olaylar içinden  değiştiriliyor bu yüzden değeri istenen şekilde kalmıyor olsa gerek.

Salih

Ben şimdi kullandığım RAD 2010 da denedim, problem yok.
Değişkenler global tanımlı.

t2

Sizin denemede sorun cikmaz asıl program baska bir yerde global degiskeni bozuyor olsa gerek.

picusta

signed / unsigned meselesi, 
ya da step - 1 yapan bir yapi / parametre var.
a 'nin nasil tanimlandigini yazmamis arkadas.

Kabil ATICI

#8
@z
Kullandığınız Delphi sürümünü bilmiyorum, Delphi 7 üzerinde
for  a:=0 to 127 do
           begin
                Data=Buffer[a];
                ......
           end;

şeklinde kullanılıyor. Belirttiğiniz durumu başka bir değişken ile kullandığınız zaman da aynı şekilde hata oluşturuyor mu?
Yukarıdaki gibi mi yazdınızı, yoksa taşırken mi bir hata oldu?
Eşitlikte aşağıdaki gibi olması gerek .
Data:=Buffer[a]; //>>??

ambar7

z

Bu sorun cogu kez basima geliyor.

Klein evet buraya yazarken do yu unutmusum.

Sorunu for degiskeni yerine bir for dongusu icinde baska degisken kullanarak cozdum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Salih

Alıntı yapılan: t2 - 18 Mayıs 2014, 18:03:11
Sizin denemede sorun cikmaz asıl program baska bir yerde global degiskeni bozuyor olsa gerek.

Haklı olabilirsin. Fakat bozulma nasıl bir şeyse 128 den başlıyor. Tesadüf de olabilir.

z

for dongusunun daha girisinde ilk deger 0 olmasi gerekirken 128 ile basliyor.  Zaten bildigim kadariyla dongu icindeyken for degiskenine kendiniz forda tanimlanan haricinde deger falan atamiyorsunuz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

#12
Senin değişken %99 globaldir. zaten sorunun farkında olsan çözersin buraya yazmazsın. o değişken diğer fonrksiyonlar taradından değiştiriliyor bozuluyor. bu yüzden umduğun gibi olmuyor.

Sorunu gösterebilmek için basit bir örnek hazırlamak istesen muhtemelen sorun filan çıkmayacak. Orijinal program sorunlu. yerel zannettiğin değişken başka yerde kullanılıyor.  o  program olmamış, şişme yapar. baştan yaz onu.

z

#13
Tum kodu veremiyorum ote yandan kodda degisiklik yaptigimda sorun duzeliyor yada yeniden ortaya cikiyor.

Bu sabah gene ayni sorunla karsilastim.

Artik for dongusunu asagidaki gibi yapmaya karar verdim.

Sorun cikartabilen yapi asagida

for a:=0 to 100 do
  begin
       n:=Data[a]; 
       .....
       .....
       .....
  end;


Zorlama ile sorunu kaldirilmis yapi


b:=0;
for a:=0 to 100 do
  begin
       n=Data[b]; 
       .....
       .....
       .....
       b:=b+1;
  end;


for dongusu kodumda 0 dan basliyor artarak son degere gidiyor. Fakat bazi kodlarimda ise buyuk degerden 0 a geri sayarak gidiyor.

Kisa bir kodda bu sorunla karsilasir karsilasmaz yayinlayacagim.

@T2

Lokal degiskenler kullaniyorum. Global degisken kullanmis olup ornegin for a:=0 to 128 dongusunde a degerini bir sekilde 128 yazarak ezsem bile dongunun 128 127 126 seklinde ters yone saymamasi lazim lazim.

Sorun kesinlikle derleyicinin bir bugundan kaynaklaniyor. Derleyiciyi (D6) zamaninda crackli temin etmistim. Belki de ondandir. Update falan etmedim. Neyse zaten Delphi 7 indirdim de eve bir turlu yukleyemedim.

Yuklemeye de cekiniyorum. Isyerindeki makineye Delphi 7 yukledim. Evden de cok siradan bir kod goturup derledigimde bir dll olmadigi icin kizdi. Su siralar bu tip sorunlarla ugrasmak da istemiyorum.

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

Kabil ATICI

Buradaki anlatımlarınızdan uğraşmak zorunda kalacaksınız gibi görünüyor. Muhtemelen istediği dll ya o delphi serisinde olupta sonradan kaldırılan ya da sizin sonradan eklediğiniz  (veya aldığınız yerde eklenmiş) bir bileşen.
Bu işi zaman ayırıpta halletmediğiniz sürece ileride dar zamanınızda yapmak zorunda kalabilirsiniz.

Elbette tercih sizindir.
ambar7