C Programlama diliyle şamatalar

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

kantirici

#1020
Teşekkürler.
Sanırım özel bir anlamı yok.

F493

Selam,

#ifndef   _DIGITAL_INPUTS_H_   demek; if not defination demek yani eğer tanımlanmadıysa demektir.
#define   _DIGITAL_INPUTS_H_   eğer üst satırdaki sorguda   _DIGITAL_INPUTS_H_ daha önce tanımlanmadıysa compiler bir alt satırı işler ve tanımlamayı yapar.

#endif

Burada mesele şu aynı isimle yani  aynı sayfada ard arda bu file'ı include ederseniz bu ifadelerden dolayı file tekrar dahil edilmez. Yani duplicate olmaz.  Hatayı önlemek amaçlı.

Birde her header file de  "_DIGITAL_INPUTS_H_   " kısmı farklı yazmanız lazım yoksa aynı file da dosyaları aynı sanıp dahil etmez.

Esen kalın.

sseedat

Selamlar,

var değişkenini 1 kere oluşturup döngü içinde kullanmak mı , yoksa döngü içinde koşul sağlandığında her seferinde oluşturmak mı daha iyi performans açısından.

int main()
{
   int var;

   while (1)
   {
      if (flag)
      {
         int var;
         .
         .
         .
      }
   }
}
}

}
Görünmez bir mezarlıktır Zaman...

mir_as82

Hocam loop dışı daha mantıklı.

z

Bu tip şeylerin performansı etkileyeceğini düşünmüyorum.

Adı geçen değişkene ya stackta yer açılacak ya da registerlerden birinde. Çok uyduruk işlemcilerde ise global ramın bir köşesinde.

Registerde yer alacaksa zaten süper. Stackta yer alacaksa aptal bir derleyici olması lazım ki her defasında değişken adresini hesaplasın. Global ramın bir köşesinde yer alacaksa  gene sorun yok.

Her durumda adresi bilinen bir değişken.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

engerex

Alıntı yapılan: z - 06 Ekim 2016, 19:33:13
Bu tip şeylerin performansı etkileyeceğini düşünmüyorum.

Adı geçen değişkene ya stackta yer açılacak ya da registerlerden birinde. Çok uyduruk işlemcilerde ise global ramın bir köşesinde.

Registerde yer alacaksa zaten süper. Stackta yer alacaksa aptal bir derleyici olması lazım ki her defasında değişken adresini hesaplasın. Global ramın bir köşesinde yer alacaksa  gene sorun yok.

Her durumda adresi bilinen bir değişken.


İşte ASM bilirsen bu şekilde konuya hakim oluyorsun.

sseedat

Alıntı yapılan: z - 06 Ekim 2016, 19:33:13
Bu tip şeylerin performansı etkileyeceğini düşünmüyorum.

Adı geçen değişkene ya stackta yer açılacak ya da registerlerden birinde. Çok uyduruk işlemcilerde ise global ramın bir köşesinde.

Registerde yer alacaksa zaten süper. Stackta yer alacaksa aptal bir derleyici olması lazım ki her defasında değişken adresini hesaplasın. Global ramın bir köşesinde yer alacaksa  gene sorun yok.

Her durumda adresi bilinen bir değişken.



Peki hocam 200 300 bayt yer kaplıyacak değişkenler  için de aynı şeyi diyebilir miyiz?
Görünmez bir mezarlıktır Zaman...

z

Basit değişken değil de array ya da structure olsaydı da çok şey değişmeyecekti.

Sonuçta değeri okunacak yada değiştirilecek değişkenin öncelikle fiziksel adresi bir iki adımda hesaplanacak ve bu hesaplama değişkenin nerede tanımlandığından bağımsız.

Belki aklımıza gelmeyen başka trikler vardır.




Bana e^st de diyebilirsiniz.   www.cncdesigner.com

RaMu

Soru eksik aslında.
İşlemci ve derleyiciye göre sonuç değişebilir.

Belkide döngü içinde tanımlanınca
asm çıktıda akümülatör kullanacak derleyici.
Birkaç byte için akümülatör kullanmayı yeğlerse derleyici
300 byte değişkende durum farklı olacaktır.

Birde daha çok mikrodenetleyici mantığıyla düşünüyoruz,
bu bir PC programıysa nasıl bir değişiklik olabilir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Zoroaster

Aşağıdaki alıntıda talihsiz bir hata yapmışım. Daha doğrusu anlaşılırlık açısından hata yok da uygulamada başınıza iş açacak bir örnek vermişim.

void hesapla(int a, int b)
{
int x,y,z,w;
    x=a+b;
    y=a-b;
    z=a*b;
    w=a/b;     
}

hesaplamalarında çağıran fonksiyona x,y,z,w adreslerini geri bildirebiliriz (x,y,z,w yı structure içinde tanımlayıp structure adresini geri döndürebiliriz) fakat bu değişkenler stackta yer aldıklarından fonksiyondan çıktıktan sonra  başlarına her şey gelebilir. Bir int gelir ve bu değişkenler artık stağın boş alanında kaldıklarından int girişindeki register saklama işlemleri bunları ezer.

