С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
pasper
0 / 0 / 0
Регистрация: 06.04.2011
Сообщений: 3
#1

Работа с указателями - C++

06.04.2011, 20:33. Просмотров 666. Ответов 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
Вложения
Тип файла: rar Test1.rar (3.4 Кб, 12 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2011, 20:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с указателями (C++):

работа с указателями - C++
небольшая проблемка, никак не могу разобраться с указателями. Я так понял что создавая массив лучше если сразу сдалешь на него указатель и...

работа с указателями - C++
Как ПРАВИЛЬНО передать в функцию, массив, используя адресацию? Программа находит в массиве слово и перед ним вставляет какое то слово, то...

работа с указателями - C++
Помогите решить задачу в С++ (я в этом начиющий): 1)Из положительных значений двух целочисленных массивов различной размерности...

Работа с указателями - C++
Доброго времени суток, нужна помощь. Данный две задачи, обе работают правильно: Дан целочисленный массив размера N. Преобразовать...

Работа с указателями - C++
Подскажите пожалуйста, зачем написано * Rad_to_deg void show_polar (const polar * pda) { using namespace std; const...

Работа с указателями - C++
Дана динамическая целочисленная матрица. Построить динамический одномерный массив, каждый элемент которого равен сумме элементов одной...

8
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.04.2011, 07:04 #2
C++
1
2
float f = ...;
int i = *(int*)&f;
А архив качать не хочу.
1
pasper
0 / 0 / 0
Регистрация: 06.04.2011
Сообщений: 3
07.04.2011, 07:30  [ТС] #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
C++
1
2
float f = ...;
int i = *(int*)&f;
А архив качать не хочу.
А получилось!)))

А можно комментарий как происходит данное считывание? Не совсем понимаю такой оператор (int*)&f?
0
wolf.diesel
14 / 14 / 1
Регистрация: 04.04.2011
Сообщений: 70
07.04.2011, 07:39 #4
& - операция взятия адреса переменной(если она - реальный объект, а не ссылка)
(int *) приведение указателя к типу int

* перед (int *) означает: разыменовать указатель на int.

итого это значит: взять адрес переменной f типа float и интерпретировать как int и разыменовать(взять значение).
в инт попадут старшие байты из флоат.
1
pasper
0 / 0 / 0
Регистрация: 06.04.2011
Сообщений: 3
07.04.2011, 07:53  [ТС] #5
Цитата Сообщение от wolf.diesel Посмотреть сообщение
в инт попадут старшие байты из флоат.
Разобрался. Последняя фраза помогла. Все не мог понять как флоат превратится в инт. Спасибо.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.04.2011, 08:11 #6
Цитата Сообщение от wolf.diesel Посмотреть сообщение
В инт попадут старшие байты из флоат.
*все байты из float, если sizeof(int)==sizeof(float). Т.е. практически наверняка все байты.
0
wolf.diesel
14 / 14 / 1
Регистрация: 04.04.2011
Сообщений: 70
07.04.2011, 08:18 #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
*все байты из float, если sizeof(int)==sizeof(float). Т.е. практически наверняка все байты.
Этот вопрос спорен и зависит от компилятора.
В любом случае, человек интересовался куда(в какое место, при условии неравенства количества байтов размерности) укажет новый указатель int, меньший по длине. И что в итоге будет содержаться, если таковая ситуация поимеет место быть.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
07.04.2011, 08:24 #8
Ну а при неравенстве всё будет определяться порядком байт. Если в младших адресах старшие байты, то они в инте и будут, а если младшие, то они. То есть это уже зависит от формата флоата, а при аппаратном формате от камня.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.04.2011, 08:50 #9
Цитата Сообщение от pasper Посмотреть сообщение
В результате неаккуратного обращения с указателями
ЭТО главная проблема, а не то, куда там что указывает.)

Добавлено через 46 секунд
Цитата Сообщение от wolf.diesel Посмотреть сообщение
Этот вопрос спорен и зависит от компилятора.
Поэтому я и написал условие, когда оно да.)

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
То есть это уже зависит от формата флоата
Вот от этого совсем не зависит. Т.к. читается не float, а фактически мусор, который записался по адресу переменной типа float.
0
07.04.2011, 08:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2011, 08:50
Привет! Вот еще темы с ответами:

Работа с указателями - C++
Всем здравия. Нужна ваша помощь. Есть задание по С++. К сожалению работала в основном по С# да и с указателями не совсем лажу. Может кто...

Работа с указателями - C++
Написать программу работы с указателями. LONG *p1; ULONG x = 5; LONG y = -1; LONG *p2 = p1 + 50; p2 = p2 + x * y; *p2 = 1; ...

Работа с указателями - C++
Здравствуйте! Есть массив созданный ГСС. Надо написать функция которая вычисляет сколько в нем четных чисел, выделяет память под них и...

работа с указателями - C++
Вспоминаю с++ и в связи с этим возникло несколько вопросов. 1) если сделать так : myobj *obj = new myobj(); то потом можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.