C de anlayamadığım yapı

Başlatan Mucit23, 02 Şubat 2016, 16:13:49

Mucit23

STM32F7 de kamera ile ilgili kodları inceliyordum.

Şöyle bir Struct tanımlanmış.

/** @defgroup CAMERA_Driver_structure  Camera Driver structure
  * @{
  */
typedef struct
{
  void     (*Init)(uint16_t, uint32_t);
  uint16_t (*ReadID)(uint16_t);  
  void     (*Config)(uint16_t, uint32_t, uint32_t, uint32_t);
}CAMERA_DrvTypeDef;


Struct içerisinde fonksiyonlar vs var ama Init adında bir fonksiyon kütüphane içerisinde yok.
Normalde aşağıdaki fonksiyon çağrılması gerekiyor

void ov9655_Init(uint16_t DeviceAddr, uint32_t resolution)
void ov9655_Config(uint16_t DeviceAddr, uint32_t feature, uint32_t value, uint32_t brightness_value)

Bu yapı nasıl çalışır?

yldzelektronik

Yapı içinde fonksiyon pointerlar var.O işi yapan static fonksiyon tanımlaman ve o fonksiyonun adresini structın ilgili elemanına eşitlemen gerekiyor.Örneğin;

static void ov9655_Init(uint16_t DeviceAddr, uint32_t resolution){

}

CAMERA_DrvTypeDef cam_drv;
cam_drv.init = &ov9655_Init;

gibi bir şey.Kodlar tam olarak böyle değil tabii ki.Ama konuyu anlatmıştır diye düşünüyorum.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mucit23

Aşağıdaki gibi kullanılıyor
camera_drv->Init(CameraHwAddress, CAMERA_R640x480);

Kullanımı anladım.

Sruct içerisindeki   void     (*Init)(uint16_t, uint32_t); tanımlaması nasıl ov9655_Init fonksiyonuna bağlanıyor? Bunu anlayamadım.

yldzelektronik

Biryerlerde muhakkak bahsettiğim atamayı yapmıştır.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

engineer

typedef struct
{
  void     (*Init)(uint16_t, uint32_t);
  uint16_t (*ReadID)(uint16_t);  
  void     (*Config)(uint16_t, uint32_t, uint32_t, uint32_t);
}CAMERA_DrvTypeDef;

CAMERA_DrvTypeDef   s5k5cag_drv =
{
  s5k5cag_Init,
  s5k5cag_ReadID,
  s5k5cag_Config,
};

void s5k5cag_Init(uint16_t DeviceAddr, uint32_t resolution)
{
...
}

void s5k5cag_Config(uint16_t DeviceAddr, uint32_t feature, uint32_t value, uint32_t brightness_value)
{
...
}

uint16_t s5k5cag_ReadID(uint16_t DeviceAddr)
{
...
}


CAMERA_DrvTypeDef   *camera_drv;
camera_drv = &s5k5cag_drv;

yldzelektronik

@engineer bu yazdığın kodu anlayamadım.Açıklayabilir misin?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

engineer

#6
Bu kodu ben yazmadım, örnek teşkil etmesi açısından copy/paste yaptım. Şöyle açıklıyayım;

* İlk başta CAMERA_DrvTypeDef adında yapı tip tanımlaması yapılıyor, yapının elemanlarında ise function pointer'lar kullanılmış.
* İkinci olarak CAMERA_DrvTypeDef tipinde s5k5cag_drv yapısı tanımlanmış ve yapı elemanlarına ilk değer atamaları yapılmış. Burada ilk değer
atanırken s5k5cag driver'ı ile ilgili fonksiyonların adları CAMERA_DrvTypeDef yapısındaki function pointer'lar ile ilişkilendiriliyor,
fonksiyona yeni bir ad tanımlamak gibi.
* Daha sonra s5k5cag_drv 'a camera_drv şeklinde yeni bir isim veriliyor.

Bu aşamalardan sonra artık ben camera_drv->Init(); dediğimde  s5k5cag_Init fonksiyonu çağırılıyor. C ile C++ yapmaya zorlanmış gibi.
Bu son ifadem biraz acayip oldu ama anlayan anlamıştır sanırım :)

Edit:
CAMERA_DrvTypeDef yapısındaki her eleman birer değişken, birer fonksiyon değil ancak fonksiyon'a işaret eden bir değişken.

yldzelektronik

"CAMERA_DrvTypeDef   s5k5cag_drv =" tanımındaki = kısmını görememişim.Ben de CAMERA_DrvTypeDef   türünde s5k5cag_drv isminde yeni yapı tanımlıyorsunuz diye düşündüm.Elemanların türleri yok nasıl oluyor ki dedim.Teşekkürler.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mucit23

@engineer teşekkürler

Bende şimdi tekrar baktım kodları karıştırırken diğer struct'ı buldum. Kodlar çok karışık kaybolup gidiyorum resmen

CAMERA_DrvTypeDef   ov9655_drv =
{
  ov9655_Init,
  ov9655_ReadID, 
  ov9655_Config,
};

Ama yapıyı anladım.  :)

engineer