Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 28.06.2017, 07:43   #161
Croessmah
Вредный кошак
Профессионал
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
Репутация: 379
По умолчанию

Цитата:
вот таким кодом
Код содержит неопределенное поведение.


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


Остальное не распарсил.


Тысячное сообщение!!! Юбилей.
Croessmah вне форума   Ответить с цитированием
Старый 28.06.2017, 08:31   #162
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Тысячное сообщение!!! Юбилей.
грац
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Код содержит неопределенное поведение.
да какая разница прога на 1 раз проверить. из инета откуда-то слизал... много способов.
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Чтобы не ругался, можно отключить соответствующее предупреждение.
Ещё бы отыскать, где в этом VS отключаются конкретные предупреждения ))
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Остальное не распарсил.
Ну суть в том, что если
Код:
char* a = "blabla";
char* b = "BLABLA";
a = b;
то это криво. А как тогда надо? Вот так?
Код:
char a[] = "blabla"
const char* b = "BLABLA";
strcpy(a, b);
bugaboo вне форума   Ответить с цитированием
Старый 28.06.2017, 08:47   #163
Croessmah
Вредный кошак
Профессионал
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
Репутация: 379
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
Ещё бы отыскать, где в этом VS отключаются конкретные предупреждения
Не поверите, в документации об этом написано: https://msdn.microsoft.com/ru-ru/library/2c8f766e.aspx )))


Цитата:
Сообщение от bugaboo Посмотреть сообщение
то это криво.
Это вообще не понятно что и чего этим пытались добиться.
Croessmah вне форума   Ответить с цитированием
Старый 28.06.2017, 09:13   #164
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Это вообще не понятно что и чего этим пытались добиться.
Код:
a = b
не приоткрыл для вас завесу этой тайны?
ну просто тупо в a записать то чаво лежит в b ))
всё то же strcpy?
или так можно делать:
Код:
*a = *b;
просто я уже чет сегодня ни в чём не уверен....
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Не поверите, в документации об этом написано
Спасибо, сам бы я ни за что этого не отыскал!

Последний раз редактировалось bugaboo; 28.06.2017 в 09:19.
bugaboo вне форума   Ответить с цитированием
Старый 28.06.2017, 09:17   #165
Croessmah
Вредный кошак
Профессионал
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
Репутация: 379
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
ну просто тупо в a записать то чаво лежит в b
В b лежит адрес строкового литерала.
После
Код:
a = b;
в a будет тот же адрес, что и в b.
Цель достигнута - в a лежит то же, что и в b.
Croessmah вне форума   Ответить с цитированием
Старый 28.06.2017, 09:30   #166
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Цель достигнута - в a лежит то же, что и в b.
Всё, разобрался. После того, как всё правильно написал, компилятор перестал пропускать
Код:
a = b;
то есть, либо
Код:
*a = *b;
либо
Код:
strcpy(a, b);
bugaboo вне форума   Ответить с цитированием
Старый 28.06.2017, 09:33   #167
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Большое спасибо всем, кто принимал участие в этой плодотворной (для меня) беседе!
Хоть и с warningами, но всё же удалось получить хоть и длинный, но всё же "трушный" код! Без стрингов.
Если я всё правильно понял, вот так будет чуть быстрее, но чуть длиннее код:
Код:
	auto la = strlen(a);
	char* c = new char[la + strlen(b) + 1];
	strcpy(c, a);
	strcpy(c + la, b);
а вот так - чуть медленнее, но чуть короче код:
Код:
	char* c = new char[strlen(a) + strlen(b) + 1];
	strcpy(c, a);
	strcat(c, b);

Последний раз редактировалось bugaboo; 28.06.2017 в 10:58.
bugaboo вне форума   Ответить с цитированием
Старый 28.06.2017, 13:28   #168
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 889
Репутация: 172
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Такое использование union (запись в одно поле, а чтение из другого) в c++ приводит к неопределенному поведению.
а какое иное использование есть у юнион? вам не кажется, что в таком случае - юнион вообще из языка вылетает.
alexzk вне форума   Ответить с цитированием
Старый 28.06.2017, 13:32   #169
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 889
Репутация: 172
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
Большое спасибо всем, кто принимал участие в этой плодотворной (для меня) беседе!
Хоть и с warningами, но всё же удалось получить хоть и длинный, но всё же "трушный" код! Без стрингов.
Если я всё правильно понял, вот так будет чуть быстрее, но чуть длиннее код:
Код:
	auto la = strlen(a);
	char* c = new char[la + strlen(b) + 1];
	strcpy(c, a);
	strcpy(c + la, b);
а вот так - чуть медленнее, но чуть короче код:
Код:
	char* c = new char[strlen(a) + strlen(b) + 1];
	strcpy(c, a);
	strcat(c, b);
одинаково, потому что (примерно)

strcat = strlen + strcpy


Вот так ровно на 1 байт копирования быстрее
Код:
	auto la = strlen(a);
	char* c = new char[la + strlen(b) + 1];
	memcpy(c, a);
	strcpy(c + la, b);
alexzk вне форума   Ответить с цитированием
Старый 28.06.2017, 13:37   #170
Croessmah
Вредный кошак
Профессионал
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
Репутация: 379
По умолчанию

union служит для экономии памяти. Всё.
https://stackoverflow.com/questions/...ons-in-c-and-c
Цитата:
The purpose of unions is rather obvious, but for some reason people miss it quite often.

The purpose of union is to save memory by using the same memory region for storing different objects at different times. That's it.

It is like a room in a hotel. Different people live in it for non-overlapping periods of time. These people never meet, and generally don't know anything about each other. By properly managing the time-sharing of the rooms (i.e. by making sure different people don't get assigned to one room at the same time), a relatively small hotel can provide accomodations to a relatively large number of people, which is what hotels are for.

That's exactly what union does. If you know that several objects in your program hold values with non-overlapping value-lifetimes, then you can "merge" these objects into a union and thus save memory. Just like a hotel room has at most one "active" tenant at each moment of time, a union has at most one "active" member at each moment of program time. Only the "active" member can be read. By writing into other member you switch the "active" status to that other member.

For some reason, this original purpose of the union got "overriden" with something completely different: writing one member of a union and then inspecting it through another member. This kind of memory reinterpretation is not a valid use of unions. It generally leads to undefined behavior.

EDIT: Using unions for the purposes of memory reinterpretation (i.e. writing one member and then reading another) was eventually made legal in one of the Technical Corrigendums to C99 standard. Now it is officially OK to do that in C. However, keep in mind that formally this does not protect you from running into undefined behavior by attempting to read a trap representation.
Цитата:
Цель union достаточно очевидна, но по какой-то причине люди это часто упускают.

Целью объединения является сохранение памяти, использую одну область памяти для хранения объектов в разное время. Вот и всё.

Он похож на комнату в гостинице. Разные люди живут в нем в разное время. Эти люди не встречаются и ничего друг о друге не знают. При правильном управлении разделением времени номеров, небольшой отель может предоставить номера для большего числа людей.

Именно это делает union. Если Вы знаете, что несколько объектов в Вашей программе хранят значения и у них не пересекается время жизни (lifetime), то Вы можете объединить их в union, тем самым сохранив память. Так же как гостиничный номер имеет не более одного "активного" жильца в каждый момент времени, union имеет не более одного "активного" члена в каждый момент времени. Только "активный" член может быть прочитан. Запись в другой член переключает на него статус "активный".

Использование union для разной интерпретации памяти (запись в одно поле и чтение из другого) был в конечном счете узаконено в одном из технических документов в стандарте C99. Теперь это официально ОК, если это делается в C. Однако, имейте ввиду, что формально это не защитит Вас от UB при работе.
Croessmah вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MMX сложить два числа gansm Assembler 13 29.10.2010 05:16
как сложить два числа с плавающей точкой forsy Assembler 19 29.03.2010 02:15
Макрос: сложить два числа белочка Microsoft Office Excel 6 23.12.2009 23:02
Сложить два числа и вывести результат на экран We1c0m3 Assembler 2 23.05.2009 11:41
Сложить два числа iwaniwan Win Api 3 23.04.2009 06:27


17:33.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.