Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
64 bit yazılım ilginç sorun.
#1
Arkadaşlar merhaba aşağıda yazdığım durumla hiç karşılaşan oldumu. Kolay bir çözüm varmıdır.

32 bit olarak geliştirdiğimiz windows vcl uygulamamızda bool değişkenler kullandık.
Normalde bool değişkene değer atamadığımız zaman bu değişkenin değeri false durumdadır.

Yani şöyle 
var
degisken1:bool;
begin
if degisken1=false then
 begin
//bu alan işletiliyor
end
else
begin
//bu alan işletilmiyor
end;


Fakat yazılımı 64 bit'e compile ettiğimizde değer ataması yapmadığımız bool değişkenleri delphi true olarak kabul etmekte.

var
degisken1:bool;
begin
if degisken1=false then
 begin
//bu alan işletilmiyor
end
else
begin
//bu alan işletiliyor
end;

Kullanılan versiyon : Embarcadero® Delphi 11 Version 28.0.46141.0937
Cevapla
#2
Merhaba merak edip biraz araştırma yaptım.

Öncelikle şunu belirteyim. Bool tipi değişken tanımlandığında daima başlangıç değerini kendiniz set edin. Aksi durumda bellekte adreslendiğinde rasgele bir değer alacaktır. Bu tesadüf eseri sürekli true yada false olabilir.

"A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero. If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True."

gibi bir yazı gördüm. bellekte ayrılan alan direkt sıfır değilse 1 bit bile true ise değişken değeri true olacaktır. Derleyici bu duruma bakıp atama yapıyor olabilir. Gene en doğrusu ilk durumunu elle set etmek mantıklıdır.

başka bilgi sahibi olan birileri varsa hep beraber öğreniriz Smile

https://docwiki.embarcadero.com/RADStudi...lean_Types
Cevapla
#3
@SercanTEK Size katılıyorum evet ilk başta bi değer set etmek gerekiyor. Ama işte geçmişten kalan alışkanlık değişken ilk oluşturulduğunda içinin boş veya false olduğunu düşünürüz.
Ama enteresan kısım bunu 32 bitte false kabul edip 64 bitte true kabul etmesi.
Cevapla
#4
(16-11-2022, Saat: 09:07)tuna Adlı Kullanıcıdan Alıntı: @SercanTEK  Size katılıyorum evet ilk başta bi değer set etmek gerekiyor. Ama işte geçmişten kalan alışkanlık değişken ilk oluşturulduğunda içinin boş veya false olduğunu düşünürüz.
Ama enteresan kısım bunu 32 bitte false kabul edip 64 bitte true kabul etmesi.

aslında kabul etmekten ziyade bellekte 8bit alan ayırıyor. Bu 8 bit farklı bir blok içinde alan olabilir ve 64bit uzunluğundaki bir alan içine girince 1 bit bile farklı denk gelme olasılığı artıyor olabilir. Buda true olmasına sebep veriyor olabilir. derleyiciler nedense yeni tanımlanan bir değişkene ilk değeri otomatik atamıyor. programcının atamasını uygun görüyor.

Bunun sebebinin 64bitte değişken uzunlukları daha uzun olduğu için derleyici belleği organize ederken bu şekilde olduğunu düşünüyorum.
Cevapla
#5
@tuna verdiğiniz örnek şablonunu 32bit ve 64bit olarak denediğimde bende hep "true" değeri döndü.

Delphide varmı bilmiyorum ama genellikle mikrodenetleyici lerde kullanılan derleyicilerin bazılarında #zero_ram benzeri direktifler bulunuyor. Bu direktif kullanılırsa, sistem açıldığında ram adres uzayı sıfır ile doldurulur. Buda varsayılan değer atamadığımız değişkenlerin, ramde tutulduğu hücrelerin sıfır olmasını sağlar.

Değişkenlere varsayılan değer atamak doğru bir yaklaşım, özellikle karşılaştırmalarda kullanılan değişkenlerde istenmeyen sonuçlara neden olmamak için daha da dikkat edilmesi gerekir.
Cevapla
#6
@frmman Hocam ben 32 bit yazdığım programı 64 bite çevirip derlerken bununla karşılaştım.
Kolay bir çözümü varmıdır diye merak etmiştim.
Bu bana bir ders olduğu için tüm oluşturduğum değişkenlere mutlaka başlangıç değeri veriyorum artık.

Cevaplarınız için çok teşekkürler.
Cevapla
#7
Bütün değişkenler için ilk değer atamasını yapmamak ölümcül bir hatadır. Boolean tipi olduğu için ilk değeri False alması şanstan ibarettir, bu her zaman öyle olmayabilir. İlk değeri verilmemiş değişkenler için bir procedure içinde False alırken başka bir procedure içinde True değeri alabilir. Zaten derleme yaparken altta warning olarak ilk değer ataması yapmadığınız bildiriliyordur ve bu hata yapmanıza sebep olacaktır.
Cevapla
#8
Derlemede çok sallamadığımız bu uyarıyı boşuna vermiyor demek ki.

[dcc32 Warning] XXXX.pas(755): W1036 Variable 'DEGISKEN' might not have been initialized
Cevapla
#9
@sabanakman Çok haklısınız hocam.
@m_ekici Aynen bu uyarıları gösteriyor ama hiç iplemiyoruz. Aslında açık açık "başına iş gelir böyle yapma" diyor Smile

Hepinize ayrı ayrı çok teşekkür ederim.
Cevapla
#10
Yazdığınız kodda

var
degisken1:bool;

diyerek bellekte bir alan tahsis edilmiş oldu ancak bu alana bir değer verilmedi.
bu tahsis edilen alanda daha önceden veri olabilir.

Kimi derleyicilerde bir takım tanımlamalar vardır. Başlangıçta bellek alanını sıfırla gibi ya da kod ile bu işlem gerçekleştirilir.

Ayrıca derleyicilerin(Object Pascal, C/C++ vb..) Optimizasyon ayarlarına göre (bu kimi derleyicilerde kademeler halindedir) yazdığınız kod bloğunu tamamiyle ortadan kaldırabilir.

if degisken1=false then
 begin
ShowMessage('bu alan işletilmiyor');
end
else
begin
ShowMessage('bu alan işletiliyor');
end;

yani yukarıdaki kodlamayı sadece aşağıdaki şekilde derleyeyip diğer kısımları gereksiz bularak siler.

ShowMessage('bu alan işletilmiyor');

derleme çıktısında
ShowMessage('bu alan işletiliyor');
kısmını hiç göremezsiniz.

Bu sadece Delphi'de değil bir çok platformda ve derleyicide(C/C++) geçerli bir durumdur. Bu nedenle tahsis edilen alana bir ön değer verilmesi gerekir.
SRHT
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  AdoQuery ile ilgili bir sorun. (Çözüldü) Bay_Y 4 1.179 17-04-2024, Saat: 10:58
Son Yorum: Bay_Y
  Plaka Tanıma Uygulamasındaki Sorun hk. delhici 9 4.994 03-01-2024, Saat: 09:44
Son Yorum: rabiasnlk
  Zirve Yazılım Satış Faturası Entegrasyonu Hk. pro_imaj 15 12.838 20-11-2023, Saat: 13:05
Son Yorum: hi_selamlar
  Tanımladığım record içindeki alanlardan biri ile ilgili sorun Bay_Y 2 1.120 07-03-2023, Saat: 12:03
Son Yorum: Bay_Y
  yazılım yükleme programı yasin21 3 2.359 12-12-2021, Saat: 10:38
Son Yorum: mrmarman



Konuyu Okuyanlar: 1 Ziyaretçi