0 / 0 / 0
Регистрация: 06.04.2011
Сообщений: 3
|
|
1 | |
Работа с указателями06.04.2011, 20:33. Показов 999. Ответов 8
Метки нет (Все метки)
Доброго времени суток!
Прошу помощи в решении очень интересной задачи. Перепробовал все свои знания., не получается( Чаще всего получаю: conversion from 'int' to 'float', possible loss of data В результате неаккуратного обращения с указателями, целочислен-ное значение типа int было записано по адресу, по которому в программе располагается переменная типа float (скажем, x). Приведите фрагмент кода, который позволяет прочитать это целочисленное значение с указанного адреса. (Файл Test1.zip содержит заготовку Microsoft Visual C++ 7.0 проекта, в котором используется функция BadDllFunction (экспортируется из BadDll.dll), реализующая описанную некорректную запись некоторого целого числа по переданному адресу переменной типа float. Добавьте Ваш код вместо закомментированной строки // i = … в main.cpp. Чему равно это целое число?)
0
|
06.04.2011, 20:33 | |
Ответы с готовыми решениями:
8
Работа с указателями Работа с указателями работа с указателями Работа с указателями |
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
07.04.2011, 07:04 | 2 | |||||
1
|
0 / 0 / 0
Регистрация: 06.04.2011
Сообщений: 3
|
|
07.04.2011, 07:30 [ТС] | 3 |
А получилось!)))
А можно комментарий как происходит данное считывание? Не совсем понимаю такой оператор (int*)&f?
0
|
14 / 14 / 1
Регистрация: 04.04.2011
Сообщений: 70
|
|
07.04.2011, 07:39 | 4 |
& - операция взятия адреса переменной(если она - реальный объект, а не ссылка)
(int *) приведение указателя к типу int * перед (int *) означает: разыменовать указатель на int. итого это значит: взять адрес переменной f типа float и интерпретировать как int и разыменовать(взять значение). в инт попадут старшие байты из флоат.
1
|
0 / 0 / 0
Регистрация: 06.04.2011
Сообщений: 3
|
|
07.04.2011, 07:53 [ТС] | 5 |
Разобрался. Последняя фраза помогла. Все не мог понять как флоат превратится в инт. Спасибо.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
07.04.2011, 08:11 | 6 |
*все байты из float, если sizeof(int)==sizeof(float). Т.е. практически наверняка все байты.
0
|
14 / 14 / 1
Регистрация: 04.04.2011
Сообщений: 70
|
|
07.04.2011, 08:18 | 7 |
Этот вопрос спорен и зависит от компилятора.
В любом случае, человек интересовался куда(в какое место, при условии неравенства количества байтов размерности) укажет новый указатель int, меньший по длине. И что в итоге будет содержаться, если таковая ситуация поимеет место быть.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
07.04.2011, 08:24 | 8 |
Ну а при неравенстве всё будет определяться порядком байт. Если в младших адресах старшие байты, то они в инте и будут, а если младшие, то они. То есть это уже зависит от формата флоата, а при аппаратном формате от камня.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
07.04.2011, 08:50 | 9 |
ЭТО главная проблема, а не то, куда там что указывает.)
Добавлено через 46 секунд Поэтому я и написал условие, когда оно да.) Добавлено через 1 минуту Вот от этого совсем не зависит. Т.к. читается не float, а фактически мусор, который записался по адресу переменной типа float.
0
|
07.04.2011, 08:50 | |
07.04.2011, 08:50 | |
Помогаю со студенческими работами здесь
9
Работа с указателями Работа с указателями работа с указателями в Работа с указателями Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |