Выражение должно быть изменяемым значением lvalue (передача указателя в функцию)

#c #function #pointers

#c #функция #указатели

Вопрос:

Я создал простую функцию для замены двух пикселей C /SFML , используя два пиксельных индекса и указатель на массив пикселей.

Я получаю сообщение об ошибке "Expression must be a modifiable lvalue" .

 typedef unsigned int uint;
void swapPixels(uint idx1, uint idx2, const sf::Color *pxColorBuffer){
    sf::Color temp = pxColorBuffer[idx1];
    pxColorBuffer[idx1] = pxColorBuffer[idx2];
    pxColorBuffer[idx2] = temp;
}
 

Мне интересно, почему это не работает, поскольку я передаю указатель, который должен указывать на изменяемое значение.

Комментарии:

1. const означает, что оно не поддается изменению.

2. Как я уже сказал, не является ли значение, на которое указывает указатель const, изменяемым? А если нет, то какова альтернатива?

3. Это не указатель const, это указатель на const . Так что нет, значение, на которое указывает указатель, не поддается изменению, его const . Альтернативой было бы удалить const.

4. Зачем пытаться переопределить колесо (иначе std::swap ) ? Это не решит вашу проблему с попыткой изменить const данные, но в следующий раз, когда вам нужно будет что-то поменять местами, вы будете знать, к чему обратиться.

Ответ №1:

Если вы читали об указателях, вы должны заметить, что

const TYPE * как известно, as TYPE const * — это тип указателя, который указывает на немодифицируемый TYPE объект. Сам указатель можно изменить, но значение, на которое он указывает, изменить нельзя.

TYPE * const это тип указателя, который указывает на изменяемый TYPE объект, но в этом случае указатель не может быть изменен.

const TYPE * const as known as TYPE const * const — это тип указателя, который указывает на неизменяемый TYPE объект и не может быть изменен.

Комментарии:

1. просто удалите const квалификатор в объявлении вашей функции, прежде чем sf::Color *

2. Похоже, это не помогает, я думаю, это из-за SFML, который позволяет мне получать только неизменяемый экземпляр пикселей, потому что image.getPixelsPrt() возвращает const uint8_t*

3. Не могли бы вы предоставить дополнительную информацию о своем коде, пожалуйста? Может pxColorBuffer быть const , это было до того, как вы перешли к функции? Если это так, вы не можете выполнить операцию.

4. Хорошо, сначала я создал два указателя: uint8_t *pxByteBuffer; sf::Color *pxColorBuffer; Затем я присвоил значения, и здесь image.getPixelsPtr(), похоже, возвращает const uint8_t*: pxByteBuffer = image.getPixelsPtr(); pxColorBuffer = reinterpret_cast<sf::Color*>(pxByteBuffer);

5. Вы уверены, что reinterpret_cast<sf::Color*>(instance_of_uint8_t*) это достаточно безопасно? Возможно, это проблема с приведением. Ваша программа дробится или что-то еще? Если оно является сокрушительным, можете ли вы предоставить сообщение о сокрушении?