Bu yüzden bu örneği pratikte uygulamayın.

Alıntı yapılan: z - 25 Ekim 2011, 14:27:55
pointer kavramina bakalim.

pointere neden ihtiyac varla baslayalim.

Asagidaki gibi bir fonksiyon dusunelim.

void hesapla(int a, int b)
{
int x,y,z,w;
    x=a+b;
    y=a-b;
    z=a*b;
    w=a/b;     
}

peki hesaplanan x,y,z,w degerlerini cagiran fonksiyona nasil iletebiliriz?  (malesef int int int int hesapla(int a, int b) yazamiyoruz)

Cozum 1. Global degisken kullanmak

int x,y,z,w;

void Hesapla(int a,b)
{
    x=a+b;
    y=a-b;
    z=a*b;
    w=a/b;     
}

Cozum 2

void Hesapla(int a, int b, int* x, int* y, int* z, int* w)
{
    *x=a+b;
    *y=a-b;
    *z=a*b;
    *w=a/b;     
}

Burada int *x,  gelen veri, x degiskeninin degeri değil adresidir demek.

*X = a+b; demek a+b islemini yap ve sonucu adresi verilen alana yaz demek.

Peki bu fonksiyonu cagirirken nasil adres verecegiz?

main void()  // burada parantez icine void yazacaksak yazmayabilme serbestligimiz var
{
int a,b,c,d;

        Hesapla (4, 5, &a, &b, &c, &d)(Resim gizlendi görmek için tıklayın.) // Buradaki &a, a degiskeninin adresinin sayisal degeri demektir.
}


-------------------------------------------------------------------------------

pointeri anlamak icin bir baska ornek

void main()
{
int a,b;        //  a ve b integer iki degisken
int* p          //  p,  integer degiskenlerin adresini saklayabilen bir degisken, yani bir pointer

       p=&a    //   a degiskeninin adresini p ye yukledik
       a=1;     //   a=1 yaptik
       b=*p;   //  p degiskenindeki adresdeki veriyi b ye yazdik. (b=a oldu)
}

Pointer denen sey de bundan ibaret.

O halde bir fonksiyondan istedigimiz kadar sonuc geri dondurebiliriz. Daha dogrusu, bir fonksiyondan, istedigimiz kadar degiskenin icine deger yazmasini isteyebiliriz.
Seytan deliginden kacti.

yldzelektronik

Selamlar,

C de özellikle de ST HAL Lib içinde weak tanımları görüyorum.

Anladığım kadarıyla C'de fonksiyonlara overload yapabilmek için kullanılabiliyor.Yani farklı iki dosyada aynı isimde iki fonksiyon olabiliyor.

Bu konu nedir?Neye yarar weak tanımı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Tagli

Kendim hiç kullanmadığım için ayrıntılarını bilmiyorum ama overloading gibi çalışmıyor. Normalde yazılması gereken bir fonksiyon eğer kullanıcı tarafından yazılmamışsa geçici olarak kütüphanede başka bir fonksiyon çalışıyor. Daha çok nesne yönelimli programlamada geçen overriding kavramına benziyor. Kullanıcı aynı imzaya sahip kendi fonksiyonunu yazdığında daha önceden sağlanan dandik fonksiyon aradan çekiliyor. Yani bir başka deyişle, "place holder" olarak adlandırabileceğimiz bir fonksiyon yazmaya olanak veriyor.
Gökçe Tağlıoğlu

Zoroaster

#1032
Startup dosyasında da weak tanımı var ve oradaki amacı biliyorum. Muhtemelen aynı amaca hizmet ediyordur.

Weak tanımlı fonksiyon yerine aynı isimde yeni bir fonksiyon yazarsanız weak tanımlı olan değil yeni tanımlanan fonksiyon geçerli oluyor. Böylece aynı isimde iki fonksiyon oluyor fakat weak tanımlı olan dikkate alınmıyor.

Böylece kullanılmasa da vektör tablosunda adı geçtiği için tanımlanması şart  olan int fonksiyonları gibi diğer fonksiyonları weak tanımlamakla derleme hatalarının önüne geçmiş oluyorsunuz.
Seytan deliginden kacti.

yldzelektronik

Teşekkürler @Tagli

Peki blocking ve nonblocking programlama nedir?Bir yazıda, senkron kelimesiyle arama yapın gibi birşeyler gördüm.Yani senkron programlama diye bir kavram da mı var?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

#1034
Soruları toparlayıp tekrar sorayım.

Alıntı Yap
Peki blocking ve nonblocking programlama nedir?Bir yazıda, senkron kelimesiyle arama yapın gibi birşeyler gördüm.Yani senkron programlama diye bir kavram da mı var?

Hımm.Bir yazıda bu özelliğin, C11 ile geldiğini okudum.Ne kadar doğru?C89 da yok mu?

Hazır konusu açılmışken, Keil ile C89 ve C99 mu kullanabiliyoruz, C11 kullanabiliyor muyuz?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.