gpt4 book ai didi

c - 具有共享内存和信号量的多个灵活阵列成员或 VLA

转载 作者:行者123 更新时间:2023-11-30 19:30:51 27 4
gpt4 key购买 nike

我需要定义一个结构体,其中包含两个信号量和三​​个(至少)或更多数组作为大小为变量的结构体成员。指示性示例(不是正确的语法,而是给出上下文含义;lrdouble 的 typedef):

int nx = 400,ny = 400,nz = 400;
struct ShMem {
sem_t prod;
sem_t cons;
lr u_x[nx+1][ny+2][nz+2];
lr u_y[nx+2][ny+1][nz+2];
lr u_z[nx+2][ny+2][nz+2];
};

我需要做的是将结构 ShMem 作为两个代码(即生产者和消费者)之间的共享内存块,这两个代码在结构中存在的信号量的帮助下计算和读取该内存块。

由于数组大小是变量并且将在运行时定义,我如何获得 3 维可变长度数组?

评论:如果假设我有 nxnynz #defined 为 400,我按照以下步骤操作(已经已测试)

#define nx (400)
#define ny (400)
#define nz (400)

struct ShMem {
sem_t prod;
sem_t cons;
lr u_x[nx+1][ny+2][nz+2];
lr u_y[nx+2][ny+1][nz+2];
lr u_z[nx+2][ny+2][nz+2];
};
...
// shared memory allocation
ShmID = shmget(ShmKEY, sizeof(struct Shmem), IPC_CREAT|0666);
...

额外的要求是,对于应用程序,我确实需要这些数组作为 3D 数组,以便我可以将它们索引为 u_x[i][j][k],whre ijk 分别是 x、y 和 z 方向的索引。

在 Lundin 和 Felix 解决方案后进行编辑。

约束 - u_xu_yu_z 需要是由 u_x 访问的 3D 数组/*** 指针[i][j][k] - 由于这是旧代码,因此无法更改。需要设置数组以维护访问的神圣性。代码中的任何地方都可以这样访问。

最佳答案

正如评论中已经讨论的,C 不支持类似的东西。因此,您必须自己构建它。使用宏使结构内的“3D 访问”可读的简单示例如下所示:

#include <stdlib.h>

typedef int lr;

struct foo {
size_t ny;
size_t nz;
lr *u_y;
lr *u_z;
lr u_x[];
};

#define val(o, a, x, y, z) ((o).a[(o).ny * (o).nz * x + (o).nz * y + z])

struct foo *foo_create(size_t nx, size_t ny, size_t nz)
{
size_t arrsize = nx * ny * nz;
struct foo *obj = malloc(sizeof *obj + 3 * arrsize * sizeof *(obj->u_x));

if (!obj) return 0;
obj->ny = ny;
obj->nz = nz;
obj->u_y = obj->u_x + arrsize;
obj->u_z = obj->u_y + arrsize;
return obj;
}

int main(void)
{
struct foo *myFoo = foo_create(10, 10, 10);

// set u_y[9][5][2] in *myFoo to 42:
val(*myFoo, u_y, 9, 5, 2) = 42;

free(myFoo);
}

这在 C 支持的结构末尾使用单个 FAM,因此您可以在单个 block 中分配这样的结构。要将其放入共享内存中,只需替换 malloc() 并使用相同的大小计算即可。

关于c - 具有共享内存和信号量的多个灵活阵列成员或 VLA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49923125/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com