Назначение и получение побитового значения памяти для Генетического Алго - PullRequest
1 голос
/ 08 января 2012

Я наткнулся на этот код для разработки класса для 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 () пытается записать двоичное значение в указатель на пустую область памяти (newOrgDna.dataPointer)и так далее.Но я не могу понять, как собрать все эти двоичные значения, чтобы получить целочисленное значение, присвоенное переменной «dna» newOrg, чтобы я проверил целочисленное значение, присвоенное отдельному организму и в конечном итоге всей популяции, находящейся во всей области памяти, которая имеетбыл назначен на "orgs".

Как вы уже догадались, я не очень знаком с управлением памятью на этом глубоком уровне деталей, поэтому ваша помощь очень ценится.

Большое вам спасибо

1 Ответ

1 голос
/ 08 января 2012

Этот код выглядит немного странно. Эта строка:

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 ++.

...