Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

RusFAQ.ru: Программирование на C / C++

Выпуск № 616
от 26.10.2004, 10:30

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 1988
Отправлено ответов: 3803
Активность: 191.2 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Василевский Александр
Статус: Опытный
Общий рейтинг: 116.44
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 109.78
[Подробней >>]
DSota
Статус: Доверительный
Общий рейтинг: 127.39
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 1985. Как обменять местами два объекта в памяти, не зная их тип (у меня есть только два указателя m_After... (ответов: 3)

Вопросов: 1, ответов: 3


 Вопрос № 1985

Как обменять местами два объекта в памяти, не зная их тип
(у меня есть только два указателя m_After и m_Until).
Пробовал так:
void *tmp = malloc(sizeof(*m_After));
memcpy(tmp, m_After, sizeof(*m_After));
memcpy(m_After, m_Until, sizeof(*m_Until));
memcpy(m_Until, tmp, sizeof(*m_Until));
delete tmp;



Вопрос отправлен: 22.10.2004, 12:24
Отправитель: imbecile

[Следующий вопрос >>] [Список вопросов]

Отвечает Василевский Александр

Приветствую Вас, imbecile!
Для обмена местами двух объектов в памяти необходимо хотя бы знать их размер. Ваша программа будет работать только в том случае, если известен тип данных, т.к. выражение sizeof(* m_After) вернёт размер известного типа данных. Последняя строчка ошибочна: память, выделенная при помощи malloc() должна освобождаться функцией free().
Если размер данных известен, то можно использовать код из приложения (код меняет местами два объекта, не выделяя дополнительной памяти).

Приложение:

Ответ отправлен: 22.10.2004, 12:41
Отправитель: Василевский Александр


Отвечает vitya

Доброе время суток, imbecile!
Извратом заниматься не надо.
Но есть serious mistake: то что было malloc, надо free, то что было new надо delete.

Ответ отправлен: 22.10.2004, 12:56
Отправитель: vitya


Отвечает DSota

Здравствуйте, imbecile!
Для этого надо точно знать размеры обьекта, тут sizeof() не сработает - он возвратит 4 или 8 (размер самого указателя). Легче оставить их в памяти как есть на своих местах, а просто поменять местами (значениеми) указатели на эти обьекты. Еще проблема может возникнуть, когда один из обьектов больше другого, и больший обьект при перемещении на место меньшего может просто испортить важные данные.

Ответ отправлен: 22.10.2004, 13:19
Отправитель: DSota



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (26)
C / C++ (16)
Perl (8)
Builder / Delphi (19)
Pascal (21)
Basic / VBA (9)
Java / JavaScript (6)
PHP (18)
Криптография (8)
WinAPI (16)
Радиоэлектроника (15)
Пользователю
Windows 95/98/Me (43)
Windows NT/2000/XP (62)
"Железо" (40)
Поиск информации (21)
Администратору
Windows NT/2000/XP (37)
Linux / Unix (14)
Юристу
Гражданское право (7)
Семейное право (4)
Трудовое право (6)
КоАП (5)

Отправить вопрос всем экспертам выбранной рассылки.





http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться

В избранное