Форум программистов, компьютерный форум CyberForum.ru

Запись и извлечение данных в несколько запусков программы - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Неточность в понимании условия задачи "Жук" (acmp) http://www.cyberforum.ru/cpp-beginners/thread930617.html
Жук (Время: 1 сек. Память: 16 Мб Сложность: 30%) Петя нашел в Интернете по адресу http://buglab.ru игру-головоломку "Жук", в которой от участников требуется построить для жука лабиринт таким образом, чтобы жук как можно дольше искал выход. Жук всегда начинает свое движение с левого верхнего угла, а выход всегда находится в правом нижнем. Жук движется не оптимально, а следующим образом:...
C++ Логика switch Программа должна расчитывать количество проданного товара, суть проблемы, кода вместо численных значений в вариантах case я использую буквенные значения названий товара, то все идет по логике программы, когда я использую проверку с целыми значениями у меня работает случай default разьясните мне пожалуйста в чем проблема? #include<iostream> using namespace std; int main() { int count =... http://www.cyberforum.ru/cpp-beginners/thread930602.html
Мини-брутфорс C++
Задан паттерн XXyyX, где Х может принимать следующие значения: D,J,K,L,L,X,Z, а Y - f,n,s. Необходимо найти все возможные комбинации, при этом символы не должны повторяться, кроме L, так как он встречается два раза. Одна из этих комбинаций валидна и ссылка вида http://www.steamgifts.com/giveaway/+Валидная_комбинация должна привести на существующую страницу, если комбинация невалидна, то...
Структуры. Объединения. Битовые поля C++
Помогите с двумя простенькими программами. Требования: - не использовать шаблоны; - интерфейс должен разработан для неопытного пользователя; - размерность массива - неопределенная; - не использовать списки; - для реализации массива произвольного размера использовать функции прямого доступа и кучи (memcpy, memmove, malloc, resize и др.)
C++ Си: Выдать слова текста и их длины, Сформировать новую строку по правилу http://www.cyberforum.ru/cpp-beginners/thread930563.html
Задание: Задан некоторый текст, состоящий из слов. Словом считать последовательность символов, не содержащую пробел или другие знаки препинания. Предложения заканчиваются точкой. Длина текста не больше 200 символов, могут быть использованы любые символы. Задание для выполнения: 1) Считать текст из файла; 2) Выдать слова текста и их длины; 3) Сформировать новую строку из слов, состоящих...
C++ Вместо результата выводит непонятное число Сделал программу которая должна высчитывать по формуле, но она высчитывает не совсем то число. int chislo = Convert::ToInt32(textBox2->Text); int *chisla = new int; int lolx = Convert::ToInt32(textBox1->Text); int rezultat; int rexa; for(int i = lolx; i < chislo; i++) { chisla += (Convert::ToInt32(textBox1->Text)+i)*4; rezultat += chisla; подробнее

Показать сообщение отдельно
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
30.07.2013, 02:54  [ТС]     Запись и извлечение данных в несколько запусков программы
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня код работает.
Оно должно работать, может не понятно описал:
Во время 1-го запуска: добавляем данные о сотрудниках(сохраняются в хипе), можем для проверки вывести данные на экран, далее записываем их в файл и закрываем программу;
Во время 2-го запуска: извлекаем данные из файла и пытаемся вывести их на экран и в этот момент происходит ошибка

Добавлено через 6 минут
Цитата Сообщение от Fyret Посмотреть сообщение
В приведенном коде имеем дело с полиморфными классами, а представление объектов таких классов в памяти начинается с указателя на таблицу виртуальных функций.

Соответственно, когда экземпляр класса сериализуется в файл, туда записывается и этот указатель (строка 159). А когда идет десериализация объектов при другом запуске (это важно), уже созданные (строки 185, 189, 193) объекты (т.е. у них есть свои указатели на таблицу виртуальных функций) полностью перезаписываются. И вместо валидных указателей получают бессмыслицу. Что делает невозможным в данном случае RTTI и приводит к крашу при вызове typeid.

Небольшой хак в функции employee::read() лечит это поведение:
C++
1
2
3
4
        //inf.read((char*)arrap[n], size);
        long long tmp;
        inf.read( reinterpret_cast<char*>(&tmp), sizeof(void*) );
        inf.read( reinterpret_cast<char*>(arrap[n])+sizeof(void*), size-sizeof(void*));
Кстати, в линуксе оригинальная программа при повторном запуске ведет себя корректно, а после пересборки - падает, как в винде. Уверен, это связано с разными подходами к управлению памятью в этих системах. Линукс при втором запуске умудряется выделять процессу ту же память, что и при первом.
Уже поздно, буду тупить при попытке понять смысл хака +sizeof(void*) -sizeof(void*), утром проверю его) Просьба написать еще ссылку на источник где подробней описана суть данного метода. Стоит Windows 7, Visual Studio 2012
 
Текущее время: 05:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru