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バイト(または64ビットマシンでは8バイト)を割り当てます。奇妙な部分は、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 に答える