Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Przekazywanie dwóch różnych struktur do jednej funkcji

Ostatnio zmodyfikowano 2017-07-13 11:22
Autor Wiadomość
sworduke
Temat założony przez niniejszego użytkownika
[C] Przekazywanie dwóch różnych struktur do jednej funkcji
» 2017-07-12 15:02:40
Witam,

Zaciąłem się na takim przypadku.

Są dwie struktury danych o podobnej budowie, różnią się tylko długością bufora.
Problem w tym, że muszę powielać wszystkie funkcje obsługujące te dane
ponieważ nie mogę przekazać do funkcji innego typy danych (buffer_t, sbuffer_t)

Jak zrobić, żeby można wywoływać zawsze tą samą funkcję niezależnie od
przekazanej struktury?

Pozdrawiam,
sworduke

C/C++
//struktury

typedef struct sbuffer_t sbuffer_t;
struct sbuffer_t {
    char data[ 10 ];
    uint8_t index;
    uint16_t counter;
};

typedef struct buffer_t buffer_t;
struct buffer_t {
    char data[ 20 ];
    uint8_t index;
    uint16_t counter;
};

//definicja zmiennych

buffer_t XXX;
sbuffer_t YYY;

//funkcje

void buffer_init( buffer_t * buffer ) {
    buffer->data[ 0 ] = '\0';
    buffer->index = 0;
    buffer->counter = 0;
}

void sbuffer_init( sbuffer_t * buffer ) {
    buffer->data[ 0 ] = '\0';
    buffer->index = 0;
    buffer->counter = 0;
}

//wywolanie

buffer_init( XXX );
sbuffer_init( YYY );
P-163221
DejaVu
» 2017-07-12 15:18:15
Dziwny kod. Zamiast przekazywać strukturę możesz przekazać po prostu wskaźniki do poszczególnych pól. Wówczas algorytm masz uniwersalny. Przykład:
C/C++
void funkcjaX( int & _pole1, char *& _pole2, int & _pole3 )
{
    //TODO: Właściwa implementacja
}

void funkcjaX( struktura1 & _s )
{
    funkcjaX( _s.pole1, _s.pole2, _s.pole3 );
}

void funkcjaX( struktura2 & _s )
{
    funkcjaX( _s.pole1, _s.pole2, _s.pole3 );
}

W C nie masz referencji, więc zastępujesz ją wskaźnikami, aby mieć bezpośredni dostęp do danych.
P-163222
sworduke
Temat założony przez niniejszego użytkownika
» 2017-07-13 11:22:13
OK, dzięki za pomysł. Nie wiem czy przyjmie mi to kompilator bo to jest system embedded ale spróbuję.

Pozdrawiam
P-163235
« 1 »
  Strona 1 z 1