我正在实现PSO算法。我用这个数据结构:
typedef struct {
float x;
float y;
} C_struct_Class2D;
typedef struct {
C_struct_Class2D *pos;
C_struct_Class2D *best_pos;
C_struct_Class2D *vel;
} C_struct_Particle;
typedef struct { <br>
C_struct_Particle **particles;
C_struct_Particle *g;
} C_struct_Swarm;
我必须使用C,而不是C++。这就是为什么我使用structs来代替类。
结构描述:
有一个群(C_struct_Swarm),它由几个粒子(**个粒子)和一个最优粒子(*g)组成。每个粒子都有一个"位置"、"最佳位置"one_answers"速度"类型"C_struct_Class2D"。
在一些方法中,我为每个数据分配内存空间并对其进行初始化整个数据结构在存储器中是连续的。所以所有结构都是在地址空间中彼此靠后。
内存应该看起来像:
C_struct_Swarm粒子[0]粒子[0]->位置粒子[0]->最佳粒子粒子[0]->级别粒子[1]粒子[1]->pos粒子[1]->best_pos粒子[1]->vel。。。。。。。。。。。。粒子[n]粒子[n]->pos粒子[n]->最佳粒子粒子[n]->velg->位置g->最佳操作g->级别
我怎样才能做到这一点?
问候sw
按值组合成员
按C_struct_Particle:内的值包含C_struct_Class2D
typedef struct {
C_struct_Class2D pos;
C_struct_Class2D best_pos;
C_struct_Class2D vel;
} C_struct_Particle;
这保证了这些成员的顺序(pos在best_pos之前)。
分配一个项目数组,而不是指向项目的指针数组
typedef struct {
C_struct_Particle *particles;
int num_particles;
C_struct_Particle g;
} C_struct_Swarm;
我应该注意的是,在这里,粒子指向的数据与其他成员不连续,所以你所要求的是不完全可能的,除非你做其他事情,比如设置g始终是第一个粒子,即包含在粒子"数组"中。
注意填充
如果你不关心填充(在你的代码示例中,看起来你不关心),那么跳过这个。否则,它是特定于平台/编译器的。例如,在GCC中,您可以使用packed属性:
struct __attribute__ ((__packed__)) my_packed_struct
{
char c;
int i;
};
您不能以您所描述的方式。如果您想要连续的内存块,唯一的解决方案(据我所知)是使用缓冲区(请参阅我的类似回答,这可能会让您了解如何实现它)。
如果您使用gcc,对于静态对象,您可以尝试__attribute__
。。。此处提供更多信息http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Variable-Attributes.html
iw源代码示例