Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost::archive::binary_oarchive, VS2005, runtime error при вызове конструктора 
:(
    Опции темы
DukeCpp
Дата 5.12.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.2.2006
Где: St.Petersburg

Репутация: нет
Всего: 1



Здравствуйте, винградовцы -- 

Столкнулся с трудностью переноса сериализации с помощью буста в студию 2005. Возьмём отдельный примерчик (из доки по бусту).

в 2003 работает такая конфигурация:
1. Console Application, 
В свойствах проекта:
runtime type info: yes
Code Generation: Mtd,
Linker->Command Line: libboost_serialization-vc71-mt-sgd-1_32.lib

В main.cpp код программы (пример из Доки по бусту, serialization::tutorial; измененён только тип архива: вместо текстового -- бинарный.)
Код

#include <fstream>

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>

/////////////////////////////////////////////////////////////
// gps coordinate
//
// illustrates serialization for a simple type
//

class Point
{
private:
    friend class boost::serialization::access;
    // When the class Archive corresponds to an output archive, the
    // & operator is defined similar to <<.  Likewise, when the class Archive
    // is a type of input archive the & operator is defined similar to >>.
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & x;
        ar & y;
    }

    int x, y;
public:
    Point(){}
    Point(int x_, int y_): x(x_), y(y_){}
};

class gps_position
{
private:
    friend class boost::serialization::access;
    // When the class Archive corresponds to an output archive, the
    // & operator is defined similar to <<.  Likewise, when the class Archive
    // is a type of input archive the & operator is defined similar to >>.
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & degrees;
        ar & minutes;
        ar & seconds;
        ar & pnt;
    }
    int degrees;
    int minutes;
    float seconds;
    Point pnt;
public:
    gps_position(){};
    gps_position(int d, int m, float s, int x, int y) :
        degrees(d), minutes(m), seconds(s), pnt(x, y)
    {}
};


int main()
{
    // create and open a character archive for output
    std::ofstream ofs("filename", std::ios::binary);
    boost::archive::binary_oarchive oa(ofs);

    // create class instance
    const gps_position g(35, 59, 24.567f, 125, 351);
    // write class instance to archive
    oa << g;
    // close archive
    ofs.close();

    // ... some time later restore the class instance to its orginal state
    // create and open an archive for input
    std::ifstream ifs("filename", std::ios::binary);
    boost::archive::binary_iarchive ia(ifs);
    // read class state from archive
    gps_position newg;
    ia >> newg;
    // close archive
    ifs.close();
    return 0;
}


Компилируется, линкуется, работает ожидаемым образом.

Пытаюсь делать аналогичный проект в VS2005:

1. Console Application
 В свойствах проекта
2. В свойствах проекта:
runtime type info: yes
Code Generation: Multi-threaded Debug DLL (/MDd),
Linker->Command Line: libboost_serialization-vc80-mt-1_32.lib

текст программы тот же.
Компилируетс, линкуется, запускается. При попытке создания архива 

Код

    boost::archive::binary_oarchive oa(ofs);


происходит Debug Error (скриншот приведён).

Если нажать Retry, выбрасывает на строки кода из файла crt0msg.c:

Код

            if (rterrnum != _RT_CRNL && rterrnum != _RT_BANNER && rterrnum != _RT_CRT_NOTINIT)
            {
                if (1 == _CrtDbgReport(_CRT_ERROR, NULL, 0, NULL, rterrs[tblindx].rterrtxt))
                    _CrtDbgBreak();
            }



Если вместо бинарного использовать текстовые потоки, то 
в строке
Код

    boost::archive::text_iarchive ia(ifs);


выбрасывает 

Unhandled exception at 0x7c81eb33 in BoosteSerialization.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012ebac..
и 
на файл new.cpp и строки:

Код

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }

        return (p);
        }

Заранее благодарю за содействие.

Это сообщение отредактировал(а) DukeCpp - 5.12.2006, 23:06

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  DebugError.PNG 9,26 Kb
PM   Вверх
Любитель
Дата 7.12.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Сейчас нет возможности проверить - посмотри по Call Stack-у - на какой твоей строке вылетает. Будем разбираться...


--------------------
PM MAIL ICQ Skype   Вверх
zabivator
Дата 10.12.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



DukeCpp, если я ничегоне попутал, вы забыли буст собрать под 2005 =) А линкуете либу с 2003. Понятное, оно может даже не линковаться, ну даже елси слинковалась - вылетать в самых неожиданных местах.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Любитель
Дата 11.12.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



zabivator, 
Цитата(DukeCpp @  5.12.2006,  21:39 Найти цитируемый пост)
libboost_serialization-vc80-mt-1_32.lib




--------------------
PM MAIL ICQ Skype   Вверх
zabivator
Дата 11.12.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



по-моему либо рядом чего-то не хватает, либо неправильно компилятор крутили, чот не то натыкали в найстройках.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
DukeCpp
Дата 12.12.2006, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.2.2006
Где: St.Petersburg

Репутация: нет
Всего: 1



Спасибо за ваши комментарии.

неправильно было здесь

Code Generation: Multi-threaded Debug DLL (/MDd),
Linker->Command Line: libboost_serialization-vc80-mt-1_32.lib

нужна либа libboost_serialization-vc80-mt-gd-1_32.lib
при указанном Code Generation
 
Но, вообще говоря, есть возможность сделать так, чтобы не указывать эти либы вообщеи будут срабатывать директивы “#pragma comment(lib, ...)”, но как сделать это я пока не знаю. Если кто сталкивался, скажите, плз.

Хотя. Наверное, стоит этот топик пометить, как решённый, а вопрос перенсти в новый... модераторы? 

Это сообщение отредактировал(а) DukeCpp - 12.12.2006, 09:54
PM   Вверх
Любитель
Дата 12.12.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



В препроцессор-дефинешенах надо добавить какой-то макрос - смотри доки (буду дома - сам посмотрю)


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4906 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.