c - 在 C 中打印出非均匀参数列表

标签 c embedded

我有一些设备有很多不同的参数,可以是 bool、char、int、float、string 等等。我需要在某个 AJAX 数组(用于 Web 界面控件)中一次打印它们。我必须使用纯 C,而且这段代码将在一些 ROM/RAM 资源有限的 MCU 上运行。可能的方法是什么?如果它们都是统一的,比如 int,我可以只使用数组:

Uint16_t params[PARAM_1]=GetParam(PARAM_1);

PrintParams(&params)
{
   For(iii=0;iii<MAX_COUNT;iii++)
   {
   HTTPPrint(params[iii]);
   }
}

但他们不是。 根本不对它们进行分组将容易出错,然后添加/删除参数,并且还会产生开销:

Uint16_t param1= GetParam1();
Float param2= GetParam2();

PrintParams(&params)
{
HTTPPrint(param1);
HTTPPrint(param2);
//another 100+ parameters to print

}

使用一些高级数据结构,比如链表会带来巨大的开销(对于任何单个字符至少需要存储 4 个字节的指针)。 也许还有其他方法可以做到这一点?

最佳答案

Tagged union 允许您在数据中携带类型信息并且不会占用太多空间:

enum type_t {
    kTypeChar = 1,
    kTypeInt = 2
};

union data_t { 
    char i8; 
    int i32; 
};

struct anytype { 
    enum type_t tag; 
    union data_t data;
};

可以直接对储值类型进行案例分析。尽管它确实在类型标签和值不匹配方面留下了一些错误空间:

struct anytype v = GetParam(PARAM_1);

switch (v->tag) {
case kTypeChar: HTTPPrintChar(v->data.i8); break;
case kTypeInt:  HTTPPrintInt(v->data.i32); break;
default:        assert(0);
};

或者您可以在每种类型中添加一个多态打印处理程序,以使其不易出错。虽然它会消耗额外的空间来携带所有数据项的指针,但它不太容易出错并且更易于使用。

typedef void (*print_func_t) (struct polytype* self);

struct polytype {
    print_func_t print;
    union data_t data;
};

void print_char(struct polytype* self) {
    HTTPPrintChar(self->data.i8);
}

void print_int(struct polytype* self) {
    HTTPPrintChar(self->data.i32);
}

struct polytype t = GetParam(PARAM_1); /* GetParam sets proper print fptr based on param type */
t.print(&t);

关于c - 在 C 中打印出非均匀参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34805305/

相关文章:

c - 此字符副本如何工作 : *(*((char**)p))++ = ch; in c

c - Tiva 上的 I2C 接口(interface)

C崩溃,大图上的BFS可能路线

c - int x = 时间(NULL); => 段错误?

c - 编译时 Sizeof 结构成员技巧不起作用

memory - NAND 闪存接口(interface) ARM9 MTD 分区未生成

iphone - 通过无线信号在两个设备之间进行实时同步

c - 为什么使用不同的循环会得到不同的输出?

python - 令人困惑的引用所有权 : how to properly deallocate (via Py_DECREF) objects of an object?

c - C宏中参数的变量号