Bu fonksiyon doğru mu?

Başlatan Erhan YILMAZ, 27 Kasım 2011, 14:02:45

Erhan YILMAZ

Elimde olan bir kitin kütüphanelerini incelerken bu fonksiyona denk geldim. Fonksiyon aklımı karıştırdı.

void spiWrite(unsigned char *bytes, unsigned char numBytes)
{
    while (numBytes--)
    {  
        UCB0TXBUF = *bytes;
        while (!(IFG2 & UCB0RXIFG)) ;     //WAIT for a character to be received, if any
        *bytes++ = UCB0RXBUF;             //read bytes
    }
}


*bytes++ = UCB0RXBUF; Bu kod ne iş yapıyor diye sorsalar. Önce bytes'ın gösterdiği adrese UCB0RXBUF'in değerini yazar sonrada o değeri 1 arttırır derim. Fakat öyle olmadığı açık. C de böyle bi kullanımı ilk defa görüyorum bu derleyiciye özgü bir yazım mıdır? Bana doğrusu ne diye sorsalar aşağıdaki gibidir derim. Kodlar msp430 denetleyici için yazılmış derleyici de IAR kütüphaneler denenmiştir herhalde. Kaçırdığım bişey mi var?

void spiWrite(unsigned char *bytes, unsigned char numBytes)
{
    while (numBytes--)
    {  
        UCB0TXBUF = *bytes;
        while (!(IFG2 & UCB0RXIFG)) ;     //WAIT for a character to be received, if any
        *bytes = UCB0RXBUF;             //read bytes
         bytes++;
    }
}

cicjoe

Necati Ergin'in C kitabindan alinti:


++ ve -- operatörlerinin gösterici operatörleriyle birlikte kullanılması
++*p durumu

x = ++*p;

*p = *p + 1; anlamına gelir. *p bir nesne gösterdiği için nesnenin değeri 1 artırılacaktır.

Yukarıdaki deyimle x değişkenine *p nesnesinin artırılmış değeri atanacaktır.
*++p durumu
p göstericisinin değeri 1 artırılır. Artırılmış adresteki nesneye ulaşılmış olur.

x = *++p;

deyimi ile x değişkenine artırılmış adresteki bilgi atanır.

*p++ durumu
++ operatörü ve * operatörünün ikisi de 2. öncelik seviyesindedir ve bu öncelik seviyesine ilişkin öncelik yönü sağdan soladır. Önce ++ operatörü ele alınır ve bu operatör ifadenin geri kalan kısmına p göstericisinin artmamış değerini gönderir. Bu adresteki nesneye ulaşılır ve daha sonra p göstericisinin değeri 1 artırılır.

x = *p++;

deyimi ile x değişkenine *p nesnesinin değeri atanır daha sonra p göstericisinin değeri 1 artırılır.

&x++    /* error */
x nesnesinin artmamış değeri ifadenin geri kalanına gönderilir. (Adres operatörüne operand olur.) Bu da bir nesne olmadığı için error oluşur. (Adres operatörünün operandı nesne olmak zorundadır.)
&++x  /* error */
x nesnesinin artmış değeri ifadenin geri kalanına gönderilir. (Adres operatörüne operand olur.) Bu da bir nesne olmadığı için error oluşur. (Adres operatörünün operandı nesne olmak zorundadır.)
++&x  /* error */
x nesnesinin adresi ++ operatörüne operand olur. ++ operatörünün operandı nesne olmak zorunda olduğu için derleme zamanında error oluşacaktır.

& operatörü ile ++ ya da  -- operatörlerinin her türlü kombinasyonu derleme zamanında hata oluşmasına neden olur.

++p Durumu
İndex operatörü 1. öncelik seviyesinde, ++ operatörü ise 2. öncelik seviyesindedir. Bu durumda önce derleyici tarafından indeks operatörü ele alınır. p ifadesi bir nesne gösterir. Dolayısıyla ++ operatörüne operand olmasında bir sakınca yoktur. Söz konusu ifade

p = p + 1;

anlamına gelmektedir. Yani p nesnesinin değeri 1 artırılacaktır.
p++ Durumu

x = p++;

Önce p nesensinin artmamış değeri üretilir, ifadenin geri kalanına p nesnesinin artmamış değeri kullanılır. Yani yukarıdaki örnekte x değişkenine p nesnesinin artırılmamış değeri atanır, daha sonra p nesnesi 1 artırılır.
p[++i] Durumu

x = p[++i];

Önce i 1 artırılır. Daha sonra artırılmış adresteki bilgi x değişkenine atanır.
p[i++] Durumu

x = p[i++];

Burada p nesnesinin değeri x değişkenine atanır. Daha sonra i değişkeni 1 artırılır.
p++ durumu

x = p++;

Pek tercih edilen bir ifade değildir.Burada önce p x değişkenine atanır. Sonra p göstericisinin değeri 1 artırılır.

Erhan YILMAZ

Yani iki fonskiyon da aynı işlemi mi yapar?

Erhan YILMAZ

Anladım hocam cevaplarınız için teşekkürler. İlk defa öyle bir yazıma rastladığım için şaşırdım biraz kütüphane mi hatalı dedim.:)

Erhan YILMAZ

Peki aşağıdaki fonksiyonun tanımlaması nasıl yapılmış? Parametre kısmındaki ... kısmının anlamadım.

void tfp_printf(char *fmt, ...);


bymrz

Alıntı yapılan: tamirci_erhan - 27 Kasım 2011, 16:16:53
Peki aşağıdaki fonksiyonun tanımlaması nasıl yapılmış? Parametre kısmındaki ... kısmının anlamadım.

void tfp_printf(char *fmt, ...);



Fonksiyonun girdi parametresi bir pointer diyor, yani gelen bilgi bir byte ın değeri değil, o byte ın hafızada bulunduğu yerin adres bilgisidir...

Erhan YILMAZ

Alıntı yapılan: alone_lover - 27 Kasım 2011, 16:52:56

Fonksiyonun girdi parametresi bir pointer diyor, yani gelen bilgi bir byte ın değeri değil, o byte ın hafızada bulunduğu yerin adres bilgisidir...

Hocam orasını anladım fakat ... yazan kısmı sormuştum. Şimdi incelerken denk geldim. Değişken sayıda argümanı bulunan fonksiyonlar için yapılan bi tanımlamaymış?

Erhan YILMAZ