2012-01-07 8 views
1

GA/GPのクラスを開発するためにこのコードを使用しましたが、理解できず、したがってプログラムをデバッグできませんでした。上記遺伝的Algoのビット単位のメモリ値の割り当てと取得

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; 

まっすぐです。その後、我々は彼らのfitnnessなどをテストする前に生物を開始しようと...私の知る限り理解し

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"に代入するためにこれらのバイナリ値を再アセンブルする方法を理解していないので、個々の生物に割り当てられた整数値をチェックし、 「orgs」に割り当てられています。

あなたが上から推測しているように、この深いレベルの詳細なメモリ管理はあまりよくありませんので、あなたの助けを非常に感謝します。

は、このコードは少し奇妙に見えるそんなに

+2

9件、0件が受け入れられました。人々があなたの質問に答え続けるようにするには、いくつかの回答を受け入れてください。 –

+0

プログラミングのスキルは限られていますが、最善を尽くすため、いくつかの質問にお答えします。おそらくフィルタ中間レベルの質問を見つける方法はありますか? –

+0

Cicadaは、お客様の質問に対する回答が良好であることを(本ウェブサイトの受諾方法を介して)お客様に確認するよう依頼しました。 – mitch

答えて

1

ありがとうございます。この行:

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

おそらく4バイト(または64ビットマシンでは8)を割り当てます。奇妙な部分は、ちょうど下の行のmemsetが最初のバイトだけを設定するということです。私が言ったように、このコードはビットをオフに見える、

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

しかし:

は、あなたが行う可能性があります実際の値を取得します。あなたが行うことができます organism *からデータを取得したいどこでもその後

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; 
} 

:私はそれを書き換えます

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

また、これはむしろCの問題ではないのC++です。

+0

ありがとう、これは非常に便利です。ありがとうございました –

+0

私はあなたの提案を実験し、newOrgDna.dataPointer = malloc(sizeof(int)); memset((void *)newOrgDna.dataPointer、i、sizeof(int))に変更しました。これは同じ結果を与えているようですが、次のようにしてdataPointerが保持するunterlying整数を取り出すことはできません:int c = *(int *)((newOrgDna.dataPointer));私はここで間違って何をしていますか?もう一度あなたの助けに感謝します。 –

+0

'memset'の仕様を読んでください(' int'はほんの数バイトであり、memsetはそれらのバイトのそれぞれ**が 'i'の値になるように設定します)。あなたがそれを必要としないので、ここでの使用をやめてください。 – elmo

関連する問題