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

时间:2016-01-15 06:13:34

标签: 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字节指针)。 也许有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:4)

标记联合允许您携带包含数据的类型信息,并且不占用大量空间:

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);