1

我遇到了为 GA/GP 开发类的代码,但未能理解它,因此无法调试程序。

typedef struct {
    void *dataPointer;
    int length;
} binary_data;

typedef struct {
    organism *organisms; //This must be malloc'ed
    int organismsCount;
    int (*fitnessTest)(organism org);
    int orgDnaLength;
    unsigned int desiredFitness;
    void (*progress)(unsigned int fitness);
} evolutionary_algorithm;

以上是直截了当的。然后我们尝试在测试它们的适应性等之前启动有机体......

int main(int argc, char *argv[])
{
    srand(time(NULL));
    int i;
    evolutionary_algorithm ea;
    ea.progress = progressDisplayer;
    ea.organismsCount = 50;
    ea.orgDnaLength = sizeof(unsigned int);

    organism *orgs =(organism *) malloc(sizeof(organism) * ea.organismsCount);
    for (i = 0; i < 50; i++)
    {
        organism newOrg;
        binary_data newOrgDna;
        newOrgDna.dataPointer = malloc(sizeof(unsigned int));
        memset(newOrgDna.dataPointer, i, 1);
        newOrgDna.length = sizeof(unsigned int);
        newOrg.dna = newOrgDna;
        orgs[i] = newOrg;
    }

据我了解,memset() 尝试将二进制值写入该内存位置 void 指针(newOrgDna.dataPointer)等等。但是我不知道如何重新组装所有这些二进制值以获得分配给 newOrg 变量“dna”的整数值,以便我检查分配给单个生物体的整数值,并最终检查整个内存位置中的整个种群被分配到“组织”。

正如您从上面猜测的那样,我对这种深层细节的内存管理不是很熟悉,因此非常感谢您的帮助。

太感谢了

4

1 回答 1

1

这段代码看起来有点奇怪。这一行:

newOrgDna.dataPointer = malloc(sizeof(unsigned int));

可能会分配 4 个字节(或 8 在 64 位机器上)。奇怪的是,memset下面的行将只设置第一个字节。

要获得实际价值,您可以这样做:

char val = *((char*) newOrgDna.dataPointer);

但是,正如我所说,这段代码看起来有点不对劲。我会将其重写为:

for (i = 0; i < 50; i++)
{
    organism newOrg;
    binary_data newOrgDna;
    unsigned int * data =  (unsigned int*) malloc(sizeof(unsigned int));
    *data = i;
    newOrgDna.length = sizeof(*data);
    newOrgDna.data = (void*) data; // I think that cast can be dropped
    newOrg.dna = newOrgDna;
    orgs[i] = newOrg;
}

然后,无论您想从哪里获取数据,organism *都可以执行以下操作:

void f( organism * o )
{
    assert( sizeof(unsigned int) == o->dna.length );
    unsigned int data = *((unsigned int*) o->dna.data);
}

这也是一个 C 问题而不是 C++。

于 2012-01-08T02:39:21.353 回答