Fonksiyona farklı tipte parametre aktarımı

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

engineer

11 Mayıs 2017, 13:05:38 Son düzenlenme: 11 Mayıs 2017, 13:09:16 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.

Kod Seç
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.1;
   ... 
}

yamak

Hocam C++ da fonksiyon overloading kullanarak yapabilirsin.
Kod Seç
void Func(P1port)
{
 ....
 ...
}

void Func(P2port)
{
... 
....
}

şeklinde.

controller

Kod Seç


#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);
}

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.

Kod Seç
void Func(void *voidPtruint8_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->1;
}