|
|
|
why (char*) ?
|
|||
|---|---|---|---|
|
#18+
Добрый вечер! Объясните пожалуйста в чем дело : (смотрите сразу main) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. Результат следующий: 0 4 8 Base1::f() Base2::f() Base3::f() Press any key to continue Однако если изменить последние строки так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. то результат такой: 0 4 8 Base1::f() плюс ошибка The instruction at "0x435..." referenced memory at "0x00..00". The memory could not be read. Благодарю за внимание! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2004, 05:00 |
|
||
|
why (char*) ?
|
|||
|---|---|---|---|
|
#18+
ужас... ну если такая мясорубка пошла. то что если последовательно убрать 1 (static_cast<Base1*>(pVoid))->f(); потом + offsetofclass(Base1, Drive); и посмотреть что происходит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2004, 10:01 |
|
||
|
why (char*) ?
|
|||
|---|---|---|---|
|
#18+
Дело в первом косте pVoid = (char*)&d после коста результат сразу пойдёт как укачатель на чар. То бишь offsetofclass(Base2, Drive) - пойдёт как смещение в байтах если же pVoid = &d, результат пойдёт как 32битное и к указателю на голову класса Д прибабится 4-байтная дельта а не 1-байтная. Отсюда получится неправильное смещение, которое и не сможет вызвать f() (static_cast<Base2*>(pVoid))->f(); - ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2004, 10:58 |
|
||
|
why (char*) ?
|
|||
|---|---|---|---|
|
#18+
Наверно, так более безопасно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2004, 15:04 |
|
||
|
why (char*) ?
|
|||
|---|---|---|---|
|
#18+
А ты пробовал? Работает? что &d что (void*)(reinterpret_cast <UINT>(&d) типом результата первого слагаемого будет (void*) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2004, 10:30 |
|
||
|
why (char*) ?
|
|||
|---|---|---|---|
|
#18+
To CEMb Пробовал. Работает. Можно и так Код: plaintext 1. 2. сам понимаешь, по барабану. Идея была в том, что в скобках два целых сложить и работать с результатом, как с адресом. Мне кажется, что использование reinterpret_cast в этом контексте более безопасно, чем (char*)&d. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2004, 14:38 |
|
||
|
why (char*) ?
|
|||
|---|---|---|---|
|
#18+
Если к указателью прибавить хоть единицу, то он будет указывать на адрес, который являеться собственный + длина типа , на который указывает указатель. Следовательно, в Вашем примере, чтобы попасть на очередные функции, надо прибавить не смещение адреса, а просто 1. То есть - Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2004, 15:00 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=457&tid=2035397]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 191ms |
| total: | 319ms |

| 0 / 0 |
