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

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


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


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

Выпуск № 183
от 27.01.2003, 18:00

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


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

Avl2k
Статус: Опытный
Общий рейтинг: 124.52
[Подробней >>]
lunao
Статус: Начальный
Общий рейтинг: 112.5
[Подробней >>]
Yuri Gordienko
Статус: Опытный
Общий рейтинг: 114.81
[Подробней >>]
 
vitya
Статус: Профессиональный
Общий рейтинг: 108.04
[Подробней >>]
Ramzes
Статус: Доверительный
Общий рейтинг: 125.58
[Подробней >>]


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

Вопрос № 549. 1. Чтобы все данные объекта находились в одной области памяти, поменял везде объявление класса на об... (ответов: 5)

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


 Вопрос № 549

1. Чтобы все данные объекта находились в одной области памяти, поменял везде объявление класса на объявление объединения (union), и обнаружеил, что переменные в объекте начали "налезать" друг на друга: при изменении одних переменных спонтанно меняются другие, в результате программа теряет работоспособность. Вопрос закономерный: к чему бы это и как от этого избавиться. Использую CB5. Классы до этого не наследовались и наследоваться не собираются.
2. Все ещё пытаюсь сохранить сложный (описание класса занимает ~200 строк) объект на диск, теперь уже без динамических массивов. Кто нибудь знает как заставить компилятор хранить все данные объекта подряд в одной области памяти не используя объединения (все массивы и т.п. статичны)?
P.S. В предыдущем вопросе указал неправильный e-mail, однако в рассылке его так и не было. Кто-нибудь вообще отвечал?



Вопрос отправлен: 24.01.2003, 17:51
Отправитель: DM

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

Отвечает Avl2k

Доброе время суток, DM!
1. union для того и предназначен, чтобы несколько его членов разделяли одну и ту же область памяти. Соответственно, при изменении одного из них могут меняться и другие.
2. надо использовать class/struct, но при сохранении в бинарном формате могут быть проблемы с переносимостью (из-за выравнивания, разного размера типов и т.д.).
На предыдущий вопрос ответило несколько человек, видимо ответы еще не вышли в виде рассылки.
С уважением, Avl2k.


Ответ отправлен: 24.01.2003, 18:22
Отправитель: Avl2k


Отвечает lunao

Добрый день, DM!
1. Проверь еще раз размерности переменных в объекте, объединенных в union. Наиболее вероятно, что причина в этом.
2. В BCB есть класс TMemoryStream, а в нем функции SaveToFile и LoadFromFile.

Ответ отправлен: 24.01.2003, 22:35
Отправитель: lunao


Отвечает Yuri Gordienko

Здравствуйте, DM!
1.По первому вопросу.
Конечно они будут налезать, - ведь расположены по одному адресу. В объекте union всегда(почти всегда) используется только одна переменная.
2.По второму вопросу.
Практически невозможно хранить сложный объект последовательно в памяти.
Теоретически можно переопределить операторы new у всех членов объекта и самого объекта, забить кусок памяти и далее самостоятельно распределять память для своих объектов. Оно бы вроде и несложно, но только до той поры, пока данные объекта статичны, если-же они изменятся (например внутренний буфер под строку увеличится), то вся упорядоченность благополучно накроется.
Для хранения сложных объектов в каждом классе определяется функция(ции), которая знает все про все нужные данные данного класса и соответственно может их сохранять и загружать. Как пример, любой файл конфигурации и есть состояние определенных объектов программы, которые могут сохранять и восстанавливать необходимые для своей работы данные. Кстати, сохранение данных в текстовой файл - вполне приемлимый вариант для некритичных ко времени выполнения задач.



Ответ отправлен: 24.01.2003, 19:00
Отправитель: Yuri Gordienko


Отвечает vitya

Доброе время суток, DM!
Итак в union - е все данные начинаются с одного и того же адреа памяти, а именно
union UFuffel
{
int i;
char ch[4];
};
....
UFufel uF;
uF.i = 10;
//теперь, так как все поля с одного адреса - следовательно
uF.ch[0] -> первый байт числа
uF.ch[1] -> второй байт числа
uF.ch[2] -> третий байт числа
uF.ch[3] -> четвертый байт числа

Ответ отправлен: 27.01.2003, 08:20
Отправитель: vitya


Отвечает Ramzes

Добрый день, DM!
При объявлении union все переменные union-a находятся не в одной области памяти, а физически на одном и том же участке памяти, и поэтому при изменении одной переменной меняются значения осталъных. А данные твоего класса и так находятся в памяти друг за другом, если ты не исполъзуещъ никаких динамических переменных, массивив и.т.п.
А по поводу второго вопроса я отвечал, наверное соответствующая рассылка еще не вышла.

Ответ отправлен: 27.01.2003, 09:16
Отправитель: Ramzes



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

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
Assembler (39)
C / C++ (30)
Perl (7)
Delphi (17)
Pascal (23)
Basic / VBA (13)
Java / JavaScript (12)
PHP (9)
MySQL / MSSQL (8)
Пользователю
Windows 95/98/Me (38)
Windows NT/2000/XP (30)
"Железо" (35)
Поиск информации (20)
Администратору
Windows NT/2000/XP (12)
Linux / Unix (14)
Юристу
Гражданское право (10)
Семейное право (6)
Трудовое право (5)
КоАП (4)

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




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное