Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
1

Получение адреса

24.04.2015, 13:00. Показов 2094. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть следующая строка:

long int array[100];

Что означает, если мы напишем следующее:
(char*)Arr;

Мы получим начало адреса нашего массива?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2015, 13:00
Ответы с готовыми решениями:

Получение IP адреса (Си)
Есть ли функция или библиотека для С для определения своего реального интернет IP адреса? Или может...

функция получение ip адреса
какой функцией можно получить в программе на c++ свой ip адресс и можно ли его сменить?

Получение значения из адреса
Я имею адрес DWORD Vehicle = { 0x00B6F5F0 }; он содержит число(я могу узнать его вне кода), мне...

Получение адреса ячейки из функции
Добрый вечер, уважаемые форумчане! Помогите новичку разобраться с указателями. Есть...

34
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
24.04.2015, 13:02 2
Цитата Сообщение от M4753 Посмотреть сообщение
Мы получим начало адреса нашего массива?
нет
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
24.04.2015, 13:16  [ТС] 3
А что мы получили тогда?) Если не трудно, можете разъяснить?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
24.04.2015, 13:27 4
Цитата Сообщение от M4753 Посмотреть сообщение
А что мы получили тогда?
ошибку компиляции
array это и так адрес начала
C++
1
2
long int array[100];
cout << array;
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
24.04.2015, 13:54 5
Цитата Сообщение от Jewbacabra Посмотреть сообщение
ошибку компиляции
Ну ошибки-то не будет. Будет reinterpret-преобразование long int * -> char *.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
24.04.2015, 15:17 6
DrOffset, на самом деле из сообщения TC не понятно что такое Arr. так как оно не объявлено я и написал что это ошибка.
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
24.04.2015, 17:04  [ТС] 7
Спасибо всем за неравнодушность к теме Ошибки не будет, просто суть в следующем: у меня есть функция, которой в качестве параметра нужно передавать начало логического адреса объекта (т.е. мой массив long int). Поэтому хочу понять, что происходит при таком преобразовании.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
24.04.2015, 17:11 8
Цитата Сообщение от M4753 Посмотреть сообщение
Поэтому хочу понять, что происходит при таком преобразовании.
Компилятор начинает считать адрес типа А адресом типа Б. Значение адреса при этом не меняется.
1
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
24.04.2015, 18:32  [ТС] 9
Спасибо за ответ. Тогда следующий вопрос: в моем случает вместо long int имею тип float, что первый тип - 4 байта, что и второй. Т.е. такое преобразование тоже логично. Ситуация следующая:

имею:
vector<float> arr;

Каким образом я смогу применить преобразование (char*).
(char*) arr понятно, что не могу так написать. Как логичнее будет? Просто я уже и & и * куда только не приписывала.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
24.04.2015, 18:49 10
Цитата Сообщение от M4753 Посмотреть сообщение
Каким образом я смогу применить преобразование
Лучше вообще ничего не применять, если нет понимания как, что и зачем.
Почему нельзя остаться в рамках оригинальной типизации?
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
24.04.2015, 18:52  [ТС] 11
Иного выхода просто нет, ладно, спасибо за помощь, попробую разобраться лучше
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
24.04.2015, 18:59 12
Цитата Сообщение от M4753 Посмотреть сообщение
Иного выхода просто нет, ладно, спасибо за помощь, попробую разобраться лучше
Может начнем с того, что опишем задачу, которую надо решить?
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
24.04.2015, 19:06  [ТС] 13
Хорошо, код следующий:

C++
1
2
3
4
5
6
7
8
vector<char> tmp_buffer;
char* p_tmp_buffer = &tmp_buffer[0];
 
// Здесь вызывается функция fun (p_tmp_buffer, ...);
 
int* p = reinterpret_cast<int*>(p_tmp_buffer);
int x = p[w * j + i];
buffer[w * j + i] = x;
Это что выполняется ДО. После, мне нужно как-бы проделать обратную процедуру: на входе имею тот самый vector<float>buffer. А функция, в которую мне нужно передать значение, первым параметром принимает char * bits. В документации написано, что данный параметр - это адрес логического начала выводимого участка.

Просто первый раз столкнулась с работой с памятью. Буду рада помощи
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
24.04.2015, 19:13 14
Лучший ответ Сообщение было отмечено M4753 как решение

Решение

