2017-08-31 62 views
0

請的....結構中使用函數func陣列

我試圖讓其目的是像一個lib基於結構 我想達到像「庫mats.basic.add(1,1) ;」

當構建是內部結構(兩者)第一行,然後 是,雖然編輯器,如添加或子 下一個錯誤是「UKNOWN成員加點動作後暗示我

第一個錯誤,子

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

typedef uint8_t (*p_fn1)(uint8_t,uint8_t); 

uint8_t fn_add(uint8_t num1,uint8_t num2){ 
    return num1+num2; 
} 

uint8_t fn_sub(uint8_t num1,uint8_t num2){ 
    return num1-num2; 
} 

typedef struct mats { 
    p_fn1 add=fn_add; 
    p_fn1 sub=fn_sub; 
}mats; 

void init_mats(mats* t_mats){ 
    t_mats->add=fn_add; 
    t_mats->sub=fn_sub; 
} 
int main() 
{ 
    mats mats_s; 
    init_mats(&mats_s); 
    uint8_t c=mats_s.add(1,1); 
    printf("%d",c); 
    return 0; 
} 

非常感謝

+1

'p_fn1 add = fn_add; p_fn1 sub = fn_sub;'無效。它不能在結構定義中分配。試一下'typedef struct mats {p> 0; p_fn1 add; p_fn1 sub; }地墊;'。另外'fn_sum'輸入錯誤爲'fn_sub' – BLUEPIXY

+0

謝謝你是對的,所以我不能在結構中指定func的地址,它現在可以工作:) –

+2

將'&d'改爲'%d'將會改善結果,定義 –

回答

2

您正在嘗試初始化結構成員時,您定義的結構,這是無效的語法。

從定義中刪除那些初始化。

typedef struct mats { 
    p_fn1 add; 
    p_fn1 sub; 
}mats; 
0

如果您想擁有可以在您的類型上調用的方法,請使用C++編寫您的程序。它有這個功能; C沒有。

在純C中沒有辦法做到這一點,它不會笨拙寫入,運行速度慢和/或使用不適當的內存量。您嘗試的具體方式完全不起作用,因爲您試圖在類型上設置字段,而不是在該類型的實例上,但即使您修復了該問題,仍然會遇到該語言的一些其他基本限制。

+0

所以請......這樣做是如此糟糕,以我表現出的方​​式? 我所想要做的是有一個驅動器,用於顯示這將提示您 像 LCD_driver.write_data.alphanumeric.sentence(「HELLO WORLD」); 所以你可以看到我需要至少三個結構和指針... 對於MCU來說這麼糟糕嗎? (我打算在8位,32位......中使用它) –

+0

@VladimírŠustek對於微控制器來說,這實際上特別糟糕。通過函數指針調用是一個相對昂貴的操作,編譯器通常無法優化它。再說一遍:如果你想要這種語法,可以使用C++。 – duskwuff

+0

因此,C++語法就是爲了這些目的,它確保了最優化,並且MCU會很好地工作呢? 謝謝你的建議! –