Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => C/C++ => Konuyu başlatan: engineer - 11 Mayıs 2017, 10:05:38

Başlık: Fonksiyona farklı tipte parametre aktarımı
Gönderen: engineer - 11 Mayıs 2017, 10:05:38
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;
   ...
}
Başlık: Ynt: Fonksiyona farklı tipte parametre aktarımı
Gönderen: yamak - 11 Mayıs 2017, 11:09:27
Hocam C++ da fonksiyon overloading kullanarak yapabilirsin.
void Func(P1* port)
{
....
...
}

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

şeklinde.
Başlık: Ynt: Fonksiyona farklı tipte parametre aktarımı
Gönderen: controller - 11 Mayıs 2017, 11:13:15


#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);
}
Başlık: Ynt: Fonksiyona farklı tipte parametre aktarımı
Gönderen: engineer - 11 Mayıs 2017, 11:23:08
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.
Başlık: Ynt: Fonksiyona farklı tipte parametre aktarımı
Gönderen: engineer - 11 Mayıs 2017, 11:54:32
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;
}
Başlık: Ynt: Fonksiyona farklı tipte parametre aktarımı
Gönderen: brandice5 - 29 Eylül 2019, 18:05:08
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);
}