我正在研究C語言中的小解析器和「方程求解器」,這個過程的一部分就是對算術運算進行算術運算。 每個標記包含void *指向數值數據的指針,以及枚舉,它定義數據的類型。算術運算void *指向數值數據
這是函數的示例,它通過添加兩個其他標記來創建新標記。爲了做到這一點,我需要
- 檢查類型
- 投
- 做手術
- 創建結果新的令牌
一個
Token* _CreateTokenByAddition(Token* arg1, Token* arg2){
Token *tokenResult;
if ((arg1->_type == tk_IntData) && (arg2->_type == tk_IntData)){
int* intResult = malloc(sizeof(int));
*intResult = *(int*)arg1->_data + *(int*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_IntData);
}else
if ((arg1->_type == tk_IntData) && (arg2->_type == tk_FloatData)){
float* intResult = malloc(sizeof(float));
*intResult = *(int*)arg1->_data + *(float*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_FloatData);
}else
if ((arg1->_type == tk_FloatData) && (arg2->_type == tk_IntData)){
float* intResult = malloc(sizeof(float));
*intResult = *(float*)arg1->_data + *(int*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_FloatData);
}
else
if ((arg1->_type == tk_FloatData) && (arg2->_type == tk_FloatData)){
float* intResult = malloc(sizeof(float));
*intResult = *(float*)arg1->_data + *(float*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_FloatData);
}
return tokenResult;
}
我有 - ,*,/幾乎相同的功能。我可能需要創造更多。
問題是: 如何創建一個支持所有簡單操作的通用函數,如+ - * /? 我不想把這個函數放在宏中,然後通過替換數學操作數來複制它4次。 無論如何我可以簡化數據類型檢查和從void指針轉換?
任何方式,我可以讓這個代碼,更好?
假設:我沒有任何非數值數據類型(如字符串)
感謝
酷,非常感謝這些答覆,我看你的函數指針的意思。 我將考慮它並使用這些方法之一。謝謝
想要獲得第一個答案優勢嗎? – rpetrich 2010-02-23 22:41:57