Re: С++: метаданные своими руками
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 22.04.04 16:13
Оценка:
Здравствуйте, Андрей Мартынов, Вы писали:

АМ>В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.


а чего надо подкрутить, чтоб можно было с полями типа CString работать, типа так:

struct Clr
{
  CString str;

  struct LayoutDefault : public Layout<Clr>
  {
    LayoutDefault()
    {  //        тег         поле        значение по умолчанию
      Simple(_T("STRING"  ), &Clr::str, "default string");
    }
  };
};
Re[2]: С++: метаданные своими руками
От: Andis  
Дата: 09.03.05 05:55
Оценка:
А как решается вопрос с наследованием структур?

например:


struct a
{
   int i;
   int j;
   struct LayoutDefault : public Layout<Clr>
   {
    LayoutDefault()
    {  //        тег         поле        значение по умолчанию
      Simple(_T("VarI"  ), &a::i, 10);
      Simple(_T("VarJ"  ), &a::j, 10);
    }
  };

}

struct b : public a
{
   int x;
   int y;

  ????????????????

}
Re: Утечки памяти
От: Macedonian Россия  
Дата: 19.05.05 03:31
Оценка:
При сборке обнаружились утечки памяти в нескольких местах, кто-нибудь это уже исправлял?
Re[2]: Утечки памяти
От: CiViLiS Россия  
Дата: 21.05.05 06:10
Оценка:
Здравствуйте, Macedonian, Вы писали:

M>При сборке обнаружились утечки памяти в нескольких местах, кто-нибудь это уже исправлял?

Я много чего уже исправил в этом коде, правда утечек не помню. Так что пример кода вызывающий утечку в студию, а там посмотрим.

Последний баг который я нашел, это проблема с ексепшенами:
struct Exception : public std::exception
{
    Exception(const tstring& a_msg) : msg(a_msg) {}
    const char *what() const
        { return CT2A(msg.c_str());    } // what вернет указатель на временный объект, который уже будет удален к моменту выхода из функции
protected:
    const tstring& msg;
};



Фиксил так:
struct Exception : public std::runtime_error
{
    Exception(const tstring& a_msg) 
        : std::runtime_error(std::string(CT2A(a_msg.c_str())))
{}


ЗЫ Могу поделиться всеми своими фиксами, но только в понедельник.
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[3]: Утечки памяти
От: Macedonian Россия  
Дата: 31.05.05 14:49
Оценка:
Здравствуйте, CiViLiS, Вы писали:

M>>При сборке обнаружились утечки памяти в нескольких местах, кто-нибудь это уже исправлял?

CVL>Я много чего уже исправил в этом коде, правда утечек не помню. Так что пример кода вызывающий утечку в студию, а там посмотрим.

Извини, что долго не отвечал, сессия )-:
Утечку вызывает код парсинга Xml, помещенный в MFC DLL, причем в консольном приложении тот же код не вызывает у компилятора подозрений в утечке
Собственно, код:
// XmlParserDll.h
//

#include <map>
#include <string>
#include <tchar.h>

#ifdef _UNICODE
    typedef wchar_t             tchar;
    typedef std::wstring        tstring;
    #define tcout               std::wcout
#else
    typedef char                tchar;
    typedef std::string         tstring;
    #define tcout               std::cout
#endif

#define Dll __declspec(dllexport)

class Dll XmlConf
{
public:
    typedef std::map<tstring, tstring> Values;

    XmlConf(const tstring& path);

    char *GetValue(const char *key, const char *def = "");

protected:
    Values m_values;
};

// XmlParserDll.cpp
//

#include "stdafx.h"
#include "XmlParserDll.h"

#include "SerializerXml.h"
#include "SerializerRegistry.h"

using namespace std;
using namespace Rsdn;
using namespace Serializer;
using namespace Tree;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

struct Pair
{
    tstring key, value;

    struct LayoutDefault : public Layout<Pair>
    {
        LayoutDefault()
        {
            AttributeM(_T("key"  ), &Pair::key  );
            AttributeM(_T("value"), &Pair::value);
        }
    };
};

struct File
{
    typedef std::vector<Pair> Pairs;
    std::vector<Pair> pairs;

    struct LayoutDefault : public Layout<File>
    {
        LayoutDefault()
        {
            Array(_T("appSettings" ), &File::pairs, _T("add" ));
        }
    };
};

struct AppSettings
{
    typedef std::map<tstring, tstring> Values;

    AppSettings(){}
    AppSettings(const tstring& path)
    {
        ::CoInitialize(NULL);
        Load(path);
        ::CoUninitialize();
    }

