【发布时间】:2015-05-11 20:34:12
【问题描述】:
我正在为数据记录类型函数编写一些C 代码。从变量中获取值,执行简单的操作,然后将数据塞入另一个变量中。
这里的关键是容纳如此多不同的数据类型和对数据的操作。我尝试使用指向所有不同变量的 void 指针。然后我为每个调用相同的函数。
看一眼函数。你会看到我为每种不同的数据类型一遍又一遍地重写代码。
/***********************************************************/
static void GenData(USHORT data_type,
USHORT operation,
void *var_p,
void *data_p)
/***********************************************************/
{
switch (data_type)
{
case (DATA_INT):
switch (operation) {
case (OP_ONE_SHOT):
*(int*)data_p = *(int*)var_p;
break;
case (OP_COUNTER):
*(int*)data_p += 1;
break;
case (OP_CURR_TIME):
*(int*)data_p = (int)sytime;
case (OP_ELAPSED_TIME):
*(int*)data_p += delta_tick_time;
break;
case (OP_MIN):
if (*(int*)data_p > *(int*)var_p) {
*(int*)data_p = *(int*)var_p;
}
break;
case (OP_MAX):
if (*(int*)data_p < *(int*)var_p) {
*(int*)data_p = *(int*)var_p;
}
break;
case (OP_ADD_ITSELF):
*(int*)data_p += *(int*)data_p;
break;
default:
break;
}
break;
case (DATA_BYTE):
switch (operation) {
case (OP_ONE_SHOT):
*(BYTE*)data_p = *(BYTE*)var_p;
break;
case (OP_COUNTER):
*(BYTE*)data_p += 1;
break;
...
...
case (DATA_SHORT):
...and so on...
}
C 中的 void 指针的算术无效。我不确定这是否意味着我不能让这个功能变得更好。有没有办法可以写这个,这样我就不必一遍又一遍地重写“数学”部分?
与往常一样,感谢您花时间和精力提供帮助。
【问题讨论】:
-
请发布确切的错误消息,复制并粘贴您的编译器错误。
-
您可以为最终具有相同代码的类型使用模板,但最终,类型不同的原因是它们不同,您的代码也会不同。您是否打算允许 ++ 加倍?你有一个比率类型,它的代码不会不同吗?根据您使用的编译器,您可能可以使用“typeof”来传递一个类型以将其转换为。如果可以组合案例,您也可以在您的 switch 语句中组合它们。但是,您需要类型以便上溢/下溢操作发生在正确的位置。
-
我认为这里的代码与其说是问题本身,不如说是问题的征兆。您可能应该修改该组件所在软件的架构:为什么它确实需要一堆不同的类型?不过,可能是有原因的。如果是这样,一个好的方法可能是 Dmitry Grigoryev 的答案。您可能还想修改这些指针参数的用途:它们真的是 C 数据类型还是存储格式?如果是后者,这种方法可能是错误的,例如在字节序问题上。
-
@Jubatian 我将变量中的值传递给模块,该模块将其发送到数据库。我必须保持这些值大约 1-60 秒,然后对其执行此操作(一次或多次)。