Fonksiyona farklı tipte parametre aktarımı

Başlatan engineer, 11 Mayıs 2017, 10:05:38

engineer

Merhaba, elimde 2 adet yapı var ve bunların herbirinin eleman isimleri aynı ve bellekte kapladıkları alanlarda eşit. Yazdığım fonksiyon bu 2 yapıdan herhangi birini parametre alıp işliyebilmeli ancak bir türlü tür dönüşümü yapamadım. Aşağıdaki örnek biraz saçma oldu ama, bu olayı nasıl gerçekleyebilirim onu merak ediyorum. C/C++ ikiside olur.

struct P1_t{
   __IO uint8_t A : 1;
   __IO uint8_t RESERVED1 : 3;
   __IO uint8_t B : 1;
   __IO uint8_t C : 1;
   __IO uint8_t RESERVED2 : 2;
}P1;

struct P2_t{
   __IO uint8_t A : 1;
   __IO uint8_t RESERVED1 : 2;
   __IO uint8_t B : 1;
   __IO uint8_t RESERVED2 : 2;
   __IO uint8_t C : 1;
   __IO uint8_t RESERVED3 : 1;
}P2;


int main(void)
{
   while(1){
      Func(&P1);
      Func(&P2);
   }
}
 
void Func(void *Port)
{
   if(...) Port.A = 1;
   ... 
}

yamak

Hocam C++ da fonksiyon overloading kullanarak yapabilirsin.
void Func(P1* port)
{
 ....
 ...
}

void Func(P2* port)
{
... 
....
}

şeklinde.

controller

#include <stdio.h>


#define __IO
typedef unsigned char uint8_t;


typedef struct P1_t{
   __IO uint8_t A : 1;
   __IO uint8_t RESERVED1 : 3;
   __IO uint8_t B : 1;
   __IO uint8_t C : 1;
   __IO uint8_t RESERVED2 : 2;
} P1;


typedef struct P2_t{
   __IO uint8_t A : 1;
   __IO uint8_t RESERVED1 : 2;
   __IO uint8_t B : 1;
   __IO uint8_t RESERVED2 : 2;
   __IO uint8_t C : 1;
   __IO uint8_t RESERVED3 : 1;
} P2;


void Func(P1 *Port)
{
   printf("Port->RESERVED1 %d\n", Port->RESERVED1);
}


void Func(P2 *Port)
{
   printf("Port->RESERVED3 %d\n", Port->RESERVED3);
}


int main(void)
{
    P1 p1;
    P2 p2;
    
    p1.RESERVED1 = 7;
    p2.RESERVED3 = 1;
      
    Func(&p1);
    Func(&p2);
}
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

engineer

Aynen arkadaşlar belirttiğiniz gibi function overloading ile yapılabilir ancak fonksiyon gövdesi uzun ve birebir aynı işi yapacağından dolayı kod boyutunu arttırmak istemedim, elimdeki yapılarda 2'den fazla en az 4-5 tane fonksiyon olacak demek bu da.

engineer

void pointer kullanıp aşağıdaki şekilde cast edince yiyor ancak bu sefer sorun tekrar aynı değişkeni farklı tipte tanımlamak istememde :S
Mecburen function overloading yapıcaz sanırım.

void Func(void *voidPtr, uint8_t PortNo)
{
   switch(PortNo){
      case 1:
         P1_t *PX = static_cast<P1_t*>(voidPtr);
         break;

      case 2:
         P2_t *PX = static_cast<P2_t*>(voidPtr);
         break;
   }

   PX->A = 1;
}

brandice5

Yazdığınız fonksiyonun gövdesi hiç değişmiyor ve birebir aynı ise "template function" sizi fonksiyonu her değişken tipi için ayrı ayrı yazmaktan kurtarır.

template <typename T>
void Func(T& Port)
{
    printf("A %d\n", Port.A);
}

int main(void)
{
    P1 p1;
    P2 p2;
    
    p1.A = 0;
    p2.A = 1;
      
    Func(p1);
    Func(p2);
}