C11环境下如何通过函数将二维数组指定行元素赋值给一维数组
问题原因
你遇到的报错是因为C语法不允许数组下标留空,&box_pointer->positions_particles[][index_reference_particle]这种写法不符合C11标准的语法要求,没有办法直接通过空下标批量获取某一列的指针数组。
解决方案
下面给出两种不同实现思路的合规方案,你可以根据你的项目中positions_particles的实际存储结构选择:
方案1:保留原有函数实现,调用侧构造指针数组
如果不想改动现有函数的代码,可以在调用前手动构造函数要求的double*类型指针数组,示例代码如下:
// 构造每个维度对应目标粒子的指针数组 double *dim_pointers[NUMBER_SPATIAL_DIMENSIONS]; for(int dim = 0; dim < NUMBER_SPATIAL_DIMENSIONS; dim++) { dim_pointers[dim] = &box_pointer->positions_particles[dim][index_reference_particle]; } // 调用原有函数 storage_position_particle(position_reference_particle, dim_pointers);
这种方案适配你原有函数的定义,不需要修改函数逻辑,适合改动成本高的场景。
方案2:修改函数签名,实现更简洁的调用(推荐)
直接调整函数参数,把二维数组、目标粒子索引作为入参,函数内部完成取值逻辑,不需要调用侧额外处理,实现更优雅:
适配按维度优先存储的场景(即positions_particles第一维是空间维度,第二维是粒子编号)
// 修改后的函数实现 void storage_position_particle(double position_particle_stored[NUMBER_SPATIAL_DIMENSIONS], double positions_particles[NUMBER_SPATIAL_DIMENSIONS][NUMBER_PARTICLES], int target_particle_idx) { for (int index_spatial_dimension = 0; index_spatial_dimension < NUMBER_SPATIAL_DIMENSIONS; index_spatial_dimension++) { position_particle_stored[index_spatial_dimension] = positions_particles[index_spatial_dimension][target_particle_idx]; } }
调用时只需一行代码:
storage_position_particle(position_reference_particle, box_pointer->positions_particles, index_reference_particle);
如果你的positions_particles是动态分配的二级指针,只需把函数第二个参数改为double **positions_particles即可,调用方式完全不变。
适配按粒子优先存储的场景(即positions_particles第一维是粒子编号,第二维是空间维度)
这种结构下可以直接用memcpy实现更高效率的拷贝,不需要循环遍历:
#include <string.h> void storage_position_particle(double position_particle_stored[NUMBER_SPATIAL_DIMENSIONS], double (*positions_particles)[NUMBER_SPATIAL_DIMENSIONS], int target_particle_idx) { // 直接拷贝对应粒子的整行坐标数据 memcpy(position_particle_stored, positions_particles[target_particle_idx], sizeof(double) * NUMBER_SPATIAL_DIMENSIONS); }
调用方式和上面完全一致。
内容的提问来源于stack exchange,提问作者Felipe Evaristo
相关产品推荐
相关产品推荐

