kısa kod

Başlatan zenze, 10 Şubat 2009, 21:07:44

zenze

Aşağıda yazılı kod yerine kullanabileceğim daha kısa bir kod olabilir mi?.Teşekkürederim.

   IF DEGER > 240 THEN DEGER = 28
   IF (241 > DEGER) AND (DEGER > 220) THEN  DEGER = 27
   IF (221 > DEGER) AND (DEGER > 202) THEN  DEGER = 26
   IF (203 > DEGER) AND (DEGER > 183) THEN  DEGER = 25
   IF (184 > DEGER) AND (DEGER > 164) THEN  DEGER = 24
   IF (165 > DEGER) AND (DEGER > 148) THEN  DEGER = 23
   IF (149 > DEGER) AND (DEGER > 131) THEN  DEGER = 22
   IF (132 > DEGER) AND (DEGER > 114) THEN  DEGER = 21
   IF (115 > DEGER) AND (DEGER > 95) THEN  DEGER = 20
   IF (96 > DEGER) AND (DEGER > 77) THEN  DEGER = 19
   IF (78 > DEGER) AND (DEGER > 59) THEN  DEGER = 18
   IF (60 > DEGER) AND (DEGER > 40) THEN  DEGER = 17
   IF (41 > DEGER)  then DEGER = 16

Tagli

Sanırım DEGER 1 byte'lık, yani 0-255 arası bir sayı? Programı assembly ile yazıyor olsam 256'lık bir tablo hazırladım. Aklıma gelen ilk yöntem bu olurdu.

Kullandığın PIC modeli nedir? 16 serisi PIC'ler genelde bu karşılaştırmaları yapmak için çıkarma işlemi ve C (carry bit) kontrolü yaparlar. Bu durumda her aralık için kabaca (bir kağıda az düşünüp karaladığım kadarıyla) 11 civarında komut gerekcek. Bu durumda sonuç tablo yöntemindekinden daha iyi gibi, eğer derleyici de benim düşündüğüm gibi düşünüyorsa tabi.

Bu kod derlendiğinde ne kadar yer kaplıyor? Ve senin hedefin nedir, yani en fazla ne kadar yer kaplamasına izin verebilirsin?
Gökçe Tağlıoğlu

zenze

Picbasicpro da yazıyorum , toplam kod boyutunda sıkıntı oldu . Neticede daha büyük hafızalı bir mcu ya gecerek sorunu çözdüm. Ama başka bir şekilde yapılabilirmi diye egzersiz yapıyorum. Akıl akıldan üstündür.

muhittin_kaplan

PBP de de vardır select case Bir araştır istersen
select case deger
 case .....
    kod.kod.kod
 case >....
    kod.kod.kod
 case <.....
    kod.kod.kod
endselect

Tagli

Tahminime göre bu "case" komutu tablo şeklinde derleniyor olabilir. Bu varsayıma şu şekilde ulaştım: Eğer "case" komutunun tablo oluşturarak performans artışı sağlamak gibi bir özelliği yoksa kullanımı tamaman gereksiz olurdu, çünkü "if" ile zaten mantıksal olarak herşey yapılabilir. Derleyici açısından aralarında bir fark olmalı.
Gökçe Tağlıoğlu

muhittin_kaplan

pic programlamada yeniyim malum (gerçi 1 yıla yaklaştı) ama vb de hızda büyük farkı var (select case yerine if kullanma)
çünki if de hepsine bakıyor selec case de ise bulduğu anda select case den çıkıyor.

wsxwsx

branch diye bir komut  vardı şartlara göre dallanma sağlıyordu. bir de bunu denemek gerek. ben hiç kullanmadım.

berkay_yalan

ccs c kullan hayatını degıstır

ben f452 ye sımdılık 59kb lık yazılım attım ve yazılıma devam ve,

lınes : 2709

rom : 64%

ram : 14%

:D

Tagli

Alıntı yapılan: "wsxwsx"branch diye bir komut  vardı şartlara göre dallanma sağlıyordu. bir de bunu denemek gerek. ben hiç kullanmadım.
C, Z vs. gibi bayrak bitlerine göre dallanma yapar. Bunun için yine önceden çıkarma işlemi yapmak gerekiyor. Bu komutlar genelde 16 serisinde yoklar. Ama zaten 18 serisinde doğrudan karşılaştırma yapan komutlar var. BU tabi olaya ASM açısından bakış. Derleyici kullanırken ne yapmalı da kod en küçük boyuta insin onda emin değilim. Ama hız açısından en etkilisi tablo kullanmak. Çünkü normal yöntemde her karşılaştırma için ayrı işlem yapmak gerekiyor.
Gökçe Tağlıoğlu

ErsinErce

bu kodda 41den sonrası için sürekli 16 değeri atanıyor ama belli aralıklara sabit değerler girilmek istenmiş gibi duruyor. bunu formülizede edebilirsiniz 19lu aralıklarla bi değer bulmaya çalışmışsınız galiba en basitinden
deger = (deger / 19) + 15 ile yukarda oluşturulmak istenen tabloya ulaşabilirsiniz. (ufak (byte) boyutlu olduğu için tam lineerleştirmeye gerek duymadım, girilen değer sonucunda yukardaki rakamlar yakalanıyor)

muhittin_kaplan

protonda denedim
aynı komutları if ile yaparsanız %3,22,select ile yaparsanız %2,8 luk alan kaplıyor.fark %0,42 gibi bir durum

zenze

ilginize teşekkür ederim. Yeni arkadaşlar için yukarıdaki kod hatalı ; Sonradan farkettim ve düzelttim. Bu haliyle değer ne olursa olsun atanan değer 40 dan küçük olduğu için deger = 16 da sabitleniyor.Örneğin Deger = 24 için 2400 yazdırıp sorunu hallettim en sonunda da deger = deger/100 ekledim.