环形缓冲区延迟线指针更新时的类型转换错误求助
环形缓冲区延迟线指针更新时的类型转换错误求助
嘿,我来帮你把这个问题捋明白~
首先得搞清楚你碰到的错误到底是咋回事:你写的p = (p + N_MUX_E - &buffer[0]);这行代码,本质上是在做指针减指针的操作——p + N_MUX_E会得到一个新指针,再减去&buffer[0](也是指针),结果是两个指针之间相差的元素个数,是个ptrdiff_t类型的整数,可不是指针类型。你直接把这个整数赋值给指针变量p,C编译器肯定会报错,因为指针和整数是完全不同的类型,它不会默认帮你做这个转换(哪怕你强制转,也不推荐,容易出内存问题)。
再看你原来的代码逻辑,其实有点绕:先判断指针越界,然后先减N_MUX_E再加回来,这完全是多此一举,咱们换个更清晰的方式处理环形回绕就好。
正确的思路应该是这样的:
- 先算当前指针相对于缓冲区起始位置的元素偏移量(注意是元素个数,不是字节数,C的指针算术本来就是按元素大小算的)
- 把这个偏移量加上你要移动的
N_MUX_E,再对缓冲区总长度BUF_LEN取模——这一步就是实现环形回绕的核心 - 最后用缓冲区的起始指针
buffer加上取模后的偏移量,就能得到正确的回绕后指针
给你写个修正后的完整代码示例,你可以直接参考:
#include <stddef.h> // 要用到ptrdiff_t类型,得包含这个头文件 _Complex float buffer[BUF_LEN]; static _Complex float *p_in = buffer; static _Complex float *p; p = p_in; // 过段时间后更新指针... ptrdiff_t current_offset = p - buffer; // 计算当前指针相对于起始的元素偏移 current_offset += N_MUX_E; // 加上要移动的步数 current_offset %= BUF_LEN; // 取模实现环形回绕 p = buffer + current_offset; // 起始指针加偏移量得到新的合法指针
嫌步骤多的话,还可以合并成一行更简洁的写法:
p = buffer + ((p - buffer + N_MUX_E) % BUF_LEN);
这么写不仅不会有类型错误,逻辑也比你原来的代码清晰太多——甚至不用判断是否越界,取模操作会自动帮你处理所有回绕情况,哪怕你移动的步数远超过缓冲区长度也没问题。
另外提一句,你原来代码里的if (p >= &buffer[BUF_LEN])判断是对的,不过用buffer + BUF_LEN写起来更直观,和&buffer[BUF_LEN]是完全等价的。
内容来源于stack exchange
相关产品推荐
相关产品推荐

