[]
8051 C integer to char problemi.
Keil ile 8052 programlıyorum, grafik lcd'ye değer yazdırmam için fonksiyona girecek olan veri char array olmak zorunda.
aşağıdaki şekilde integerdan char'a dönüşüm yapabiliyorum, çalışıyor ama 1K yiyor kod belleğinden, zaten altı üstü 8k kod belleği var, bir kaç dönüşüm yapmam lazım, bu sefer kod belleği yetmiyor.
char buf[5];
sprintf(buf, "%d", frekans2);
örneğin 5 basamaklı bir integer'ı 1k kod belleği harcamadan nasıl char array'e atarım ? mod demeyin, math.h kütüphanesindeki ilgili fonksiyon float kullanıyor, astarı yüzünden pahalıya geliyor.
extern float modf (float val, float *n);
aşağıdaki şekilde integerdan char'a dönüşüm yapabiliyorum, çalışıyor ama 1K yiyor kod belleğinden, zaten altı üstü 8k kod belleği var, bir kaç dönüşüm yapmam lazım, bu sefer kod belleği yetmiyor.
char buf[5];
sprintf(buf, "%d", frekans2);
örneğin 5 basamaklı bir integer'ı 1k kod belleği harcamadan nasıl char array'e atarım ? mod demeyin, math.h kütüphanesindeki ilgili fonksiyon float kullanıyor, astarı yüzünden pahalıya geliyor.
extern float modf (float val, float *n);
Aşağıdakiler kendi düşüncelerim doğruluğunu bilmiyorum.
1- Kod belleğinden kastedilen şey kodun saklandığı bellek mi?Eğer öyle ise kod belleğinden bir işlem için 1k yer alıyorsa beş işlem 5k almaması lazım. Onu 1K yapan şey, eklediğin kütüphanedir ki sprinft komutu stdio da.
2-Eğer daha verimli olur mu bilmiyorum ama, type casting döngüler gibi bir şey yapabilirsiniz.
Mesela sayı
sayi = 58919,
birinci_basamak = sayi/10000;
ikinci_basamak = sayi/1000 -birinci_basamak*10;
...
tek tek basamaktan rakamları döngü içinde almalı.
buf[0] = birinci_basamak + '0';
mı çalışır yoksa
buf[0] = (char) (birinci_basamak + (int) '0');
bilmiyorum biraz kurcalarsanız bulursunuz.
------------------------------------------------
Bunlar benim aklıma gelenler, bu konuda çok bilgim yok tekrar hatırlatırım.
Edit: düzeltme
1- Kod belleğinden kastedilen şey kodun saklandığı bellek mi?Eğer öyle ise kod belleğinden bir işlem için 1k yer alıyorsa beş işlem 5k almaması lazım. Onu 1K yapan şey, eklediğin kütüphanedir ki sprinft komutu stdio da.
2-Eğer daha verimli olur mu bilmiyorum ama, type casting döngüler gibi bir şey yapabilirsiniz.
Mesela sayı
sayi = 58919,
birinci_basamak = sayi/10000;
ikinci_basamak = sayi/1000 -birinci_basamak*10;
...
tek tek basamaktan rakamları döngü içinde almalı.
buf[0] = birinci_basamak + '0';
mı çalışır yoksa
buf[0] = (char) (birinci_basamak + (int) '0');
bilmiyorum biraz kurcalarsanız bulursunuz.
------------------------------------------------
Bunlar benim aklıma gelenler, bu konuda çok bilgim yok tekrar hatırlatırım.
Edit: düzeltme
- ilkdefa (28.11.10 10:19:53 ~ 10:21:53)
8051'in kütüphanesi sınırlı bir bakayım dediğin fonksiyon ne kadar yiyecek :)
edit : ne yazık ki sprintf den başka yol yok gibi görünüyor c de, verdiğin syntax olmuyor. assembly yolu göründü bana...
edit : ne yazık ki sprintf den başka yol yok gibi görünüyor c de, verdiğin syntax olmuyor. assembly yolu göründü bana...
- kimlanbu (28.11.10 11:05:57 ~ 11:13:07)
kesin cozum:
1- sayiyi alip rakamlar haline getireceksin. 58919 ise elinde 5, 8, 9, 1 ve 9 olacak.
2- her basamagin degerini 48 (decimal bu) ile toplayip buffer'da ilgili yere yazacaksin.
3- buffer'in en sonuna da 0 degerini basacaksin. (null byte)
sonuc olarak elindeki buffer'da 53,56,57,49,57,0 byte'lari olacak. (bkz: ascii tablosu)
1. adim en uzun surecek adim. izin verdigin max. basamak sayisi kadar bir dongu kurup, pow fonksiyonunu kullanarak 10,100,1000,10000 gibi rakamlar elde edip, sayidan ufak mu degil mi diye bakarak basamak sayisini bulur, basit bolme islemi ile rakamin degerini cikartirsin. (edit-ek: pow eger yavas ise 10 ile carpa carpa gidebilirsin, onceki_deger=1, i=0 iken onceki_deger=10*onceki_deger=1, i=1 iken onceki deger*10=100, i=2 ise nonceki deger*10=1000, vs)
1- sayiyi alip rakamlar haline getireceksin. 58919 ise elinde 5, 8, 9, 1 ve 9 olacak.
2- her basamagin degerini 48 (decimal bu) ile toplayip buffer'da ilgili yere yazacaksin.
3- buffer'in en sonuna da 0 degerini basacaksin. (null byte)
sonuc olarak elindeki buffer'da 53,56,57,49,57,0 byte'lari olacak. (bkz: ascii tablosu)
1. adim en uzun surecek adim. izin verdigin max. basamak sayisi kadar bir dongu kurup, pow fonksiyonunu kullanarak 10,100,1000,10000 gibi rakamlar elde edip, sayidan ufak mu degil mi diye bakarak basamak sayisini bulur, basit bolme islemi ile rakamin degerini cikartirsin. (edit-ek: pow eger yavas ise 10 ile carpa carpa gidebilirsin, onceki_deger=1, i=0 iken onceki_deger=10*onceki_deger=1, i=1 iken onceki deger*10=100, i=2 ise nonceki deger*10=1000, vs)
- disq (28.11.10 20:25:19 ~ 20:37:08)
Merak edenler için söyleyeyim, sprintf fonksiyonunu kullanınca 1 seferlik olarak 1k artıyor programın boyutu, sonraki kullanımlarda sadece bir kaç bytle lık artışlar oluyor. Fonksiyonu kendim yazmaktan vazgeçtim 1k lık kod belleğim kaldı, oraya sığdıracağım artık kalan programı.
- kimlanbu (29.11.10 02:46:36)
1