请考虑以下代码:
typedef float image_buffer[1024][1024];
void f(image_buffer *b)
{
for (int i = 0; i < 1024; i++)
{
for (int j = 0; j < 1024; j++)
{
b[i][j] = 0; // doesn't work
(*b)[i][j] = 0; // also doesn't work
}
}
}
人们抱怨没有问题,但问题很明显,你如何索引具有指向它的指针的固定大小数组......? 谢谢!
编辑:OpenCL代码:
typedef float image_buffer[1024][1024];
__kernel void kernel1(sampler_t smp, read_only image2d_t a, read_only image2d_t b, __global image_buffer *r)
{
__local float shared[16][16];
float4 colorA = read_imagef(a, smp, (int2)(get_global_id(0), get_global_id(1))),
colorB = read_imagef(b, smp, (int2)(get_global_id(0), get_global_id(1)));
(*r)[get_global_id(0)][get_global_id(1)] = (colorA.x - colorB.x) * (colorA.x - colorB.x) + (colorA.y - colorB.y) * (colorA.y - colorB.y) + (colorA.z - colorB.z) * (colorA.z - colorB.z) + (colorA.w - colorB.w) * (colorA.w - colorB.w);
}
答案 0 :(得分:1)
也许你打算写:
typedef float** image_buffer;
无论如何,正确的语法是:
(*b)[i][j] = 0;
答案 1 :(得分:0)
考虑:
typedef float image_buffer[1024][1024];
void f(image_buffer *b)
{
for (int i = 0; i < 1024; i++)
{
for (int j = 0; j < 1024; j++)
{
(*b)[i][j] = 0; // this works on gcc -std=c99 $FILE
}
}
}
没有main
,所以链接器错误,但编译得很好。
答案 2 :(得分:0)
嗯,你正在做一个无效的断言“某些东西”“不起作用”,而实际上它完全正常。这就是为什么人们会抱怨你的“问题”中没有实际问题的原因。
在函数内访问数组的正确方法是
void f(image_buffer *b)
{
...
(*b)[i][j] = 0;
...
}
是的,它有效。如果它对你“不起作用”,你必须解释你的意思。 “不起作用”并不是一个有意义的解释。