#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 *
как известно, asTYPE const *
— это тип указателя, который указывает на немодифицируемыйTYPE
объект. Сам указатель можно изменить, но значение, на которое он указывает, изменить нельзя.
TYPE * const
это тип указателя, который указывает на изменяемыйTYPE
объект, но в этом случае указатель не может быть изменен.
const TYPE * const
as known asTYPE 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*)
это достаточно безопасно? Возможно, это проблема с приведением. Ваша программа дробится или что-то еще? Если оно является сокрушительным, можете ли вы предоставить сообщение о сокрушении?