c - 使用指向数值数据的 void* 指针的算术运算

标签 c parsing casting

我正在使用 C 编写小型解析器和“方程式求解器”,这个过程的一部分是对标记进行算术运算。 每个 token 都包含指向数值数据的 void* 指针和定义数据类型的枚举。

这是函数示例,它通过添加另外两个标记来创建新标记。为此,我需要

  1. 支票类型
  2. Actor
  3. 做运营
  4. 根据结果创建新 token

一个

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 指针的数据类型检查和转换?

有什么方法可以让这段代码变得更好?

假设:我没有任何非数字数据类型(例如字符串)

谢谢

太好了,非常感谢这些回复,我明白你所说的函​​数指针是什么意思了。 我将考虑并使用其中一种方法。谢谢

最佳答案

简答: c 根本不提供任何语法帮助。

好消息:您可以通过使用函数指针在 c 语言中支持多态性。 Stack Overflow 上已经有许多解释如何 的问题。稍后我将编辑一两个链接...

不喜欢我为这个用途找到的答案,所以这里是。

对于每个操作,编写一组采用所有合法类型组合的函数。每个人只做一种组合,所以很容易。然后像这样构造一个函数指针表

typedef Token* (*mathfuncptr)(void *, void *);

Token* _Add_IntInt(void *, void *);
Token* _Add_IntFloat(void *, void *);
Token* _Add_FloatInt(void *, void *);
/* ... */

mathfuncptr Add_table[AddTypeCount][AddTypeCount] = {
  {_Add_IntInt,   _Add_IntFloat},
  {_Add_FloatInt, _Add_FloatFloat}
};
mathfuncptr Mul_table[MultTypeCount][MultTypeCount] = { /* ... */

现在您的通用添加函数确定它具有的两种类型,并通过索引到表中来调用正确的函数。

关于c - 使用指向数值数据的 void* 指针的算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2322277/

相关文章:

c - 制作 C 库的一部分 "private"

c - 使用 sleep() 时 C 语言中 puts() 和 printf() 的区别

java - String.split() 按两种模式之一

javascript - JSON 模式解析器 Javascript

c# - 我不明白有关 .NET 继承/转换的某些内容?

c - 更改数据类型后程序不显示第一个操作数

c - sprintf 代码占用大量空间(嵌入式)

Java多线程解析器

optimization - 为什么即使在本例中已经确定了类型,但仍然需要强制转换类型?

java - 未经检查强制转换为实现 Map<String, V> 的泛型类