函式指標作為結構體的成員
我發一個執行過的原始碼。
在.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) {