Указатель на индексирование массива фиксированного размера - PullRequest
0 голосов
/ 25 июля 2011

Рассмотрим следующий код:

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 ]

1 голос
/ 25 июля 2011

Возможно, вы хотели написать:

typedef float** image_buffer;

В любом случае правильный синтаксис будет:

(*b)[i][j] = 0;
0 голосов
/ 25 июля 2011

Ну, вы делаете неверное утверждение, что что-то "не работает", в то время как на самом деле это работает совершенно нормально. Вот почему люди могут жаловаться, что в вашем «вопросе» нет актуального вопроса.

Правильный способ доступа к массиву внутри функции:

void f(image_buffer *b)
{
  ...
  (*b)[i][j] = 0;
  ...
}

И да, это работает. Если это «не работает» для вас, вы должны объяснить, что именно вы имеете в виду. «Не работает» не является осмысленным объяснением.

0 голосов
/ 25 июля 2011

Рассмотрим:

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, поэтому ошибка компоновщика, но он компилируется нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...