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?
A nin yerel degisken olmasi gerekiyor. Hatta bununla ilgili warning cikmis fakat gözardı edilmis olabilir
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?
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.
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.
Ben şimdi kullandığım RAD 2010 da denedim, problem yok.
Değişkenler global tanımlı.
Sizin denemede sorun cikmaz asıl program baska bir yerde global degiskeni bozuyor olsa gerek.
signed / unsigned meselesi,
ya da step - 1 yapan bir yapi / parametre var.
a 'nin nasil tanimlandigini yazmamis arkadas.
@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]; //>>??
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.
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.
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.
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.
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.
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.
Belki pointer yanlış kullanıldı. Ondan oldu.
Bug dan değildir.
Z, suçlu kesin sensin.
Delphi 6'dan 7'ye terfi edin derim. 150MB'lik modifiyeli Delphi 7 hafif taşınabilir sürüm mevcut. Kurmakla uğraşmazsınız. Kilitlenme sorunu olursa bir defaya mahsus ayarlardan bir seçeneği değiştirmek gerekebilir. Windows 8 ile çalışmayabilir.
Delphi 7 yi iş yerinde kurdum. Dediğim gibi Delphi 6 da standart pakete hiç bir şey ilave etmeden daha önce yazdıgım programı Delphi7 de derleme aşamasında uses satırındaki bileşenlerden birisine ait dll eksikliği hatası alınca eve kurmakta acele etmiyorum.
Değişken lokal olsa da bir pointer vasıtasıyla dışarıdan değiştirilmiş olabilir mi? ^işaretinin yanlış kullanımı?
Alıntı yapılan: z - 18 Mayıs 2014, 16:29:18
for a:=0 to 127
begin
Data=Buffer[a];
......
end;
Kodum aynen böyle. a degişkenine hiç bir şekilde müdahale etmiyorum. Zaten for döngüsüne başlar başlamaz a, 0 ile değil 127 yada her neyse onunla başlıyor. Tek tek geriye sayıyor.
Bunu benim hatam olarak açıklamak çok zor. Pointer vs kullanmıyorum. Neyse ilk fırsatta örnek yayınlayacağım.
Dediğine benzer standart bir bileşenin yazımı bir kaç sürümde farklı yazıma sahip. (DesignIntf, DesignEditors, DsgnIntf...) Böyle bir şey ekli mi? (Geçerli güncel yazım: DSIntf)
"Z" senin buffer'a gelen veride sorun olabilir mi yada Buffer in tipinde?
for a:=0 to 127 do begin
Buffer[a]:=a;
Data:=Buffer[a];
end;
bu şekilde dener misin?
Yok hocam for dongusu for a:=0 to 100 olarak yazdigim dongu calismaya basladiginda for a:=100 downto 0 tipinde calisiyor.
Kodlari adimlatirken a degiskenine bakiyorum sorunu burdan yakaliyorum zaten.
Sorunu görmek için, sıfır proje hazırlamak 1 dakika kadar sürecektir. Uzun bir süre olsa gerek. File > new> application..
for a:=0 to 127
begin
sayi=a
......
end;
böyle yapıp tüm sayiları inttostr(sayi) ile memo içine veya metin dosyaya satır satır yazdırın. göreceksiniz negatiften başladığı yoktur.
Data veya Buffer belki yanlış tanımladınız ki bu soruna yol açtı
Alıntı yapılan: z - 07 Haziran 2014, 23:21:22
calismaya basladiginda for a:=100 downto 0 tipinde calisiyor.
Kodlari adimlatirken a degiskenine bakiyorum sorunu burdan yakaliyorum zaten.
Görüntüleme biçimini yanlış seçmişsinizdir. byte olan değişkeni signed integer veya shortin olarak göstermeye çalışıyor olabilir. a değişkenini nasıl gözlemlediniz? ona da bir baksak hep beraber hak versek.
sıfır bir proje yapıp sorunu gösterseniz çok mu zor ? Muhtemelen o zaman sorun çıkmayacak.
Yillardir delphi kullanirim boyle bir hataya rastlamadim.
Degisken tanimlarinizda bir problem olabilir.
Sifir basit bir ornek uygulama yazip buraya gonderebilirseniz bakariz. Bu sekilde yorum yapmak bosa kurek cekmek gibi.
Sıfır projede sorun belki hiç yaşanmaz. Projenizi kopyalayıp görmemizi istemediğin yerleri silip yollarsan daha uygun olur.
Alıntı yapılan: z - 18 Mayıs 2014, 16:29:18
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?
Olay çözüldü mü?
Dögüdeki a değişkeni Integer mi ShortInt mi?
Sorun çözülmedi fakat for döngüsündeki değişkeni döngü içinde kullanmayarak işimi görüyorum.
Bu durumda for döngüsüne girmeden önce bir başka değişkeni sıfırlıyorum. Döngünün içinde de bunu artırıyorum. Döngü içindedeyken asıl döngü değişkeni yerine bu yardımcı değişkeni kullanıyorum.
Değişken olarak integer değişken kullanıyorum.
func(const char *buffer) {
int a;
for(a = 0; a < 127; ++a) {
Data = buffer[a];
}
}
Eğer döngü fonksiyon içindeyse, fonksiyon parametresini "const" tanımlayıp denermisiniz?
Sanırım pointer, a değişkeninizi eziyor.
Delphiden anlamam.
Bugün bir hesap makinası kurcalıyordum. Veri tipi işaretli 8 bitti. 120 121 122 123 124 125 126 127 diye arttırırken -128, -127 -126 -125 diye devam etti. Negatif olması dışında dizin tanımlamanıza uyuyordu. Delphini tepkisini merak edip uygulamaya çalıştığımda xe6 bu hatayı vermedi.