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