GCC derleyici beni çıldırttı - bu kodu nasıl yazıcam

Başlatan magnetron, 31 Mart 2022, 15:48:05

magnetron

merhaba forum

aşağıdaki kod ile RAM[PARAMETERS +174*2] adresindeki değişkenin 0.biti 0'dan 1'e değişince

if bloku çalışsın istiyorum ama bloka girmiyor  nasıl yazacağım bu kodu - teşekkür
( her iki değişken uint8_t en üst katmanda tanımlanmış ) - bisürü şey denedim kafa da kalmadı

function (void){
    if (((RAM[PARAMETERS+174*2])&0x1 ) && (commandmem&0x1==0)){
          ...........
          }

    commandmem= RAM[PARAMETERS+174*2];

}

dumansiz

Sorun işlem önceliği olabilir mi?
Önce toplama işlemi yapılacaksa toplama işlemi parantez içine alınmalı:
function (void){
    if (((RAM[(PARAMETERS+174)*2])&0x1 ) && (commandmem&0x1==0)){
          ...........
          }
 
    commandmem= RAM[(PARAMETERS+174)*2];
 
}

magnetron

hocam PARAMETERS sabiti RAM de bir adrese karşılık geliyor

buradan itibaren 174*2 .ci byte'ın 1. bitini &0x1 ile elde edip onun 0x1 olduğu

ve aynı byte'ın 1 önceki durumunun 1. bitinin 0 olduğu durumu yakalamak istiyorum

yani yükselen kenarda işlem yapmak istiyorum ama if blokuna bir türlü girmiyor

debug da RAM[PARAMETERS+174*2] byte'ı elle değiştirip  0 1  oluyor onu görüyorum

gcc nin baya eski bir versiyonu bu kullandığım - galiba 2008 - acaba bir ilgisi olabilir mi

kimlenbu

PARAMETERS
(PARAMETERS+174)*2
RAM[(PARAMETERS+174)*2]
RAM[(PARAMETERS+174)*2])&0x1

işlemlerinin sonucunu direkt olarak if'te kullanmak yerine global bir değişken tanımlayıp istediğiniz değerleri alıyorlar mı debug'dan kontrol ederseniz sorunu bulması kolaylaşır

e-zeki

hocam C operatör önceliklerinde "==" operatörü "&" operatöründen daha öncelikli
(commandmem&0x1==0)
kısmında öncelik "1==0" te olduğu için if sürekli false'a düşüyor gibi görünüyor.
((commandmem&0x1)==0)
şekline çevirirseniz çalışacaktır.

magnetron

Alıntı yapılan: e-zeki - 31 Mart 2022, 16:54:01hocam C operatör önceliklerinde "==" operatörü "&" operatöründen daha öncelikli
(commandmem&0x1==0)
kısmında öncelik "1==0" te olduğu için if sürekli false'a düşüyor gibi görünüyor.
((commandmem&0x1)==0)
şekline çevirirseniz çalışacaktır.

teşekkür hocam dediğiniz gibi yaptım çalıştı

magnetron

hocam yeni konu açmadım burdan devam ediyim dedim

Rx_buffer_3 gelen bilgi 
MPos:5.000,-10.000,5.000


uint32_t *PTR=&RAM[PARAMETERS+148*2];
............
    *PTR=(uint32_t) atof(strchr(Rx_buffer_3,':')+1);

burada RAM[PARAMETERS+148*2] 0 değerini alıyor

eğer
    *PTR=(uint32_t) atoi(strchr(Rx_buffer_3,':')+1);

yaparsam 5 değerini alıyor

float olarak almam lazım noktadan sonrası da lazım çünkü
nasıl yapıcam ( alınan float değeri 1000 le çarpıcam noktadan sonrasını da okumuş olucam ama daha oraya gelemedim )

teşekkür

e-zeki

Hocam %99 ihtmialle <stdlib.h> ekli değildir o yüzden atof çalışmaz. şimdi gerçek bir GCC hatasıyla karşı karşıya olabilirsin. çünkü bazı compiler'lar temel kütüphanelerde kafalarına göre "mış gibi" yapıp "stdio.h" ya da "string.h" dan linkleme yapabiliyor. ve compile hatası vermiyor

magnetron

hocam teşekkür dediğiniz gibi yaptım çalıştı

yeni bişey öğrenmiş oldum ama 1/2 günüm de gitti  :(