2016-01-11 2 views
2

Я пытаюсь работать с некоторыми материалами памяти низкого уровня. Я заполняю буфер некоторыми данными, а затем копирую его в более крупный буфер.Попытка разыменовать общий указатель.

Я написал эту функцию, чтобы помочь с некоторыми флоат данных:

void copy_float_buffer(void* dest, size_t dest_index, void* src, 
         size_t src_index, size_t num_to_copy) { 
    memcpy(&dest[dest_index], &src[src_index], num_to_copy * sizeof(float)); 
} 

Я в настоящее время есть два различных буферов и два каждого типа.

float buffa[12]; // i have two of these 
float buffb[12]; // and two of these as well 

Затем у вас есть два больших буфера, которые будут удерживать эти буферы назад. флоат-буффер [24]; // hold 2 buffa float bufferb [24] // имеет 2 buffb

У меня есть простой цикл цикла, который вычисляет и заполняет баффы и buffb, тогда я использую команду copy_float_buffers для заполнения буферов. Я делаю это так.

typedef struct { 
    float buffa[12]; 
    float buffb[12]; 
} buffs; 
buffs* b; 
for (int j = 0; j < 2; j++) { 
    b = calloc(1, sizeof(buffs)); 
} 

for (int i = 0; i < 12; i++) { 
    b->buffa[i] = vmathRandRange(21); 
    b->buffb[i] = vmathRandRange(21); 
} 
for (int i = 0; i < 12; i++) { 
    /* printf("index:%d value:%f \n", i, b->buffa[i]); */ 
    /* b->buffa[i] = vmathRandRange(21); */ 
    copy_float_buffer(v_buff, (sizeof(float) * i) * 12, b->buffa, 
         (sizeof(float) * i) * 12, 12); 
    copy_float_buffer(v_buff, (sizeof(float) * i) * 12, b->buffb, 
         (sizeof(float) * i) * 12, 12); 
} 
print_buffer(b->buffa, "original buffer"); 
print_buffer(v_buff, "vertex buffer"); 
print_buffer(b->buffb, "original buffer"); 
print_buffer2(v_buff, "vertex buffer"); 

Функция print_buffers выполняет только петли для 0-11 или 12-22 и выводит значения.

Я чувствую, что это проблема с указателем-математикой, и я использовал gdb, чтобы попытаться просмотреть код и посмотреть, как он копируется, но я получаю эту ошибку выше.

Attempt to dereference a generic pointer. 

Как я могу направить указатели при переходе через код в gdb, а также. Я думаю, что функция копирования копии памяти настроена правильно. Но это, по-видимому, только перезаписывает первые 12 поплавков или первые 48 байтов и фактически не сдвигается, что-то вроде кольцевого буфера.

+1

Возможный дубликат [GDB: Попытка разыменования обобщенный указатель] (http://stackoverflow.com/questions/ 20414699/gdb-try-to-dereference-generic-pointer) –

+5

'dest [dest_index]' неверно, поскольку 'void' не имеет размера. Почему это не 'float * ', или что-то еще? –

+1

Вы не можете разыменовать [общий указатель] (http://www.nongnu.org/c-prog-book/online/x658.html) –

ответ

3

Как уже упоминалось в комментариях, вы не можете сделать dest[dest_index] просто потому, что dest является void*

Ваша функция копирования кажется странным. В основном коде вы тратите много усилий на вычисление смещений байтов, но все же вы используете sizeof(float) внутри функции copy_float_buffer. Вы должны либо написать функцию, чтобы использовать поплавки повсюду, либо байты везде - это будет намного легче понять.

Поскольку функция называется copy_float_buffer это указывает на то, что вы хотите скопировать поплавки, поэтому она должна быть:

void copy_float_buffer(float* dest, size_t dest_index, float* src, 
         size_t src_index, size_t num_to_copy) { 
    memcpy(&dest[dest_index], &src[src_index], num_to_copy * sizeof(float)); 
} 

скопировать num_to_copy поплавки. Если вы это сделаете, вам нужно изменить способ вызова функции, то есть избавиться от всех вычислений смещения байта. Что-то вроде:

copy_float_buffer(v_buff, 0, b->buffa, 0, 12); // Ends in v_buff[0..11] 
          ^  ^^
           |   | Copy 12 floats 
           |   Start offset in buffa 
           Start offset in v_buff 

    copy_float_buffer(v_buff, 12, b->buffb, 0, 12); // Ends in v_buff[12..23] 
          ^   ^^
           |    | Copy 12 floats 
           |    Start offset in buffb 
           Start offset in v_buff 

Остальная часть кода есть некоторые проблемы, а также:

// You loop twice but simply overwrite `b` the second time 
// so you leak memory 
for (int j = 0; j < 2; j++) { 
    b = calloc(1, sizeof(buffs)); 
} 

// Why do you loop 12 times? 
// Do you want to copy the data in to the main buffer 12 times? 
for (int i = 0; i < 12; i++) { 
    // The two call of copy_float_buffer is identical except for buffa and buffb 
    // So buffb will overwrite buffa 
    // Probably not what you want or ...? 
    copy_float_buffer(v_buff, (sizeof(float) * i) * 12, b->buffa, 
         (sizeof(float) * i) * 12, 12); 
    copy_float_buffer(v_buff, (sizeof(float) * i) * 12, b->buffb, 
         (sizeof(float) * i) * 12, 12); 
} 
+0

две петли были опечатками, вторая петля. Также во втором цикле вы правы. Я переписываю данные, изначально я хотел скопировать данные по 12 шагов, по одному за раз. – user1610950

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