    void Load(const tstring& path)
    {
        File file;
        Xml::Load(path, _T("configuration"), &file);
        for_each(file.pairs.begin(), file.pairs.end()
            , std::bind1st(std::mem_fun1<void, AppSettings, Pair>(Add)
                , this));
    }

    tstring GetValue(const tstring& key, const tstring& def = _T("")) const
    {
        Values::const_iterator iter = m_values.find(key);
        return iter == m_values.end() ? def : iter->second;
    }

    void Add(Pair pair)
    {
        m_values.insert(Values::value_type(pair.key, pair.value));
    }

    Values GetValues()
    {
        return m_values;
    }

protected:
    Values m_values;
};

char *SysStrDup(const char *pszString)
{
    int iStrLength = strlen(pszString);

    char *pszBuffer = (char *) malloc(iStrLength + 1);

    if (pszBuffer != NULL)
        strcpy(pszBuffer, pszString);

    return (pszBuffer);
}

XmlConf::XmlConf(const tstring& path)
{
    AppSettings conf(path);
    m_values = conf.GetValues();
}

char *XmlConf::GetValue(const char *key, const char *def)
{
    Values::const_iterator iter = m_values.find(key);
    return iter == m_values.end() ? (def != NULL ? SysStrDup(def) : NULL) : SysStrDup(iter->second.c_str());
}


CVL>ЗЫ Могу поделиться всеми своими фиксами, но только в понедельник.

Было бы очень кстати
Re[4]: Утечки памяти
От: CiViLiS Россия  
Дата: 01.06.05 12:49
Оценка:
Здравствуйте, Macedonian, Вы писали:

M>Здравствуйте, CiViLiS, Вы писали:


M>>>При сборке обнаружились утечки памяти в нескольких местах, кто-нибудь это уже исправлял?

CVL>>Я много чего уже исправил в этом коде, правда утечек не помню. Так что пример кода вызывающий утечку в студию, а там посмотрим.

M>Извини, что долго не отвечал, сессия )-:

А я уже как год забыл про это страшное слово

M>Утечку вызывает код парсинга Xml, помещенный в MFC DLL, причем в консольном приложении тот же код не вызывает у компилятора подозрений в утечке

К сожалению у меня сейчас времени нет посмотреть твой код -- на работе мелкий перезд, в результате два дня потеряны, и их надо отрабатывать Время появится только в выходные.

Если не работает код который в ДЛЛ, то распространенная проблема, это неправильные (не индентичные) ключи у компилятора/линкера для екзешника и для ДЛЛ. Если про эту проблему не знаешь, то можешь поискать на форуме --- подключение разных CRT часто встречается.

CVL>>ЗЫ Могу поделиться всеми своими фиксами, но только в понедельник.

M>Было бы очень кстати
здесь. Я немного изменил работу со строками, добавил поддержку const_string'ов и ввел новый инт, чтобы была возможность серелизовать в хексе. Исправил работу с enum и еще что-то по мелочи... Подробности не помню -- давно уже правил...
... << RSDN@Home 1.1.4 beta 7 rev. 458>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[2]: С++: метаданные своими руками
От: cpp_best  
Дата: 18.02.06 20:14
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, Андрей Мартынов, Вы писали:


АМ>>В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных – метаданных типов.


OE>а чего надо подкрутить, чтоб можно было с полями типа CString работать, типа так:


OE>
OE>struct Clr
OE>{
OE>  CString str;

OE>  struct LayoutDefault : public Layout<Clr>
OE>  {
OE>    LayoutDefault()
OE>    {  //        тег         поле        значение по умолчанию
OE>      Simple(_T("STRING"  ), &Clr::str, "default string");
OE>    }
OE>  };
OE>};
OE>


Внимательно читаем статью к библиотеке, или читаем ошибку при смене типа переменной на CString и получаем:
в файле SerizlizerPrim.h в пространстве имен Rsdn::Serializer::Primitives добавляем шаблон для нужного типа.
Но по-моему тех, что реализованы в библиотеке достаточно. Для строк можно использовать tstring (это typedef на std::wstring), который оперирует 2х байтовыми символами. В значении по умолчанию пишем что-то вроде этого:
std::wstring(L"Microsoft")

С уважением, cpp_best.
P.S. Сам мучился с этим, и как всегда сработала извечная истина: находишь решение в ... (блин, уже спать пора)
Re: как сериализовать контейнер контейнеров контейнеров.
От: WareZzhKa  
Дата: 10.08.06 12:24
Оценка:
Как сериализовать контейнер контейнеров контейнеров...?
Например, вот с этим — std::vector<std::vector<int> > m_v; // всё ок

а вот этот std::vector<std::vector< std::vector<int> > > m_v; //- уже не компилиться
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.