【问题标题】:adding heterogeneous members to an array将异构成员添加到数组
【发布时间】:2014-02-10 14:11:28
【问题描述】:

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

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

我使用“通道”作为线程之间的共享区域。

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

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

【问题讨论】:

  • 如果你想要通用指针,使用void *而不是char *
  • 问题是我不想将 n 作为指针传递,我想传递给 'n' 的实际值。
  • 这不是一个好主意。即使您传递 n 的实际值并在函数上使用另一种类型接收它,即使您确保不使用其他表示访问它,即使您可以确保 n 始终适合在另一种类型中,您仍然不会取得太大成就。 API 的意义何在,您可以发送整数、字符或浮点数的值,但不能发送更大的结构或数组的值?在设计时,尽量减少异常。如果您的设计说:您可以使用这些类型,但不能使用这些类型,那么您做错了。
  • 顺便说一句,这是一个贯穿 Java 设计的错误。 您可以引用对象,但不能引用基本类型的变量您可以按值传递,但只能传递基本类型的变量您只能拥有类类型的模板,但不能拥有基本类型的模板。然后有一整套仅适用于数组的例外。通过从 Java 的错误中学习并设计您的 API 使其不会出现异常,您会做得很好。
  • 同意,但我正在做作业并且提供了 api,我只是“让它工作”。感谢您的评论,并考虑到它,因为您提出了一个有效的观点。我认为不应该使用已接受答案中的结构,因为它遵循 api,但作为一项额外的任务,我会改进 api。也要注意你的 java 评论。

标签: c arrays


【解决方案1】:

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

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

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

【讨论】:

  • 那位女士/先生,很漂亮。
【解决方案2】:

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

    // ...
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2018-10-04
  • 1970-01-01
  • 2021-10-23
相关资源
最近更新 更多