2015-11-11 2 views
0

У меня есть char buffer[1024] и на структурутетсра в структуры из массива символов

typedef struct { 
    int record; 
    int key; 
} leaf_entry; 

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

Если я хочу итерацию вниз буфера для сравнения записи в буфере на другую запись

for (i = 0; i < max_ents * entry_size; i += entry_size) 
{ 
    leaf_entry curr; 
    memcpy (curr, buffer[i], entry_size) 
    if (curr == entry_to_compare) 
     etc... 
} 

Правильно ли это? Есть ли более простой/эффективный способ достичь этого?

+1

почему вы используете обугленного буфер [] вместо буфера структура leaf_entry []? –

+0

Почему не массив 'leaf_entry'? И почему 'typedef' является структурой? – user4581301

+0

char buffer [] из-за спецификации в моем проекте. Мы «загружаем» страницу с диска в основную память на 1024 байта. Затем на этой странице мы хотим заполнить ее записями, которые состоят из 2 целых чисел. –

ответ

0

Вы должны быть в состоянии сделать это без копирования, учитывая, что ваша структура POD.

Я считаю, что то, как это должно работать, где смещение является правильным смещением байта в полукоксе буфер:

leaf_entry & x = static_cast<leaf_entry &>(buffer + offset); 
+0

и как он генерирует это «смещение»? – Nandu

+0

Возможность сбоя из-за выравнивания данных. На ПК или встраиваемой системе с современным процессором вы, вероятно, просто получите штраф за производительность. – user4581301

+0

@ Nandu offset = n * sizeof (leaf_struct) –

0

я бы рассмотреть возможность использования подхода, что стандартные реализации сортировок используют, а именно - использовать определенный пользователь сравнение функция, которая получает 2 указателя. Затем вы используете эти указатели для поиска элемента и оттуда, доступа и сравнения интересующих вас членов. Это также позволяет избежать ненужного копирования памяти.

Рассмотрим следующий FUNC используется для сравнения Интс:

int compareIntAsc(const void *int1, const void *int2) 
{ 
    int *num1 = (int*)int1; 
    int *num2 = (int*)int2; 
    return *num1 - *num2; 
} 

и теперь рассмотрим один, который будет сравнить счета члена некоторых структур

int compareNodeCountAsc(const void *node1, const void *node1) 
{ 
    return (pHuffmanNode)(node1))->charCount - ((pHuffmanNode)(node2))->charCount; 
} 

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

например, сравнить элемент 0 для любого другого элемента

код

typedef struct { 
    int record; 
    int key; 
} leaf_entry, *pLeafEntry; 

int compLeafKeyAsc(void *leaf1, void *leaf2) 
{ 
    leaf_entry *p1, *p2; 
    p1 = (leaf_entry *)leaf1; 
    p2 = (leaf_entry *)leaf2; 
    return p1->key - p2->key; 
} 

void printLeaf(pLeafEntry leaf) 
{ 
    printf("----- leaf -------\n"); 
    printf("record: %d\n", leaf->record); 
    printf("key: %d\n", leaf->key); 
} 

void demo() 
{ 


    const int nElems = 16; 
    leaf_entry leafArray[nElems]; 
    pLeafEntry firstElement; 

    int i; 
    for (i=0;i<nElems;i++) 
    { 
     leafArray[i].record = (rand()%51) + 100;  // record is [100..150] 
     leafArray[i].key = (rand()%128);    // key is [0..127] 
     printLeaf(&leafArray[i]); 
    } 

    //e.g compare element 0 to every other element 
    firstElement = &leafArray[0]; 
    for (i=1; i<nElems; i++) 
    { 
     printf("%d", firstElement->key); 
     int result = compLeafKeyAsc(firstElement, &leafArray[i]); 
     if (result < 0) 
      printf(" is less than "); 
     else if (result > 0) 
      printf(" is greater than "); 
     else 
      printf(" is equal to "); 
     printf("%d\n", leafArray[i].key); 
    } 
} 

выход

----- leaf ------- 
record: 141 
key: 35 
----- leaf ------- 
record: 110 
key: 4 
----- leaf ------- 
record: 144 
key: 108 
----- leaf ------- 
record: 103 
key: 46 
----- leaf ------- 
record: 134 
key: 16 
----- leaf ------- 
record: 144 
key: 113 
----- leaf ------- 
record: 125 
key: 59 
----- leaf ------- 
record: 116 
key: 107 
----- leaf ------- 
record: 137 
key: 38 
----- leaf ------- 
record: 133 
key: 60 
----- leaf ------- 
record: 106 
key: 12 
----- leaf ------- 
record: 126 
key: 25 
----- leaf ------- 
record: 137 
key: 94 
----- leaf ------- 
record: 130 
key: 28 
----- leaf ------- 
record: 132 
key: 55 
----- leaf ------- 
record: 141 
key: 94 
35 is greater than 4 
35 is less than 108 
35 is less than 46 
35 is greater than 16 
35 is less than 113 
35 is less than 59 
35 is less than 107 
35 is less than 38 
35 is less than 60 
35 is greater than 12 
35 is greater than 25 
35 is less than 94 
35 is greater than 28 
35 is less than 55 
35 is less than 94 
+0

Не используйте C-style casts. Используйте 'static_cast'. Если это не скомпилируется, подумайте еще раз о том, что вы делаете. –

+0

Хороший улов, в последнее время много писал сборку. – enhzflep

Смежные вопросы