|
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
|
||||||
Запись и извлечение данных в несколько запусков программы29.07.2013, 22:41. Показов 3021. Ответов 22
Метки нет (Все метки)
Всем добрый вечер! Предоставляю исходник программы EMPL_IO стр.574 с книги Лаффорте ООП в С++.
Пытаясь улучшить программу наткнулся на ошибку возникающую при попытке вывести данные на экран после прочтения их из файла. Суть в том что при 1 запуске я записал эти данные, а при 2-м повторном запуске хочу их извлечь и вывести на экран. Компилятор указывает на строку switch(arrap[j]->get_type()) в методе employee::display(); В пределах одного запуска работает и запись и извлечение данных с последующим выводом их на экран. Помогите пожалуйста понять!
0
|
||||||
| 29.07.2013, 22:41 | |
|
Ответы с готовыми решениями:
22
Узнать количество запусков программы |
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|||
| 29.07.2013, 23:51 | |||
|
Добавлено через 7 минут Какое сообщение выводится? Или что пишется?
0
|
|||
|
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
|
|
| 30.07.2013, 00:09 [ТС] | |
|
При 1 -м запуске:
добавляю 3 рабочих, потом r- записываю в файл При 2 - м запуске: w- извлекаю данные из файла и при попытке вывести их на экран d- выбивает ошибку(Необработанное исключение по адресу 0x00828333 в Stream4.1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00193F94.) указывает на строку switch(arrap[j]->get_type()); в методе display - Внизу окно под кодом помимо полей данных класса содержит _vfptr 0x00193f8c {???, ???, ???} void * * и по нему написано что чтение памяти невозможно
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 30.07.2013, 00:20 | |
|
0
|
|
|
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
|
||
| 30.07.2013, 00:41 [ТС] | ||
|
Добавлено через 8 минут для удобства я выложил на форум оригинальный код с примера в книги, ошибок в коде быть не может. Хочется понять чем обусловлена выше изложенная проблема
0
|
||
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 30.07.2013, 01:59 | |
|
0
|
|
|
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
|
||||||
| 30.07.2013, 02:47 | ||||||
|
В приведенном коде имеем дело с полиморфными классами, а представление объектов таких классов в памяти начинается с указателя на таблицу виртуальных функций.
Соответственно, когда экземпляр класса сериализуется в файл, туда записывается и этот указатель (строка 159). А когда идет десериализация объектов при другом запуске (это важно), уже созданные (строки 185, 189, 193) объекты (т.е. у них есть свои указатели на таблицу виртуальных функций) полностью перезаписываются. И вместо валидных указателей получают бессмыслицу. Что делает невозможным в данном случае RTTI и приводит к крашу при вызове typeid. Небольшой хак в функции employee::read() лечит это поведение:
0
|
||||||
|
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
|
|||
| 30.07.2013, 02:54 [ТС] | |||
|
Во время 1-го запуска: добавляем данные о сотрудниках(сохраняются в хипе), можем для проверки вывести данные на экран, далее записываем их в файл и закрываем программу; Во время 2-го запуска: извлекаем данные из файла и пытаемся вывести их на экран и в этот момент происходит ошибка Добавлено через 6 минут
0
|
|||
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 30.07.2013, 02:56 | |
|
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 30.07.2013, 03:08 | |
|
Вот файл с записью трёх рабочих, на скрине результат работы, при повторном запуске. Ошибок нет.
0
|
|
|
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
|
|
| 30.07.2013, 03:19 [ТС] | |
|
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||
| 30.07.2013, 03:58 | ||
|
Есть некая кривизна в коде. Получается так, что если файл создать в Debug, а при втором запуске открывать в Release, то ошибка, и наоборот. Если создавать в Debug и отрывать дальше в Debug, то ошибки нет (тоже и для Release).
Добавлено через 31 секунду Добавлено через 11 минут Скорее всего, причина в том, о чём пишет Fyret. Чтение/запись памяти под такими объектами - не лучшая идея.
1
|
||
|
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
|
||
| 30.07.2013, 11:55 | ||
|
0
|
||
|
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
|
|||||||||
| 30.07.2013, 13:00 [ТС] | |||||||||
Добавлено через 3 минуты
0
|
|||||||||
|
71 / 71 / 13
Регистрация: 13.05.2012
Сообщений: 130
|
|
| 30.07.2013, 13:01 | |
|
0
|
|
|
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
|
|||||||||
| 30.07.2013, 13:12 | |||||||||
Добавлено через 5 минут И, отдельно, всем, у кого работает оригинальная код, - просто повезло. Он не должен работать.
2
|
|||||||||
|
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
|
|||||||||||||||||
| 30.07.2013, 13:44 [ТС] | |||||||||||||||||
Далее
(char*)arrap[n]+sizeof(void*) Здесь мы сдвигаем указатель для того что бы потом в методе employee::display не биться головой о стену при попытке выполнить команды обращения по этому адресу
0
|
|||||||||||||||||
|
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
|
|||
| 30.07.2013, 14:06 | |||
|
0
|
|||
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|||
| 30.07.2013, 16:41 | |||
|
ArkTaS, обратите внимание на это:
Добавлено через 5 минут Добавлено через 9 минут Вот тут почитайте на эту тему: Запись и чтение объектов разных классов в один файл
1
|
|||
|
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
|
|
| 30.07.2013, 18:24 [ТС] | |
|
0
|
|
| 30.07.2013, 18:24 | |
|
Помогаю со студенческими работами здесь
20
Сохранение массива для последующих запусков программы
Запись/извлечение данных во/из Flash Извлечение данных из таблицы sqlite и запись в новосозданный файл XML JAVA Несколько запусков Дейкстры или всё же Флойд? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|