Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
9 / 9 / 8
Регистрация: 02.01.2017
Сообщений: 262

Приведение типов: как работает reinterpret_cast<>() ?

08.01.2017, 09:16. Показов 1135. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу разобраться до конца с приведением типов а именно интересует reinterpret_cast<>(), хотя бы в общих чертах логика этой функции, на большинстве ресурсов короткая характеристика а с инглишем пока плоховато.
для примера хотелось бы разобрать по винтику две обратные функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
int  strtoint(AnsiString temp) 
{
int z;
z=reinterpret_cast<int>(temp.c_str());
return z;
}
AnsiString inttostr(int temp)
{
AnsiString buf;
buf=AnsiString(reinterpret_cast<char*>(temp));
return buf;
}
как ни странно работает, хотя по логике результат должен быть первым символом строки почему??
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2017, 09:16
Ответы с готовыми решениями:

Как работает приведение типов
#include &lt;stdio.h&gt; int main(void) { printf(&quot;%d&quot;, (int*)3 + 4); return 0; } То что выведется 19 проверить можно. Но...

Как работает reinterpret_cast?
не пойму как работает reinterpret_cast? вот если мне надо например данные привести в бинар для сохранения в файл, я пишу: int value =...

Неправильное приведение типов или как?
Короче вот код void CMyDialog::OnBnClickedButtonEdit() { double number ; CString t; number= (t_f+t_o+t_m+t_d+t_b+t_i+t_s)/7; ...

7
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
08.01.2017, 09:37
C++
1
2
3
4
5
6
int  strtoint(AnsiString temp) 
{
int z;
z=reinterpret_cast<int>(temp.c_str());
return z;
}
Это полный бред - вот коллега доступным языком про волгу объяснил почему Не работает CreateProcess
0
9 / 9 / 8
Регистрация: 02.01.2017
Сообщений: 262
08.01.2017, 09:56  [ТС]
Понятное дело никаких операций с этим int дальше проводить не стоит, делалось это приведение с целью записи в файл, так как структуру с полями типа string целиком записать невозможно искал варианты приведения строки к статической переменной.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.01.2017, 10:18
Цитата Сообщение от imjonhson Посмотреть сообщение
Понятное дело никаких операций с этим int дальше проводить не стоит, делалось это приведение с целью записи в файл, так как структуру с полями типа string целиком записать невозможно искал варианты приведения строки к статической переменной.
1) Записать str.size().
2) Записать str.size() байт из str.c_str().
При условии что ваша религия запрещает out<<str.
0
9 / 9 / 8
Регистрация: 02.01.2017
Сообщений: 262
08.01.2017, 10:53  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct exemple1
{
AnsiString a,b,c,d,e,f,g;
int w,e,r,t; 
};
struct exemple2
{
AnsiString a1,b1,c1,d1,e;
double t;
};
class exempleclass
{
AnsiString k,l,m,n,o,p;
vector<exemple1> temp1;
vector<exemple2> temp2;
};
bool savefunc(vector<exemplclass>);// эту функцию сейчас пытаюсь написать
это очень сокращенный пример того что надо запихнуть в файл,если б в структурах не было указателей задача была бы попроще
C++
1
2
3
ofstream fout("st.kl", ios::binary|ios::trunc);
fout.write(reinterpret_cast<char*>(&struct), sizeof(struct));
fout.close();
а без такой возможности придётся километр кода писать, в начале описывать размер и т.д.
где то видел упоминание о сериализации но пока в эту сторону ещё серьезно не копал
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.01.2017, 11:49
Цитата Сообщение от imjonhson Посмотреть сообщение
а без такой возможности придётся километр кода писать, в начале описывать размер и т.д.
где то видел упоминание о сериализации но пока в эту сторону ещё серьезно не копал
Если хочешь действительно внешней(автоматической) сериализации/десериализации да еще и полиморфной километры кода понадобятся однозначно. Потому как такая задача решается только при наличии рефлекшина которого в стандарте нет. И если компилятор таблицы рефлекшина в прогу не зашивает (компиляторы которые следуют стандарту) или зашивает по принципу "только для своих" (компиляторы которые имеют все что в стандарте но на стандарт ложили) то для решения оной задачи потребуется сделать метакомпилятор который обрабатывает исходник перед компиляцией и вшивает в него таблицы рефлекшина.

