Почему не работает код
От: Ronaldo  
Дата: 17.07.06 11:36
Оценка:
Почему не работает следующий код
ptr — указатель типа void.
вот так не работает
((LPBYTE)ptr) += 25;
error C2106: '+=' : left operand must be l-value

А вот так работает
ptr = ((LPBYTE)ptr) + 25;
Re: Почему не работает код
От: night beast СССР  
Дата: 17.07.06 11:39
Оценка:
Здравствуйте, Ronaldo, Вы писали:

R>Почему не работает следующий код

R>ptr — указатель типа void.
R>вот так не работает
R>((LPBYTE)ptr) += 25;
R>error C2106: '+=' : left operand must be l-value

дык написано же...

R>А вот так работает

R>ptr = ((LPBYTE)ptr) + 25;

а вот так: ((LPBYTE &)ptr) += 25;?
Re: Почему не работает код
От: Testus  
Дата: 17.07.06 11:56
Оценка:
Слева нельзя приводить типы.
Glück auf
Re[2]: Почему не работает код
От: Аноним  
Дата: 17.07.06 12:06
Оценка:
Здравствуйте, Testus, Вы писали:

T>Слева нельзя приводить типы.

Очень похоже. Если тип данных указать не void* а сразу LPBYTE, то всё работает.
Дело в том что код принесён в VS из Билдера, где отлично работал
Re[2]: Почему не работает код
От: Кодт Россия  
Дата: 17.07.06 12:22
Оценка: +2
Здравствуйте, Testus, Вы писали:

T>Слева нельзя приводить типы.


Ограниченно можно. В данном случае мы имеем реинтерпретацию переменной "указатель на void" как "указатель на BYTE" — на большинстве платформ форматы указателей совпадают, так что проблем нет.
reinterpret_cast<BYTE*&>(ptr) += 25;


А вообще, если заранее известно, что с ptr работают как с указателем на массив байтов — то зачем создавать себе сложности, сперва объявляя его как LPVOID, а потом приводя к LPBYTE.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[3]: Почему не работает код
От: Testus  
Дата: 17.07.06 12:31
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ограниченно можно. В данном случае мы имеем реинтерпретацию переменной "указатель на void" как "указатель на BYTE" — на большинстве платформ форматы указателей совпадают, так что проблем нет.

К>
К>reinterpret_cast<BYTE*&>(ptr) += 25;
К>

проблема в том, что использование reinterpret_cast может привести к дополнительным ошибкам.

К>А вообще, если заранее известно, что с ptr работают как с указателем на массив байтов — то зачем создавать себе сложности, сперва объявляя его как LPVOID, а потом приводя к LPBYTE.

Скорее всего автор хотел получить массив неопределённого типа
Glück auf
Re: Почему не работает код
От: raincrossbow  
Дата: 17.07.06 19:39
Оценка:
Здравствуйте, Ronaldo, Вы писали:

R>Почему не работает следующий код

R>ptr — указатель типа void.
R>вот так не работает
R>((LPBYTE)ptr) += 25;
R>error C2106: '+=' : left operand must be l-value

Ну, явно потому, что ((LPBYTE)ptr) не l-value.

Т.е. нельзя написать:

((LPBYTE)ptr) = ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.