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;
...
}
Hocam C++ da fonksiyon overloading kullanarak yapabilirsin.
void Func(P1* port)
{
....
...
}
void Func(P2* port)
{
...
....
}
şeklinde.
#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);
}
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.
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;
}
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);
}