Добавлено через 10 минут
Да кстати для действительно качественной сериализации/десериализации и облегчения в этом плане работы с указателями кроме самого рефлекшина нужны еще свойства которых в стандарте тоже нет и специальная секция класса в которой описываются сохраняемые/восстанавливаемые при сереализации/десериализации свойства.
1
9 / 9 / 8
Регистрация: 02.01.2017
Сообщений: 262
08.01.2017, 11:53  [ТС]
Тема записи структуры для меня тоже немаловажна но хотелось бы все таки вернуться к приведению типов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TForm1::Button1Click(TObject *Sender) //записываем
{
  ofstream f("test.ij",ios::binary);
  int a=strtoint(this->Edit1->Text;);
  f.write(reinterpret_cast<char*>(&a),sizeof(a));
  f.close();
}
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)//считываем
{
ifstream fin("test.ij",ios::binary);
int buf;
fin.read(reinterpret_cast<char*>(&buf),sizeof(buf) );
ShowMessage(inttostr(buf));
fin.close();
}
работает за исключением того что последний символ превращается в мусор
Насколько я понимаю reinterpret_cast<>() оставляет содержимое переменной нетронутым меняя только тип даже если я привожу к типу int а содержимое больше размера int, вопрос в следующем как сохранить содержимое в девственном виде , и почему вылазит косяк с последним символом в строке.
Дело в том что я пишу в builder c++ а там все подвязано на AnsiString и если б найти способ запихнуть все AnsiString в псевдо int или другие статические переменные аккуратно и продуманно то это облегчило бы жизнь не только мне но и многим поколениям начинающих программистов
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.01.2017, 12:05
Цитата Сообщение от imjonhson Посмотреть сообщение
Дело в том что я пишу в builder c++ а там все подвязано на AnsiString и если б найти способ запихнуть все AnsiString в псевдо int или другие статические переменные аккуратно и продуманно то это облегчило бы жизнь не только мне но и многим поколениям начинающих программистов
Дело в том что в C++ Builder есть и рефлекшн и свойства и даже автоматическая сериализация/десериализация но только для потомков TObject. И есть оно там уже лет 20. Другое дело что весь новомодный хлам из стандарта и STL для этого абсолютно не нужен и таких делов делать в принципе не умеет.И AnsiString так же как и остальные местные строки при этом обрабатываются нормально. Да кстати у билдера свои потоки. Есть и специально предназначенные для сериализации/десериализации компонентов. а этот отставший от жизни лет на 35 хлам из STL лучше не трогать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2017, 12:05
Помогаю со студенческими работами здесь

Строгая типизация. Только ручное приведение типов. Как не смешать яблоки с грушами?
Приветствую Вас, уважаемые форумчане! Вопрос, предполагаю, элементарный для опытных программистов. Подскажите пожалуйста каким...

Как работает приведение типов
Решил создать новую тему, так как вообще не понимаю, каким образом C++ преобразует один тип в другой. Я например пишу: char s = '5'; ...

Объясните, как в примере работает приведение типов
Вот такой пример: #include &lt;stdio.h&gt; #include &lt;pthread.h&gt; void * any_func (void * arg) { int a = *(int *) arg; a++; ...

Не требуется приведение типов при умножении типов Byte
Читал тут книгу(Г. Шилдт, &quot;Полный справочник по C#&quot;), и нашел такое (ст. 77) Поскольку при умножении, например, 2 чисел типа byte,...

float to double. Как происходит приведение типов?
double x = 1.01F; float y = 1.01F; Console.Write(x); // 1.00999 Console.WriteLine(); Console.Write(y); // 1.01 Console.Read(); ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru