Назначение параметра функции вне функции не действует

Почему параметр последней строки может не иметь никакого эффекта вне функции:

void save_last_frame( uint8_t *saveframe, uint8_t *curframe,
                             int width, int height, int savestride, int curstride )
{
    height /= 2;
    height--;
    while( height-- ) {
        blit_packed422_scanline( saveframe, curframe, width );
        saveframe += savestride;
        interpolate_packed422_scanline( saveframe, curframe, curframe + (curstride*2), width );
        saveframe += savestride;
        curframe += (curstride*2);
    }
    blit_packed422_scanline( saveframe, curframe, width );
    saveframe += savestride;
    blit_packed422_scanline( saveframe, curframe, width );
    saveframe += savestride;   // 
 BLUEPIXY16 июн. 2013 г., 14:38
Указатель также является вызовом по значению. Он вызывается для создания копии в стеке. Это не влияет на оригинал, если вы измените копию
 wildplasser16 июн. 2013 г., 14:41
0) настоятельно советуем использоватьнеподписанный типы для индексов. 1)height /=2; height--; может опуститься, если начальный аргумент высоты равен единице. (примечание: это делаетне ответьте на вопрос, но можете избежать большого побочного ущерба в будущем)

Ответы на вопрос(2)

Решение Вопроса

В Си параметры - это по сути локальные переменные, которые инициализируются значениями, передаваемыми в качестве аргументов. Это означает, что они существуют только до тех пор, пока функция выполняется. Вашsaveframe Переменная перестает существовать, когда функция существует и вместе с ней назначается значение.

Чтобы изменить значения, существующие вне функции, вы должны использовать указатель и изменить значениеуказал на по этому указателю.

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

void save_last_frame( uint8_t **saveframe, uint8_t **curframe,
                             int width, int height, int savestride, int curstride )

Затем вы должны соответствующим образом изменить код, заменивsaveframe с*saveframe, Аналогично дляcurframe если вы также хотите, чтобы он обновлялся функцией.

Пример такойвыходной указатель аргументendptr используется для записи конца проанализированной числовой строки в.strtol()

Вы передали переменнуюsaveframe в качестве указателя; чтобы изменить значение вне функции, сделайте это:

*saveframe += savestride; 

вместо. Таким образом, ваше значение будет сохранено даже после выхода из функции.

 Jonathan Leffler24 авг. 2013 г., 09:22
Хотя это может изменить что-то вне функции, не ясно, что изменится, так какsaveframe был увеличен в несколько раз, поэтому он нене указывает на то, на что он начал указывать. Интересно, что тамs удаленный ответ (который вы, вероятно, можетене вижу, потому что ты нерепутации пока нет), которая делает то же самое, что выделает здесь. Я могу'Однако, я не вижу комментариев, которые привели к его удалению.

Ваш ответ на вопрос