1. 程式人生 > >函式指標作為結構體的成員

函式指標作為結構體的成員

我發一個執行過的原始碼。
在.h檔案中,有如下程式碼:

//TVM控制狀態
typedef struct _m_TVM_CTRL
{
 u32(*get_coin_totval)(void); //得到此次投入硬幣總金額
 u32(*get_coin_totcnt)(void); //得到此次投入硬幣總數目
 void(*clr_coin)(void);   //清空金額和數目,每次新投幣開始執行

 u32(*get_coin_totrval)(void);//得到此次找零的總金額
 u32(*get_coin_totrcnt)(void);//得到此次找零的硬幣總數目
 void(*clr_rcoin)(void);   //清空金額和數目,每次新找零開始執行

 void(*clr_hpx)(void);      //清空某個hp中的所有硬幣
 void(*thp_add_money)(void);  //將錢數彙總到迴圈找零hp中,當chg_mode為1的時候,可以執行該函式
  u8  cur_cmd;           //當前指令 0X00,無有效指令;0X32,開始收錢;0X33,硬幣回收;0X34,找零; 
  u16 cmd_prm;         //指令引數
 u8  cmd_sta;                 //指令執行狀態
 m_HP_MESSAGE hp_msg[4];   //每個hopper的狀態資訊
}m_TVM_CTRL; 
extern m_TVM_CTRL     TVM_CTRL;    //控制器

在.c檔案中,有如下程式碼:
//TVM主控制器      
m_TVM_CTRL     TVM_CTRL=    //控制器
{
 get_coin_totval,
 get_coin_totcnt,
 clr_coin,

 get_coin_totrval,
 get_coin_totrcnt,
 clr_rcoin,

 clr_hpx,
 thp_add_money,
  0,
 0,
 0,
 0,   
};
get_coin_totva, clr_coinl等都是在.c檔案中存在的函式的函式名。
這樣,就完成了TVM_CTRL這個結構體的函式指標初始化,
接下來就可以方便應用了。
比如我要清空TVM的金額,我只需要寫:TVM_CTRL.clr_coin();即可。
又比如,我要清空某個HOPPER,只需要寫:TVM_CTRL.clr_hpx();
這樣可以及其方便的管理某些裝置的各個狀態。

你可以把任何一個外設都定義為一個結構體,然後在這個裡面包含了該外設的所有執行函式,及狀態變數。從而非常方便的控制該外設。
更好的是,一旦有任何新增功能,只需要在原來的結構體裡面塞函式或者變數就可以了。及其方便維護。

相關推薦

函式指標作為結構成員

我發一個執行過的原始碼。 在.h檔案中,有如下程式碼: //TVM控制狀態 typedef struct _m_TVM_CTRL {  u32(*get_coin_totval)(void); //得到此次投入硬幣總金額  u32(*get_coin_totcnt)(vo

函式指標結構

