Gönderen Konu: Fonksiyona farklı tipte parametre aktarımı  (Okunma sayısı 726 defa)

Çevrimdışı engineer

  • Kıdemli
  • ****
  • İleti: 126
Fonksiyona farklı tipte parametre aktarımı
« : 12 Mayıs 2017, 01: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.

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.A = 1;
   ...
}
« Son Düzenleme: 12 Mayıs 2017, 01:09:16 Gönderen: engineer »

Çevrimdışı yamak

  • Profesyonel Üye
  • *****
  • İleti: 1901
Ynt: Fonksiyona farklı tipte parametre aktarımı
« Yanıtla #1 : 12 Mayıs 2017, 02:09:27 »
Hocam C++ da fonksiyon overloading kullanarak yapabilirsin.
Kod: [Seç]
void Func(P1* port)
{
 ....
 ...
}

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

Çevrimdışı controller

  • Kıdemli
  • ****
  • İleti: 318
Ynt: Fonksiyona farklı tipte parametre aktarımı
« Yanıtla #2 : 12 Mayıs 2017, 02:13:15 »
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);
}

Çevrimdışı engineer

  • Kıdemli
  • ****
  • İleti: 126
Ynt: Fonksiyona farklı tipte parametre aktarımı
« Yanıtla #3 : 12 Mayıs 2017, 02: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.

Çevrimdışı engineer

  • Kıdemli
  • ****
  • İleti: 126
Ynt: Fonksiyona farklı tipte parametre aktarımı
« Yanıtla #4 : 12 Mayıs 2017, 02: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.

Kod: [Seç]
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;
}