- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 C 中,下面的工作是否有效?
struct fdBase *left, *right;
int result = (int)(left - right);
result
可以是负数。如果那行不通,我该如何编写?
我的目标是为我的红黑树排序函数提供一些东西,一个所谓的指针“比较器”。 我不是在做数组工作,我需要指针之间的实际差异,以字节为单位。
最佳答案
根据定义,C 中两个指针相减的结果具有带符号的结果。结果具有 ptrdiff_t
类型,这是一个带符号的整数类型。
这里的重要细节是您不能只减去任意两个指针。为了定义结果,指针必须指向同一数组的元素(或指向虚构的“结束后的一个”元素)。
减法的结果以元素而不是字节表示,即它与 C 中的其余指针算法一致。A - B
的结果可以而且将是负数,如果 A
指向一个索引大于 B
的元素。
如果您需要指针指向的原始地址之间的字节差异,或多或少正式有效的方法如下
intptr_t difference = (intptr_t) left - (intptr_t) right;
这样你就不会减去指针(因为它不是为任意指针定义的),而是减去它们的整数表示。 (intptr_t) some_pointer
转换的结果是实现定义的,但通常它是存储在指针中的物理内存地址。不幸的是,这种方法有其自身的一些问题:对于具有 1
高位的指针,它可能会产生不正确的结果。此类指针在转换为 intptr_t
时通常会产生负值。
关于c - 减去 2 个带符号结果的指针,适合输入到红黑树 "comparator",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12754733/
我正在实现红黑 SOR 的并行版本。 我想获得每个进程的最大误差的 MPI_Allreduce 部分不起作用。它永远不会改变,即使只有一个过程,它也会给出高于 2.0 的值。怎么回事?? 这是代码,有
我为拉普拉斯方程(一个简单的加热板问题)在我的红黑 Gauss-Seidel 求解器中添加了 OpenACC 指令,但是 GPU 加速的代码并不比 CPU 快,即使对于大问题也是如此。 我还编写了一个
我是一名优秀的程序员,十分优秀!