指向固定大小数组索引的指针

时间:2011-07-25 18:22:54

标签: c opencl

请考虑以下代码:

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);
}

3 个答案:

答案 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;
  ...
}

是的,它有效。如果它对你“不起作用”,你必须解释你的意思。 “不起作用”并不是一个有意义的解释。

相关问题