c - 在 C 中的结构中模拟两个灵活数组的结构

标签 c data-structures struct

目前,我有一个结构camera,它包含两个固定大小的变量fp

struct point {
    double x, y, z;
};

struct camera {
    struct point f[5], p[5];
};

使fp 灵活会导致错误。我按照本 SO question 中给出的说明进行操作并决定使用非结构变量并将它们传递给函数,这导致了长函数调用语法和困惑的结构。

我的问题虽然主观,但是:拥有两个可通过一个(类似于结构等)访问的灵活数组的最佳方法是什么?

最佳答案

采用非 灵活数组 方法后,IMO 通过一对更简洁的 struct point 指针解决了 OP 的“长函数调用语法和困惑结构”的更高级别问题.

struct camera {
    size_t size;  // add size member
    struct point *f;
    struct point *p;
};

bool camera_initialize(struct camera *cam, size_t size) {
  // Use 1 or 2 allocations
  cam->f = malloc(sizeof *(cam->f) * 2 * size);
  if (cam->f) {
    cam->p = cam->f + size;
    cam->size = size;
    return false; // success 
  } else {
    cam->p = cam->f = NULL;
    cam->size = 0;
    return size > 0; // fail if size was not 0
  }
}

void camera_uninitialize(struct camera *cam) {
  free(cam->f);
  cam->p = cam->f = NULL;
  cam->size = 0;
}

示例用法

int main() {
  size_t n  = foo();
  struct camera cam;
  if (camera_initialize(&cam, n)) return EXIT_FAILURE;
  bar(cam.f, cam.n);
  bar(cam.p, cam.n);
  camera_uninitialize(&cam);
}

关于c - 在 C 中的结构中模拟两个灵活数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42933471/

相关文章:

c++ - 封装多种类型的 Datastructure<T> 并公开它们的所有功能

c++ - 如何创建 DAWG?

c - 这个结构代码是如何工作的

c - 嵌套结构

c - pthread 互斥体在等待时未解锁

c - X11 X图像处理

Python:索引集的数据结构以查找超集?

c - 线程创建。我正在用最后一个线程覆盖所有线程

c - Swift 与 C 结构指针

c# - "where T : class"在编译时或运行时没有以任何方式强制执行吗?