C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

muhittin_kaplan

deger=10*0.333333
de doğru sonuç alıyorum. 10/3 ün 3.333 olması gerekirken neden 3 tamsayısını alıyorum ?
(10/3.0 mı yapmak gerekiyor)

mufitsozen

Alıntı yapılan: muhittin_kaplan - 22 Ocak 2013, 15:40:28
deger=10*0.333333
de doğru sonuç alıyorum. 10/3 ün 3.333 olması gerekirken neden 3 tamsayısını alıyorum ?
(10/3.0 mı yapmak gerekiyor)

c dilinde mixed type hesap yada expression kullanildiginda  degisik tipler (int, unsigned ve double) arasinda type promotion kurallari isler.

Ayrica bazi compilerlar bunlara kullanilan islemcinin 8/16/32/64 bit olmasina gore ek anlamlar ekler. (yani int yazinca her MCU icin bu farkli sayida bit icerebilir!)

kullandiginiz compilerin dokumanlari icinde "type promotion" bahsine bakmanizda fayda olur.



Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Mucit23

#377
hocam ben bir soru sorayım..

Tuş takımını sürekli tarıyorum. Tuş takımından bir tuşa basıldığı zaman bu tuşun bırakılmasını beklemem lazım.

her bir tuşa basıldığını algıladığımda gerekli işlemleri yapıp ardında şöyle bir komutla bekletiyorum

while (int_tus==!45){}

Normalde hiçbir tuşa basılmazsa bana 45 verisi geliyor. Basılmışsa basılan tuşun ascii karşılığı geliyor. Böyle bir kullanım yanlışmı olur acaba. Burada demek istediğim int_tus verisi 45 den farklı olduğu sürece program while içerisinde dönsün. Ama bu komutla program while içerisinde beklemiyor

JKramer


ULAGA

@Mucit23

Eğer tuş okurken tuşa basıldığı anda tuşun bırakıldığını öğrenmek için bir döngüye girersen;
O anda başka bir işlem yaptıramazsın işlemciye kesmeler hariç.
Yine de kodunun tümünü bilmediğim için pek bir yorum yapamayacağım.

Mucit23

Teşekkürler JKramer...

Alıntı yapılan: ULAGA - 22 Ocak 2013, 16:17:18
@Mucit23

Eğer tuş okurken tuşa basıldığı anda tuşun bırakıldığını öğrenmek için bir döngüye girersen;
O anda başka bir işlem yaptıramazsın işlemciye kesmeler hariç.
Yine de kodunun tümünü bilmediğim için pek bir yorum yapamayacağım.


Hocam menü ayakları. Durumun farkındayım, sakıncalarınıda biliyorum ama zaten tuşa basılı olduğu zamanlarda işlemcinin başka birşey yapmasına gerek yok. Kesmeler çalışıyor. Tuş bilgisini sürekli okuyorum o yeter.

ULAGA

Alıntı yapılan: Mucit23 - 22 Ocak 2013, 16:27:49Hocam menü ayakları. Durumun farkındayım, sakıncalarınıda biliyorum ama zaten tuşa basılı olduğu zamanlarda işlemcinin başka birşey yapmasına gerek yok. Kesmeler çalışıyor. Tuş bilgisini sürekli okuyorum o yeter.

Yaptığın sistemin çalışması açısından bir sorun teşkil etmiyorsa, dediğin gibi önemli değil. :)

muhittin_kaplan

#382

Mufit hocam teşekkür ederim.

Alıntı yapılan: gerbay - 22 Ocak 2013, 15:44:30
float sa 10.0f/3 yapmanız gerekiyor, double sa 10.0/3 ...

Yukardaki Cevabe istinaden devam edeyim.

#define Z 64
int A;
float Sonuc;
a=5;

Sonuc=a/Z yi nasıl yapacağım ?

Derleyici olarak GCC arm  (CoIDE ile) Kullanıyorum.



mesaj birleştirme:: 22 Ocak 2013, 17:10:40

@Mucit


while (int_tus != 45)
{
.........
}
yaparsan 45 dışındaki tüm değerlerde while içerisine girer.

AsHeS

Alıntı yapılan: muhittin_kaplan - 22 Ocak 2013, 17:07:25
Mufit hocam teşekkür ederim.

Yukardaki Cevabe istinaden devam edeyim.

#define Z 64
int A;
float Sonuc;
a=5;

Sonuc=a/Z yi nasıl yapacağım ?

Derleyici olarak GCC arm  (CoIDE ile) Kullanıyorum.
sonuc=((float)a)/Z;
konunun başını okumadım yanlış birşeye de cevap vermiş olabilirim.
Not:Derleyiciniz küçük-büyük harf duyarlı olabilir.

muhittin_kaplan

ona takılmayın.

sonuc=((float)A)/Z;

şunu denedim (VB den kalma alışkanlık)

Sonuc=float(A/Z); olmadı. Çözüm Önerinizi Deneyeceğim. Teşekkür ederim.

xoom

float sonuc;
sonuc = (float)a/Z;

AsHeS

#386
Alıntı yapılan: muhittin_kaplan - 22 Ocak 2013, 17:35:04
ona takılmayın.

sonuc=((float)A)/Z;

şunu denedim (VB den kalma alışkanlık)

Sonuc=float(A/Z); olmadı. Çözüm Önerinizi Deneyeceğim. Teşekkür ederim.
önce parantez içi işletiyor zaten oradan a=5 z=64 dolayısıyla integer olarak 0 geliyor sonra floata çevriliyor ve sonuç sizi tatmin etmiyor sıfır çıkıyor yani.Önce type-casting yapın sonra bölme işlemini okunaklık artsın diye çift parantez kullandım.

muhittin_kaplan

hiç biri olmadı.
bende
#define DENEME 64.0 yaptım.

AsHeS

#388
Alıntı yapılan: muhittin_kaplan - 23 Ocak 2013, 15:28:43
hiç biri olmadı.
bende
#define DENEME 64.0 yaptım.
Size söylerken de Dev-C++ ile denedim siz söyledikten sonra da onun üzerinde de GCC var ama demek ki arm gcc derleyicisi farklı çalışıyor.
#include <stdio.h>
#define Z 64
int main(void)
{
    int a=4;
    float sonuc;
    sonuc=((float)a)/Z;
    printf("%f\n",sonuc);
    system("PAUSE");
}

Şu kod parçacığı bende 0.062500  gösteriyor.

ULAGA

Her iki şekilde de sonuç, 0.0625
AsHeS35'in de dediği gibi ARM derleyicisi ile ilgili bir sorun olabilir.


sonuc=((float)a)/Z;
sonuc=(float)a/Z;