Я пытаюсь работать с некоторыми материалами памяти низкого уровня. Я заполняю буфер некоторыми данными, а затем копирую его в более крупный буфер.Попытка разыменовать общий указатель.
Я написал эту функцию, чтобы помочь с некоторыми флоат данных:
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 байтов и фактически не сдвигается, что-то вроде кольцевого буфера.
Возможный дубликат [GDB: Попытка разыменования обобщенный указатель] (http://stackoverflow.com/questions/ 20414699/gdb-try-to-dereference-generic-pointer) –
'dest [dest_index]' неверно, поскольку 'void' не имеет размера. Почему это не 'float * ', или что-то еще? –
Вы не можете разыменовать [общий указатель] (http://www.nongnu.org/c-prog-book/online/x658.html) –