Как передать аргумент указателя в функцию, не зная размера, который будет выделен для этого указателя - PullRequest
0 голосов
/ 21 ноября 2018

Я знаю, что этот вопрос очень нуб.Я пытаюсь понять, как работает указатель.Я изучал основы C, но все еще не понимал этого.

Учитывая эту часть функции:

+ (void)nv21ToRgbWithWidth:(unsigned int)width height:(unsigned int)height yuyv:(unsigned char *)yuyv rgb:(unsigned char *)rgb
{
    const int nv_start = width * height ;
    UInt32 i, j, index = 0, rgb_index = 0;
    UInt8 y, u, v;
    int r, g, b, nv_index = 0;

    for(i = 0; i <  height ; i++)
    {
        for(j = 0; j < width; j ++){
            //nv_index = (rgb_index / 2 - width / 2 * ((i + 1) / 2)) * 2;
            nv_index = i / 2  * width + j - j % 2;

            y = yuyv[rgb_index];
            u = yuyv[nv_start + nv_index ];
            v = yuyv[nv_start + nv_index + 1];


            r = y + (140 * (v-128))/100;  //r
            g = y - (34 * (u-128))/100 - (71 * (v-128))/100; //g
            b = y + (177 * (u-128))/100; //b

            if(r > 255)   r = 255;
            if(g > 255)   g = 255;
            if(b > 255)   b = 255;
            if(r < 0)     r = 0;
            if(g < 0)     g = 0;
            if(b < 0)     b = 0;

            index = rgb_index % width + (height - i - 1) * width;
            rgb[index * 3+0] = b;
            rgb[index * 3+1] = g;
            rgb[index * 3+2] = r;
            rgb_index++;
        }
    }
}

Как я должен знать, как должно быть unsigned char * для rgbинициализирован перед передачей в функцию?

Я пытался вызвать функцию следующим образом:

unsigned char *rgb = NULL;

[MyClass nv21ToRgbWithWidth:imageWidth height:imageHeight yuyv:yuyvValues rgb:rgb];

Но программа вылетает в этой строке:

rgb[index * 3+0] = b;

Iсм. rgb был инициализирован с NULL, поэтому вы не можете назначать значения.Итак, я подумал об инициализации массива и передаче его указателю rgb следующим образом:

unsigned char rgbArr[10000];
unsigned char *rgb = rgbArr;

, но функция по-прежнему падает.Я действительно не знаю, как мне передать параметр rgb в этой функции.Пожалуйста, помогите мне понять это.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Для этого предназначены функции malloc (), calloc (), realloc () и free ().Не забудьте использовать функцию free () для предотвращения утечек памяти ... Надеюсь, это поможет.

0 голосов
/ 21 ноября 2018

Ожидаемый размер в байтах, по крайней мере, height*width*3;может случиться так, что выделение такого массива в качестве локальной переменной (как вы делаете с unsigned char rgbArr[10000]) превышает ограничение стека;Программа, вероятно, вылетает в таком случае.Я бы попробовал использовать кучу вместо:

unsigned char* rgb = malloc(imageHeight*imageWidth*3);
[MyClass nv21ToRgbWithWidth:imageWidth height:imageHeight yuyv:yuyvValues rgb:rgb];
...
free(rgb);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...