[英]C Struct-Function Pointer-Passing Self Reference As Argument
我想運行我的struct指向的函數和自動填充功能。
這是我正在努力的部分:
#include <stdio.h>
#include <stdlib.h>
struct Fra { //Fraction
int n; //Numerator
int d; //Denominator
void (*p)(struct Fra*);
void (*sD)(int, struct Fra*);
void (*sN)(int, struct Fra*);
};
void print(struct Fra*);
void setDenom(int, struct Fra*);
void setNum(int, struct Fra*);
int main() {
struct Fra* fraA = 0;
fraA = (struct Fra*) malloc(sizeof(struct Fra));
fraA->sN = setNum;
fraA->sN(2, fraA);
fraA->sD = setDenom;
fraA->sD(3, fraA);
fraA->p = print;
fraA->p(fraA);
return 0;
}
這就是我一直在努力實現的目標
從:
fraA->sN(2, fraA);
fraA->sD(3, fraA);
fraA->p(fraA);
至:
fraA->sN(2);
fraA->sD(3);
fraA->p();
花了一些時間在試錯之后,我得出的結論是我需要幫助。 我試過瀏覽,但似乎我沒有正確的關鍵字,所以我無法驗證這個問題是否是雙重問題。
謝謝你的幫助。
您可以聲明一些宏以保存始終傳遞正確的引用,這就是您可以做的所有事情:
#define FRA_NEW(this, sN sD, sP) \
{ \
(this) = calloc(sizeof(*(this))) \
if (this) \
{ \
(this)->sN = (sN); \
(this)->sN = (sD); \
(this)->sN = (sP); \
} \
}
#define FR_DELETE(this) \
free(this)
#define FRA_PRINT(this) \
(this)->print(this)
#define FRA_SETNUM(this, num) \
(this)->setNum(this, num)
#define FRA_SETDENOM(this, denom) \
(this)->setDenom(this, denom)
另外我建議將“this”作為“member”函數的第一個參數。
int main(void)
{
struct Fra * fraA = NULL;
FRA_NEW(fraA, setNum, setDenom, print);
if (NULL == fraA)
{
perror("FRA_NEW() failed");
return 1;
}
FRA_SETNUM(fraA, 2);
FRA_SETDENOM(fraA, 3);
FRA_PRINT(fraA);
FRA_DELETE(fraA);
return 0;
}
我能想到的唯一真正有用的方法是提供完成工作的功能:
void call_print(struct Fra* fra)
{
fra->p(fra);
}
void call_setDenom(int val, struct Fra* fra)
{
fra->sD(val, fra);
}
void call_setNum(int val, struct Fra* fra);
{
fra->sN(val, fra);
}
並使用這些:
call_setNum(2, fraA);
call_setDenom(3, fraA);
call_print(fraA);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.