我正在尝试直接使用一些低级内存。我正在用一些数据填充缓冲区,然后将其复制到更大的缓冲区。
我写了这个函数来帮助一些浮点数据:
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
然后有两个较大的缓冲区,将这些缓冲区背对背。 漂浮buffera [24]; //拥有2个buffa float bufferb [24] //持有2个buffb
我有一个简单的for循环来做一些计算并填充buffa和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个字节而实际上没有移位,就像环形缓冲区一样。
答案 0 :(得分: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);
}