logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jeden kawałek programu rozkompilowany na dwie funkcje

bigrom 22 Sty 2020 14:40 528 3
REKLAMA
  • #1 18419748
    bigrom
    Poziom 14  
    Witam,
    Czy wie ktoś jak zrobić w C kawałek programu i żeby po kompilacji były z tego dwie funkcje.
    Mam procedurę główną w której jest maszyna stanów i procedurę funkcję z callback dla komunikacji w której też trzeba przełączać maszynę stanów. Trochę nie wygodne jest pisanie stanów w jednej i drugiej procedurze bo są długie >200linii każda.
    Da się zrobić jedną procedurę ale za to będzie dużo warunków do sprawdzenia w której jest plus do tego maszyna stanów.

    Myślałem o zrobieniu oddzielnego pliku w którym było by takie pseudo makro które w głównym programie przekompilowało kod na dwie funkcje ale tu za do by musiało być dużo makr #if/#endif, właściwie co stan także doszło by jeszcze więcej linii do analizy.
    myślałem o macro DEFPROCESS i DEFCALLBCK, żeby się przeplatały i wtedy elegancka była maszyna stanów ale po próbach nie można całych linijek kodów wkładać do makra.

    Jakieś rozsądne propozycje ?
  • REKLAMA
  • #2 18420569
    ex-or
    Poziom 28  
    Coś na wzór obiektowości: maszyna stanów jako generyczny algorytm, rzeczy które są dla obu instancji różne (dane i procedury) zgrupować w strukturze przekazywanej jako parametr.
    Te dwie maszyny będą niezależne?
    bigrom napisał:
    nie można całych linijek kodów wkładać do makra

    https://gcc.gnu.org/onlinedocs/gcc-7.5.0/cpp/Swallowing-the-Semicolon.html
  • REKLAMA
  • #3 18421082
    bigrom
    Poziom 14  
    Maszyna jest jedna tylko ma wywołania z dwóch miejsc.
    Jeden to główny proces a drugi to wołania callback z funkcji komunikacyjnej.
    DEF_CALLBCK("static void _callback(int8_t status, uint8_t value)")
    DEF_PROCESS("void _process(void)")
    DEF_PROCESS({)
    DEF_CALLBCK({)
    DEF_PROCESS("switch( state ) {")
    DEF_CALLBCK("switch( state ) {")
    DEF_PROCESS(" case ST_INIT:")
    ...
    coś w tym stylu
  • #4 18421320
    ex-or
    Poziom 28  
    bigrom napisał:
    Maszyna jest jedna tylko ma wywołania z dwóch miejsc.

    I dlaczego nie można zrobić jednej procedury i wywoływać jej z dwóch miejsc?
REKLAMA