gpt4 book ai didi

c - C 中结构体的三维数组

转载 作者:行者123 更新时间:2023-11-30 15:16:25 25 4
gpt4 key购买 nike

您好,我正在努力寻找解决方案,我定义了以下 3D 结构数组。

typedef struct{
float x;
float y;
float z;
} Point;

Point ***Qw;

Qw = malloc(num_bezier * sizeof(Point **));
for(i=0; i<num_bezier; i++){
Qw[i] = malloc((m+1) * sizeof(Point *));

for(j=0; j<=m;j++)
Qw[i][j] = malloc((p+1) * sizeof(Point));
}

我可以循环遍历数组来打印其内容,但在修改某些元素后,在程序的某个时刻,我无法再访问数组中的某些结构,并且出现段错误。感谢任何帮助,谢谢。

PD:我刚刚注意到我错误地定义了我的结构......

typedef struct{
double x;
double y;
float z;
} Point;

一旦我将 double 类型替换为 float 类型,它就修复了段错误...仍在尝试找出为什么会出现段错误

最佳答案

考虑分配单个缓冲区(使用 pow( num_bezier, 3) 元素),而不是单独分配行、列和单元格。这样您可以避免过度分配,但也可以避免内存碎片。

struct Point { float x, y, z; }

size_t bufferLength;
size_t bufferSquareLength;
struct Point* buffer; // pointer to a dynamically-allocated cubic buffer of Point values, stored in row x, column y, and depth z order.

void allocateBuffer(size_t squareLength) {
bufferSquareLength = squareLength;
bufferLength = squareLength * squareLength * squareLength;
buffer = calloc( bufferLength, sizeof(struct Point) );
}

struct Point* getElement(size_t x, size_t y, size_t z) {

Point* p = buffer + ( x * bufferSquareLength * bufferSquareLength ) + ( y * bufferSquareLength ) + z;
return p;
}

更简单、更容易遵循。

迭代每个值:

void forEachPoint( void(*callback(size_t x, size_t y, size_t z, struct Point* value) ) {
for(size_t x = 0; x < bufferSquareLength; x++) {
for(size_t y = 0; y < bufferSquareLength; y++) {
for(size_t z = 0; z < bufferSquareLength; z++) {
callback( x, y, z, getElement( x, y, z ) );
}
}
}
}

只需使用自定义 callbakc 函数调用 forEachPoint 即可迭代每个 struct Point 值。

关于c - C 中结构体的三维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33104341/

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