Цитата Сообщение от M4753 Посмотреть сообщение
А функция, в которую мне нужно передать значение, первым параметром принимает char * bits. В документации написано, что данный параметр - это адрес логического начала выводимого участка.
Т.е., я правильно понял, что есть некая сторонняя функция, которая принимает указатель char*? И под этим char* подразумевается просто набор произвольных байт?
Ну тогда понятно. С этого надо было начинать
C++
1
2
3
4
5
vector<float> arr;
char* pArr = reinterpret_cast<char*>(&arr[0]);
 
//Если что, размер этой области в байтах вычисляется как
arr.size() * sizeof(float)
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
24.04.2015, 19:57  [ТС] 15
Спасибо большое!

Добавлено через 40 минут
Программа компилируется, но результат переменной char * bits - ссылается на пустое место. Хотя должен быть массив.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
24.04.2015, 20:01 16
Цитата Сообщение от M4753 Посмотреть сообщение
Программа компилируется, но результат переменной char * bits - ссылается на пустое место. Хотя должен быть массив.
Как это ты поняла?
Может быть больше кода (реального) покажешь?
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
24.04.2015, 20:14  [ТС] 17
Строится матрица высот, и в ней значения должны варьировать от минус какого-то реального значения до плюс соответственно. У меня как результат значения равны 1 млн метров. Таких высот в мире вообще нет Я зашла в режим отладки, чтобы посмотреть значения char * bits. Оказалось, что оно равно "". А значения должны быть следующими, например 124, 140, вообще ни как не 1 млн. Вот я сделала предположение, что вдруг из-за преобразования мы куда - то не туда залезли в память.

Добавлено через 3 минуты
Просто тот первый вопрос про long int Arr[100] я взяла из документации. Затем реализовала этот пример. И преобразование (char*) на реальные значения указывали. А здесь...совсем не то, что надо...
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
24.04.2015, 20:20 18
Цитата Сообщение от M4753 Посмотреть сообщение
Оказалось, что оно равно ""
Это потому, что отладчик думает, что там строка (char* же). А на деле там float.

Цитата Сообщение от M4753 Посмотреть сообщение
У меня как результат значения равны 1 млн метров.
Вот именно поэтому я тебе выше писал, что нельзя ничего преобразовывать, если не до конца понятно к чему это приведет.

Цитата Сообщение от M4753 Посмотреть сообщение
вдруг из-за преобразования мы куда - то не туда залезли в память.
Память наша. Но float * таким образом нельзя преобразовать к char *, чтобы это прошло без последствий. Если там должна быть именно строка, а не байтовый буфер, то нужно выполнить честное копирование (с преобразованием значений, а не указателей) в строку, с заданным форматом. Затем эту строку уже передать твоей функции.
Итак, если там нужна строка, то каков формат этой строки?

Добавлено через 43 секунды
Цитата Сообщение от M4753 Посмотреть сообщение
А здесь...совсем не то, что надо...
Потому, что float хранится несколько более сложным образом, нежели int

Добавлено через 48 секунд
Цитата Сообщение от M4753 Посмотреть сообщение
Просто тот первый вопрос про long int Arr[100] я взяла из документации.
А можно мне на эту документацию взглянуть хоть?
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
24.04.2015, 20:23  [ТС] 19
Как мне отправить документацию?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
24.04.2015, 20:27 20
Цитата Сообщение от M4753 Посмотреть сообщение
Как мне отправить документацию?
Кнопка "расширенный режим", чуть ниже будет еще одна кнопка "управление вложениями". Дальше, думаю, разберешься
0
24.04.2015, 20:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2015, 20:27
Помогаю со студенческими работами здесь

Получение начального адреса процесса
Здравствуйте! Запущен процесс пытаюсь получить его адрес по аналогии с dll модулями MODULEINFO...

Получение адреса приложения и последующее задание смещений
Салют, задачей поставил получить адрес приложения и через смещения изменить соответственные...

Получение адреса функции (Дизассемблер Code::Blocks)
Привет всем! У меня вопрос. Работаю я в code::blocks 10.05 под minGW. Появилась нужда узнать адрес...

Получение адреса объекта после обнуления указателя на этот объект
Добрый вечер уважаемые программисты. Интересует следующий вопрос. Есть ли способ получить адрес...

Почему при присваивании адреса массива не ставится знак '&' получения адреса
int main() { int a = { 2, 3 }; int* b; b = a; //Почему при присваивании адреса массива не...

1. Ввести символьный массив. Найти адреса всех парных его элементов. 2. Вывести адреса элементов массива 4 на 4, находящ
Помогите пж... 1. Ввести символьный массив. Найти адреса всех парных его элементов. 2. Вывести...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru