nedir bu değişkenlerden çekdiğim :(

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

nedir bu değişkenlerden çekdiğim :(

Mesaj gönderen mkysoft »

daha önce değişkenlerin yaptığı azizliği gene yazmıştım. bunlar rahat durmuyor gene beni uğraştırıyor. Bu seferde double olarak tanımladığım değişkenlere textlerdeki float sayıları strtofloat ile atınca hiç bir problem gözükmüyor(debug ekranında değişken değerleri normal). Ama bu değişkene trunc yada int fonksiyonu yapıp tam kısmını almak istediğimde değişken tam sayı olarak gözükmesine rağmen bir aşağı yuvarlıyor.
örnek:
j:=5;
i:=int(j) //i'nin değeri 4 çıkıyor.
tabiki değeri elimle yazarsam problem yok. textlerden aktarınca böyle oluyor. sanki aktarılan sayı 4,9999999999999999999999 gibi davranıyor. dediğim gibi debug ekranında mouse ile üzerine geldiğimde 5 olarak görüyorum. değişken tipini extended yapınca düzeldi tabi. bu gidişle C 'ye geçecem. madem kullanamıyorum neden bu veri tipleri var? insan bir hata mesajı verir değilmi?

Anlattım rahatladım. Herkese iyi çalışmalar.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Yukarıdaki mesajı yazdıktan sonra hatanın yarısının giredildiğini fark ettim. Problemim hala devam ediyor. En iyisi gidip biraz uyuyayim. İşe yarayabilir :)

Kod: Tümünü seç

var
i,j,k:integer;
a,b,c,d:extended;
temp:string;
begin
 temp := '';
 a:=strtofloat(tx_uremes.text);
 b:=strtofloat(tx_uremei.text);
 c:=strtofloat(tx_uremea.text);
 d:=(a-b)/c;
 if int(d) <> abs(d) then //debug ekranında d'nin değeri tam sayı görüyorum ama delphi burada int(d) farklıdır abs(d) diyor.
   temp:='Üreme';
sabah ola hayrola.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Merhaba...

- Gerçekten takıldığın yerde ara vermek genellikle işe yarar. Düşen kod yazma performansını eski haline getirir.. :o

- Yukarda verdiğin örnekte bir hatan, yanlış uygulaman var... :oops: Böyle şüphelendiğin durumlarda, aşağıdaki yazdığım türden bir deneme yap ve sonucu gözlemle... Bence J değerini Textlerden de aldırsan yazdığın gibi direkt 5 vermiyorsundur, bir yerlerden 4,99 gibi bir değer alıyorsundur...

Kod: Tümünü seç

Var
  Str : String;
  I, J:Real;
begin
  Str := '5';
  J := StrToFloat(Str);
  I := Int(J);
  ShowMessageFmt('%f', [I]);
end;
Sonuç

Kod: Tümünü seç

  5,00
- Verdiğin koda hem de Double olarak uyarlarsak da aynısı...

Kod: Tümünü seç

var
  i, j, k : integer;
  a,b,c,d : double;
begin
  a:=strtofloat('20');
  b:=strtofloat('10');
  c:=strtofloat('2');
  d:=(a-b)/c;
  ShowMessageFmt('%f', [d]);
end;
Sonuç

Kod: Tümünü seç

  5,00
- ABS ve INT Fonksiyonların işlevleri farklıdır. ABS (-) yada (+) olan sonucu daima + olarak verir.. Yuvarlama ile ilişkisi yoktur. Sanıyorum başka biriyle karıştırdın...

- İşlevlerini test ederek görmek en güzeli. Aşağıdaki kodu bir buton altına yapıştır, farkı gör, dilediğini kullan..

Kod: Tümünü seç

    ShowMessageFmt('Değer = %f'#13'Int = %f'#13'Frac = %f'#13'Abs = %f'#13'Trunc = %d'#13'Round = %d', [(-4.99), Int(-4.99), Frac(-4.99), Abs(-4.99), Trunc(-4.99), Round(-4.99)]);
- Sonuç şu şekilde ;

Kod: Tümünü seç

Değer = -4,99
Int   = -4,00
Frac  = -0,99
Abs   =  4,99
Trunc = -4
Round = -5
Resim
Resim ....Resim
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

çok teşekkürler ben abs ve int fonksiyonunu if yapısı ile karşılaştırıyorum çünkü bölme işleminin kalansız olup olmadığını öğrenmem gerekiyor. abs ise eğer negatif bir sonuç varsa yine hata versin diye koydum. aslında textlerden her zaman 1 ile 0 arasında bir sayı geliyor. bölme işlemi sonucu bir integer çıkmasını bekliyorum. nteger değilse hata verecek. mod komutu burda çok işime yarardı ama değerler integer değil. değerleri 1000000 gibi bir sayıyla çarpıp mod almayı deneyeceğim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Zaten bu açıklamayı yapmasan söyleyeceğim ilk şey, "işaret değişikliği yapmanın ne anlamı var... Sonuç negatif olursa kesinlikle ve isteyerek durumu aleyhine dönüştürmüş oluyorsun" olurdu... :lol:

- Bu kadar real ortamda hala sorununu çözemediysen, tam olarak ne yapmak istediğini söylersen yardımcı olmaya çalışırız... :wink:

- Yoksa çalışmalarında başarılar... :idea:
Resim
Resim ....Resim
Cevapla