ldiv() sorunu

Başlatan zamzam23, 12 Ağustos 2010, 14:36:51

zamzam23

unsigned int32 pals=0,bolum=0;
ldiv_t sonuc;
sonuc=ldiv(pals,131);
bolum=sonuc.quot;

arkadaşlar bu bolme işleminde bolum değeri 250 yi yukarı geçmiyor. 250 den sonra 65289 a fırlıyor.
pals değeri enkoderden geliyor. sürekli artıyor. bolum değeri neden 250 yi geçmiyor anlamadım. program cok sade. sadece bu kdar. ama sorun oluyor acaba ldiv den mı kaynaklı??

fatihinanc

ldiv() fonksiyonun parametreleri signed long türünden.
sizin bolum değişkeniniz ise unsigned int.

signed long bolum=0;

olarak değiştirip dener misiniz?
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

zamzam23

#2
tmm haklısınız.
  sonuc=ldiv(32767,131);
  bolum=sonuc.quot;
// bolum=250 oluyor

dediğiniz gibi yapınca yukarıdaki kodu calıstırıyor ama kodu asagıdakı gıbı degıstırınce bolmuyor.

  sonuc=ldiv(33000,131);
  bolum=sonuc.quot;

//bolum=251 olmalı ama olmuyor 65288 oluyor.
    bu işlemin sonucu gerekiyor bana. nasıl yaparım acaba? ldiv kullanarak yapamıcam sanırım  cunku unsigned olmalı 33000 olması ıcın. ama nasıl yaparım bi yol gösterir misiniz?

zamzam23

insan düşününce sonucu bulabiliyor. çözümümü buraya yazıyorum belkı bırının ısıne yarar. tesekkur ederım cvp için.
mademki pals değerim 32767 den buyuk olamıyor bende bunu ta bastan 2 ye boler sonuca yazdırırken 2 ıle carparım. boylelıkle pals değerim65000 küsür oluncaya kadar olcum yapabılırım.

  sonuc=ldiv(pals/2,131);
  bolum=sonuc.quot;
           
           
       lcdgit(1,1);
       printf(lcd_putc,"%lu cm",bolum*2);

fatihinanc

evet 33000 için geçersiz olur.32768 den büyük bütün sayılar için de.
sebebi parametrelerin signed long olması.

stdlib.h içinde bu fonksiyonun parametrelerini unsigned long olarak değiştirirseniz bu iş olur gibi.

35.satır
typedef struct {
   unsigned long quot;
   unsigned long rem;
} ldiv_t;


266.satır
ldiv_t ldiv(unsigned long numer, unsigned long denom);


296.satır
ldiv_t ldiv(unsigned long numer, unsigned long denom)
{
   ldiv_t val;
   val.quot = numer / denom;
   val.rem = numer - (denom * val.quot);
   return (val);
}


ek: cevabı gördüm. iki yol da kullanılabilir.kolay gelsin
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)