Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь с указателями ! LPVOID 
V
    Опции темы
DigitSphinx
Дата 22.5.2007, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Код

int _tmain(int argc, _TCHAR* argv[])
{
    LPVOID aaa;
    double * d = new double;
    *d = 5.5;
    aaa = d;
    double x = (double *) aaa; // <-Error    1    error C2440: 'initializing' : cannot convert from 'double *' to 'double'    
    printf_s("%f", x);
    _getch();
    return 0;
}

Как мне в переменную “x”  запихнуть значение double’а которое находится по адресу “aaa” 
Пытался написать конструкцию наугад не получилось  smile  smile 



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Daevaorn
Дата 22.5.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Код

 double x =*( (double *) aaa );

PM MAIL WWW   Вверх
DigitSphinx
Дата 22.5.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Да да я так и написал , наугад но правильно :
Код

double x = *(double*)aaa;

но смысла не совсем понял !
получается x указатель это значение указателя на double по адресу aaa вообще логично.
Double занимает 8 байт на сколько я знаю , как можно прочитать в переменную типа 
Код

Char  * buff; 

все 8 байт по адресу aaa чтобы можно было бы потом вывисти  например так
Код

printf_s("%f", atof(buff));

Заранее благодарю. 


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Lomir
Дата 23.5.2007, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 30.1.2007
Где: Lithuania::Kaunas

Репутация: 1
Всего: 1



Код

double* tempPtr = (double*)aaa; //указатель из void* в double*
double x = *tempPtr; //Берем из указателя значение

double x = *(double*)aaa; //Тут тоже самое, в начале приводим указатель к типу, потом берем значение.

2 вопроса непонел...

Это сообщение отредактировал(а) Lomir - 23.5.2007, 00:47
PM MAIL ICQ Skype   Вверх
Hurricane
Дата 23.5.2007, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



DigitSphinx, какая-то каша в твоих рассуждениях, хотя интуитивно ты вроде как понимаешь.

void* aaa - указатель на тип void. void - неопределенный тип, не имеет размерности. Т.е. в aaa лежит адрес чего-то, тип которого (точнее - размер) неизвестен.

(double*)aaa - приводим к указателю на тип double. Т.е. говорим, что по адресу aaa лежат данные (число) типа double. На самом деле это может быть и неправда, но мы так говорим компилятору.

Можем сделать так: (int*)aaa - приводим к указателю на тип int. Т.е. говорим, что по адресу aaa лежат данные (число) типа int. Что есть неправда  smile . Но компилятор этого не знает, он делает то, что мы ему говорим.

*((double *)aaa) - приводим к указателю на число типа double и берем значение этого числа. Т.е. в данном случае мы _сами_ сказали компилятору, что по адресу aaa лежит число типа double, поэтому компилятор и будет возвращать число типа double (которое занимает предположительно 8 байт). *(int*)aaa - вернет число типа int (предположительно 4 байта), потому что мы говорим компилятору вернуть число типа int (значение по указателю на тип int).

Код

double x = *((double*)aaa);


Теперь понятно?  smile 

Про напечатать - тут я вообще ничего не понял.


Это сообщение отредактировал(а) Hurricane - 23.5.2007, 01:03
PM MAIL   Вверх
Smarts
Дата 23.5.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



Код
double x = *(double*)aaa

Ты переводишь сам указатель в double*,  более правильно так:

Код

double *x = (double*) aaa;
printf("%d", *x);


Это сообщение отредактировал(а) Smarts - 23.5.2007, 01:06
PM MAIL   Вверх
Hurricane
Дата 23.5.2007, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



Цитата(Smarts @ 22.5.2007,  17:03)
попробуй сделать то же самое, но с результатом:

Код

double x = (double)(*aaa)


И как же разименовать указатель на тип void? Боюсь, что компилятор этого не умеет.
PM MAIL   Вверх
Smarts
Дата 23.5.2007, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



Цитата(Hurricane @ 23.5.2007,  01:05)
Цитата(Smarts @ 22.5.2007,  17:03)
попробуй сделать то же самое, но с результатом:

Код

double x = (double)(*aaa)


И как же разименовать указатель на тип void? Боюсь, что компилятор этого не умеет.

Не подумал об этом, тогда так:

Код
double x = (double)(  *((double*)aaa)  )

PM MAIL   Вверх
DigitSphinx
Дата 23.5.2007, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Всем огромное спасибо smile .
Lomir, На счет второго вопроса (даже не вопрос а мысли в слух !), я имею ввиду что в памяти int на пример  занимает 4 смежных байта не учитывая выравнивания по границам (потому что я на знаю что это такое) smile , теперь зная адрес первого байта в памяти , можно как ни будь прочитать эти 4 байта например каждый байт в отдельный char
что то типа
Код

int _tmain(int argc, _TCHAR* argv[])
{
    LPVOID aaa;
    int * i = new int;
    *i = 505;
    aaa = i;
    char * c = new char[4];
    c[0] = * ((char *)aaa + 0);
    c[1] = * ((char *)aaa + 1);
    c[2] = * ((char *)aaa + 2);
    c[3] = * ((char *)aaa + 3);
    printf_s("%c%c%c%c", c[0], c[1], c[2], c[3]);
    delete [] c;
    _getch();
    return 0;
}

на выходе ничего интересного не дал !



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Fin
Дата 23.5.2007, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



А что мешает сделать проше? например так:
Код

#include <stdio.h>
int main()
{
   int *i=new int;
   *i=(((48*256)+48)*256+48)*256+48;
   char *ch;
   ch=(char *) i;
   printf("%c%c%c%c\n", ch[0], ch[1], ch[2], ch[3]);
   return 0;
}



--------------------
Пролетал мимо.
PM MAIL   Вверх
DigitSphinx
Дата 23.5.2007, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Fin, Твой код дал 4 нуля ! , а мне было интересно что содержит каждая ячейка !.
Ладно основной вопрос был решен , всем огромное спасибо  smile , тема закрыта.


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Fin
Дата 23.5.2007, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



DigitSphinx, А он и должен был дать 4 нуля. В твоем коде в первой ячейке будет символ с кодом 0. В С/С++ это как правило обозначает конец строки, и естественно у тебя ничего и не будет печатать. Если ты переформатируеш свою строку примерно так, 

Код

printf_s("%d %d %d %d\n", c[0], c[1], c[2], c[3]);


то у тебя будет выдаваться содержимое ячеек в числовом, а не символьном виде.

Теперь разберем мой код. Символ "0" имеет код ASCII 48, поэтому и были выданы 4 нуля.


Это сообщение отредактировал(а) Fin - 23.5.2007, 09:32


--------------------
Пролетал мимо.
PM MAIL   Вверх
DigitSphinx
Дата 23.5.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Код

int _tmain(int argc, _TCHAR* argv[])
{
    
      int *i=new int;
      *i=(((65*256)+65)*256+65)*256+65;
      char *ch;
      ch=(char *) i;
      printf("%c %c %c %c\n", ch[0], ch[1], ch[2], ch[3]);
      _getch();
      return 0;
}

на выходе дало “A A A A” именно то что я хотел увидеть !
Fin тебе респект !



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.