Передать без знака char * по ссылке - PullRequest
0 голосов
/ 18 марта 2011

HI!Я создаю функцию, чтобы получить версию изображения в градациях серого, но у меня возникают проблемы при попытке передать по ссылке назначение бита (ов), сгенерированного этой функцией:

void grayscale (const unsigned char *source, unsigned char **dest, int data_size) {

    for (int i=0; i < data_size; i= i+4) {
        int gray = (source[i] + source[i+1] + source[i+2]) / 3;
        gray = 255 - (int)cos(source[i])*255;
        *dest[i] = (char)gray;
        *dest[i + 1] = (char)gray;
        *dest[i + 2] = (char)gray; //HERE AN ERROR 
        *dest[i + 3] = (char)255;
    }
}

Я вызываю эту функцию с помощью:

grayscale(source, &destination, width*height*4 );

Что-то не так с указателями?(Я работаю над целью C и получаю EXC_BAD_ACCESS).

Спасибо

Ответы [ 2 ]

5 голосов
/ 18 марта 2011

Непонятно, почему вы используете дополнительный уровень косвенности для dest, поскольку *dest не изменяется, но, скорее всего, вам нужно сделать следующее - изменить:

    *dest[i] = (char)source[i];
    *dest[i + 1] = (char)gray;
    *dest[i + 2] = (char)gray;
    *dest[i + 3] = (char)255;

до:

    (*dest)[i] = (char)source[i];
    (*dest)[i + 1] = (char)gray;
    (*dest)[i + 2] = (char)gray; 
    (*dest)[i + 3] = (char)255;

Причиной этого является приоритет / ассоциативность операторов.

Также трудно понять, не видя вызывающего кода, но я предполагаю, что вам может потребоваться изменить:

    (*dest)[i] = (char)source[i];

до:

    (*dest)[i] = (char)source[i / 4];

если вы пытаетесь сделать что-то вроде преобразования изображения в одной плоскости в RGBA.

3 голосов
/ 18 марта 2011

Ваш звонок в порядке, у вас незаконный доступ к памяти.Отладьте ваши индексы и проверьте размер передаваемого массива, а также убедитесь, что он все еще находится в области видимости.Скорее всего, i + 2 выходит за пределы.

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