函式及結構體 1.指標函式      指標函式即帶指標的函式,其本質仍為一個函式,指標函式的返回型別是某一型別的指標。      如char *function1(char *s1, char *

幾種包含函式指標結構列表定義方式

最近做一個功能,用結構體包含函式指標來呼叫函式問題,有幾個問題挺有記錄價值 1.普通實現    typedef struct { const BYTE* funcIndex; const BYTE* funcName; BYTE funcType; void (*

C++類 給結構成員 函式指標 賦值

myStruct標頭檔案 myStruct.h class CMyClass; struct {  int nFlag;  void (CMyClass::*myinit)(int n);  void (CMyClass::*myopen)(int n,void* arg)

c語言結構成員作為函式引數

使用者可以自定義結構體,是C語言的可以更方便的解決各種型別的問題。我們知道結構體變數可以作為函式引數,那結構體內部的成員變數可以作為函式引數麼? #include<stdio.h> #include<string.h> struct Worker{

C++ 字串 14-- 18.40.結構函式 結構作為函式引數、結構指標作為函式返回值

#include <iostream> #include <string> using namespace std; /*--------------------------------- 18.40.結構體與函式 結構體作為函式引數、結構體指標作為

一些可變長度物件(string物件、vector物件 ...)作為結構或類的成員,會不會動態改變結構或類所定義的變數的大小呢?

       可能是我自身的原因,經常性的杞人憂天!        在接觸到C++的一些類時,想的有點多了。事實證明,我確實想多了。但是我覺得可能會有和我一樣會多想的小夥伴,我在這分享一個我想多了的栗

結構成員結構指標初始化

#include<stdio.h>#include <stdlib.h>#include <string>struct student{   char *name;   int score;   struct student* next;

指向結構指標&結構成員指標

1、指向結構體的指標 一個 變數的指標,就是該變數所佔據的記憶體段的起始地址。指向一個結構體的指標變數,其值是結構體變數的起始地址。 /* *copyright(c) 2018,HH *All rights reserved. *作 者:HH *完成日期:2018年8月1

在Golang裡如何實現結構成員指標結構自身指標的轉換

在C語言中有一個經典的巨集定義,可以將結構體struct內部的某個成員的指標轉化為結構體自身的指標。下面是一個例子,通過FIELD_OFFSET巨集計算結構體內一個欄位的偏移,函式getT可以從一個F*的指標獲得對應的T*物件。 struct F { int c; int d; }

C 語言通過結構成員獲得結構指標

通過結構體成員拿到結構體的指標,是C語言實現繼承多型的基礎。面向物件C程式設計可以參看這裡OOC 面向物件C語言程式設計實踐。這裡詳細介紹這個核心的操作方法。 /** * Get struct pointer from member pointer */ #defin

STM32筆記4:基本庫函式寫法(結構指標的應用)

//構建庫函式雛形 //peripheral:外設 #include"stm32f4xx.h" //peripheral #define PERIPHERAL ((unsigned int)(0x40000000)) #define AHB1_BASE ((unsigned

函式返回陣列(指標結構

一般用void的話就是沒有返回值和不需要返回值的了,如呼叫一個輸出函式,這個函式就沒必要返回了,事實上這個函式只管輸出就好了,也沒有什麼值要返回的,另一種是用指標傳址的時候,因為你傳的是地址,函式根據你的地址直接對資料進行操作了,這是就不需要返回值了。 因為對資料的操作在

結構指標變數與結構成員指標變數

C程式碼 #include <stdio.h> #include <stdlib.h> #include <string.h> struct student{    char *name;    int score;  

函式引數呼叫指標結構

一、函式呼叫指標時 void main(void) { int a,int b; a=5; b=3; fun(&a,&b); } void fun(*p1,*p2) { int c; c=*p1; *p1=*p2; *p

使用ctypes呼叫系統C API函式需要注意的問題,函式引數中有指標結構的情況下最好不要修改argtypes

有人向我反應,在程式碼裡同時用我的python模組uiautomation和其它另一個模組後,指令碼執行時會報錯,但單獨使用任意一個模組時都是正常的,沒有錯誤。 我用一個例子來演示下這個問題是如何出現的。 假設我需要寫一個module,這個module需要提供獲取當前滑鼠游標下視窗控制代碼的功能,這需要呼

函數外面對單個結構成員進行賦值出錯

類型 自動 構造 不能 結構體成員 bsp 入口 出錯 進入 關於“為什麽整型的就可以,結構體類型的就不能這麽賦值呢?”——整形等常規數據類型由編譯器自動識別,而自定義的數據類型(樓主自定義的結構體類型),編譯器在編譯階段無法識別,故出錯。 關於“在函數外單個初始化”——在

3.c語音結構成員內存對齊詳解

定義 pre 形狀 sed 兩個 分配 我們 替代 images 一.關鍵一點 最關鍵的一點:結構體在內存中是一個矩形,而不是一個不規則形狀 二.編程實戰 1 #include <stdlib.h> 2 #inc

計算C結構成員偏移量兩種方式本質上是一樣的

BE main print tdd of函數 pan color c結構體 計算 #include <stdio.h> #include <stddef.h> typedef struct test_st { char a[3];

x265原始碼分析:main函式及CLIOptions結構解釋

/** * 返回碼資訊: * 0 – 編碼成功; * 1 – 命令列解釋失敗; * 2 – 編碼器開啟失敗; * 3 – 生成流頭部失敗; * 4 – 編碼出錯; * 5 – 開啟csv檔案失敗. */ int main(int argc, char **argv) {