将异构成员添加到数组中

时间:2014-02-10 14:11:28

标签: c arrays

我正在使用自定义线程api,我想生成一个带有两个指向消息通道和整数的新线程。

spawn_thread(Proctype Procedure, int argc, char *argv[]);

我使用'渠道'作为线程之间的共享区域。

我有三个变量: `Chan * return,Chan * receive and an int n'

我可以简单地将我想要存储在* argv []中的所有值转换为字符吗? 我没有这样做的原因是char的宽度只有8位,因此最大值为255,这不足以保持指针或大值。

2 个答案:

答案 0 :(得分:2)

将异构数据存储在C数组中的一种常见方法是使用带标记的联合:

typedef enum {chDataReturn, chDataReceive, chDataInt} ChannelDataType;
struct ChannelData {
    ChannelDataType type;
    union {
         ChanReturn ret;
         ChanReceive rcv;
         int num;
    } data;
};

现在您的spawn_thread原型看起来如下:

spawn_thread(Proctype Procedure, int argc, struct ChannelData *argv);

用户会将数据放入argv s的数组中,“标记”每个项目的类型,如下所示:

struct ChannelData *data = malloc(3*sizeof(struct ChannelData));
data[0].type = chDataReturn;
data[0].data.ret = myReturn;
data[1].type = chDataReceive;
data[1].data.ret = myReceive;
data[2].type = chDataInt;
data[3].data.num = 12345;
spawn_thread(myProc, 3, data);
// Wait for the thread to finish, and then...
...
free(data);

答案 1 :(得分:1)

char * argv[]传递char **,您可以轻松地投射到void **,基本上允许您将void *数组传递给您喜欢的任何内容。

char * argv[] = {&return, &receive, &n};
spawn_thread(Procedure, 3, argv);

Procedure(int argc, char *argv[]) {
    char return = *argv[0];
    char receive = *argv[1];
    int return = *(int *)argv[2];

    // ...
}