This post is also available in: English

forum-banner


Forum Navigation
Konu ve mesaj oluşturabilmek için giriş yapmanız gerekmektedir.

Pointer yada İşaretçiler Hakkında

Konu kapanmıştır.

Merhabalar

Pointer yani işaretçiler C nin can damarı ve en güçlü kısmıdır. Pointer ile aslında RAM direk olarak okunup yazılabilir bu özellik yanlızca C dilinde vardır.

Örnek vermek gerekirse bir fonksiyon yaptın fonksiyondan hem veri gelecek hemde hata oluşup oluşmadığını anlaman gerekli. Mantık olarak diyebiliriz "0" geldiğinde hata olsun, ya veri olarak ta "0" gelmişse o halde nasıl ayrım yapacağız.

İşte burada devreye pointer girer böylece veriyi return ile alırken eklediğimiz pointer ile fonksiyon içerisinden istediğimiz değişkeni okuyabiliriz. Hatta void tipinde fonksiyon içerisinden veri bile okuyabiliriz. Bu sadece tek örnek

Diğer yandan örnek olarak CRC kütüphanesini inceleyebilirsin. CRC kütüphanesi gibi düşünelim kullanıcı isterse 10 byte ister 1000 byte veri için crc hesaplamak isteyebilir. O halde biz nasıl bir sistem yapmalıyız ki bu esneklik oluşsun. Bunun içinde fonksiyon parametresine bir pointer atarız ve kullanıcı kendi verisinin başlangıç adresini burada belirtir böylece fonksiyon pointer aracılığı ile kullanıcı verisini tarayabilir.

Tekrar başa dönecek olursak pointer RAM in direk olarak okunmasını ve yazılmasını sağlar. Bu çok güçlü ve önemli bir C dili özelliğidir.

Bu örnekler için RF verici alıcı konusunu veya CRC konusunu inceleyebilirsin .

İyi Çalışmalar

Konu kapanmıştır.

Merhabalar

Hayır bunun port ile ilgilisi yok. Pointer C ile ilgili PC yda MCU da fark etmez sadece RAM ile ilgili işlem yapar. Bunun portlar ile ilgisi yok.

örnek olarka X fonksiyonunda A adında değişken var . Bunun adresini bilirsek dışarıdan pointer ile bulunduğu RAM gözünde yazılı olan veriyi return kullanmadan okuyabiliriz. Temel mantığı bu.

unsigned char RF_433MHZ_VERI_AL(unsigned char *VERI_HATASI
,unsigned char DIZI_SAYISI,unsigned char CRC7_POLINOM
,unsigned char ON_TANIMLAMA_KODU) 
 { 
    unsigned char hata=0,*VERI=0,crc=0,tanimlama_kodu=0,i=0; 
    MM_Init() ;//heap alanı proje ayarlarından ayarlanmalıdır 512 byte 
    VERI=(unsigned char*)Malloc( sizeof(unsigned char)*DIZI_SAYISI); 
    if(VERI==0){return 255;}//RAM YETERSİZ KODU 255 TİR 

// veri okuma bölümü 
    tanimlama_kodu=UART_VERI_AL(&hata);//tanımlama kodu 
    for(i=0;i<DIZI_SAYISI;i++) 
       { 
          VERI[i]=UART_VERI_AL(&hata);//veri 
       } 
     crc=UART_VERI_AL(&hata);//hesaplanmış crc kodu 
 
//hata kontrol bölümü 
  if(ON_TANIMLAMA_KODU!=tanimlama_kodu) //ön tanımlama kod hatası 
    { 
      *veri_hatasi=1; return ; 
    } 
  if( CRC7(VERI,DIZI_SAYISI,CRC7_POLINOM,crc)!=0 ) 
    { 
      *veri_hatasi=255; return ; 
    } 
  else //hata yok ise 
   { 
    *veri_hatasi=0; return &VERI[0];//hata yoksa veri geri döndürülür 
POİNTERİN İLK ADRESİ 
   } 
}

 

Yukarıda görüleceği gibi veri returle geri döndürülürken hata olup olmadığı pointer ile denetlenir. Buna standart C fonksiyonlarıda Flag yani bayrak derler. Bir fonksiyonda birden fazla nokta denetlenmesi gerekebilir bunu da pointerlar ile yapıyoruz yukarıdaki RF verici örneğinde olduğu gibi

Yani Pointer yada işaretçi RAM ile ilgili işlem yapar ve C nin genel bir aracıdır. Port ile MCU ile ilgili değildir kullanıldığı sistemin RAM leri ile ilgili işlemler yapmaya yarar.

İyi Çalışmalar

Konu kapanmıştır.

Merhabalar

İlk olarak bu kodu gerçektemi deniyorsun simülasyonda mı ?

En sondaki while nin amacını anlayamadım ?

Adresi dönüştürürken "inttostr" kullan, enerjiyi tamamen kesmeyi dene yada "A" dan önce rastgele başka değişkenler tanımla. Teorik olarak evet rastgele bir yere yazdırır ancak tek değişken olduğundan aynı yere yazdırmış olma ihtimali var.

Kitap olarak çok doğru bir seçim yapmışsın

İyi Çalışmalar