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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::Map, Как создать Map статически? 
:(
    Опции темы
bel_nikita
Дата 12.1.2004, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Как создать Map статически?
т.е. у меня есть
Код
typedef enum _EN{
 TEST_OK,
   TEST_ERR,
}EN;

typedef struct _Error{
 int Key;
 char *String;
}Error;

Error Data[]=
{
 {TEST_OK, "sdasdasdasds"},
 {TEST_ERR,"zxczxczxczxcczxcxcz"},
};


как это можно обернуть в std::Map?
чтобы по ключу отыскивалось нужное?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 12.1.2004, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Можно так:
Цитата
enum {
  TEST_OK,
  TEST_ERR
};

struct Error_t {
  int Key;
  char *String;
};

Error_t  g_theData[]=
{
{TEST_OK, "sdasdasdasds"},
{TEST_ERR,"zxczxczxczxcczxcxcz"},
};


////////////////////////////////////////////////////////////////////////////////////
// заворачиваем глобальные данные в std::map

typedef std::map<int,char*> MapIntToStr_t; // алиас для типа контейнера
MapIntToStr_t      g_theMap; // глобальная переменная-контейнер

// класс, единственное назначение которого - забить контейнер данными из g_theData
class some_global_object_t   
{
public:
    some_global_object_t()
    {
          for(int i=0; i<sizeof(g_theData)/sizeof(Error_t); i++)
              g_theMap.insert(MapIntToStr_t::value_type(
                    g_theData[i].Key,
                    g_theData[i].String));
    }
} g_some_global_object;


//////////////////////////////////////////////////////////////////////////
// пример, как найти по ключу

char *FindByKey(int iErrCode)
{
    MapIntToStr_t::iterator i = g_theMap.find(iErrCode);  // ищем
    if(i != g_theMap.end())  // если нашли...
          return (*i).second;  // ...то возвращаем значение
}

Сразу проинициализировать контейнер набором значений невозможно, т.к. такого конструктора в std::map (и в любом другом контейнере) просто не существует.



--------------------
user posted image
PM MAIL WWW   Вверх
bel_nikita
Дата 13.1.2004, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



mr.DUDA
в твоем примере есть функция char *FindByKey(int iErrCode); - которая ищет.
Я не понию смысла этой функции, точнее где и как ее применять.
Введь я так понимаю возможно:
Код
 printf("\ng_theMap[TEST_ERR]=%s",g_theMap[TEST_ERR]);
 printf("\ng_theMap[TEST_OK] =%s",g_theMap[TEST_OK]);
без функции.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 13.1.2004, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
Введь я так понимаю возможно:
Код
printf("\ng_theMap[TEST_ERR]=%s",g_theMap[TEST_ERR]);
printf("\ng_theMap[TEST_OK] =%s",g_theMap[TEST_OK]);


без функции.

Можно и так, но имхо квадратные скобки - не самое удачное решение, ведь в зависимости от того, как они используются - будет либо добавление элемента в карту, либо поиск (в сложных выражениях иногда трудно сказать, используется ли переменная как lvalue, или как rvalue). А если элемент не будет найден, что тогда будет возвращать g_theMap[1234] ? Правильно, что-то своё, в зависимости от реализации STL (например, NULL). А в моём примере достаточно добавить в конец функции FindByKey else return "Unknown error";.

Это сообщение отредактировал(а) mr.DUDA - 13.1.2004, 11:26


--------------------
user posted image
PM MAIL WWW   Вверх
bel_nikita
Дата 13.1.2004, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



mr.DUDA
Ясно. Спасибо.
Вот еще такой момент:
Код

enum {
 START_TEST,
 TEST_OK,
 TEST_ERR,
 END_TEST,
 TEST_DDD,
};

struct Error_t {
 int Key;
 char **ExstraString;   /// !!!!! Add
 char *String[5];  // !!!!!!! [0]->[5]
};

Error_t  g_theData[]=
{
 {TEST_DDD,NULL,"TEST_DDD","","","",""},
 {TEST_OK,NULL, "TEST_OK","","","",""},
 {TEST_ERR,NULL,"TEST_ERR","","","",""},
};


Если не трудно, как такое завернуть в Мар?



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 13.1.2004, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Проще простого: wink.gif
Цитата
enum {
  START_TEST,
  TEST_OK,
  TEST_ERR,
  END_TEST,
  TEST_DDD,
};

struct Error_t {
char **ExtraString;
char *String[5];

// конструктор
Error_t(char **aExtraString, char *aString1, char *aString2,
            char *aString3, char *aString4, char *aString5)
{ExtraString = aExtraString; String[0]=aString1; String[1]=aString2;
  String[2]=aString3; String[3]=aString4; String[4]=aString5; }
};

// макрос для простого добавления пары "ключ-значение" в глоб.массив
#define INIT_ELEM(A1,A2,A3,A4,A5,A6,A7) pair<int,Error_t>(A1,Error_t(A2,A3,A4,A5,A6,A7))

///////////////////////////////////////////////////////////////////////////////////////
// глобальные данные

pair<int,Error_t> g_theData[]=
{
    INIT_ELEM(TEST_DDD,NULL,"TEST_DDD","","","",""),
    INIT_ELEM(TEST_OK,NULL,"TEST_OK","","","",""),
    INIT_ELEM(TEST_ERR,NULL,"TEST_ERR","","","",""),
};


////////////////////////////////////////////////////////////////////////////////////
// заворачиваем глобальные данные в std::map

typedef std::map<int,Error_t> MapIntToErr_t; // алиас для типа контейнера
MapIntToErr_t      g_theMap; // глобальная переменная-контейнер

// класс, единственное назначение которого - забить контейнер данными из g_theData
class some_global_object_t   
{
public:
    some_global_object_t()
    {
          for(int i=0; i<sizeof(g_theData)/sizeof(Error_t); i++)
              g_theMap.insert(MapIntToErr_t::value_type(
                    g_theData[i].first,
                    g_theData[i].second));
    }
} g_some_global_object;

//////////////////////////////////////////////////////////////////////////
// пример, как найти по ключу

Error_t FindByKey(int iErrCode)
{
  Error_t errDefault(NULL,"UNKNOWN_ERROR","","","","");
  MapIntToErr_t::iterator i = g_theMap.find(iErrCode);  // ищем
  if(i != g_theMap.end())  // если нашли...
        return (*i).second;  // ...то возвращаем значение
  else
        return errDefault; // иначе возвращаем "Unknown error"
}



--------------------
user posted image
PM MAIL WWW   Вверх
bel_nikita
Дата 13.1.2004, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Код
undefined
mr.DUDA
что-то как-ко сложненько получается.
Я хотел переложить свой коддинг на STL, но вот что-то начинаю передумыватьsmile.gif
Я вот, тут тоже навалял кое-че, но как достать элементы с Мар? smile.gif
Код
enum {
 START_TEST,
 TEST_OK,
 TEST_ERR,
 END_TEST,
 TEST_DDD,
};

typedef struct _Strings{
 char *ExstraString;
 char *String[5];
} Strings;

struct Error_t {
 int Key;
 Strings String;
};

Error_t  g_theData[]=
{
 {TEST_DDD,NULL,"TEST_DDD" ,"","","",""},
 {TEST_OK, NULL,"TEST_OK"  ,"","","",""},
 {TEST_ERR,NULL,"TEST_ERR" ,"","","",""},
};

typedef std::map<int,Strings> MapIntToStr_t;
MapIntToStr_t      g_theMap;

class some_global_object_t    
{
public:
   some_global_object_t()
   {
         for(int i=0; i<sizeof(g_theData)/sizeof(Error_t); i++)
             g_theMap.insert(MapIntToStr_t::value_type(g_theData[i].Key,g_theData[i].String));
   }
} g_some_global_object;

/*char *FindByKey(int iErrCode)
{
   MapIntToStr_t::iterator i = g_theMap.find(iErrCode);  
   if(i != g_theMap.end())
         return (*i).second;
   else return NULL;
}*/



*.СРР

Код
 some_global_object_t MAPP;

 printf("\ng_theMap.size()=%d",g_theMap.size());
 printf("\ng_theMap[TEST_ERR]=%s",g_theMap[TEST_ERR] );
 printf("\ng_theMap[TEST_OK] =%s",g_theMap[TEST_OK]);
 printf("\ng_theMap[TEST_DDD]=%s",g_theMap[TEST_DDD]);

как достать не NULL(ExstraString), а "TEST_DDD" (String)?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 13.1.2004, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Что-то я ничего из твоего примера не понял smile.gif
К чему там вообще Error_t, и что ты хранишь в карте ?
Цитата
как достать не NULL(ExstraString), а "TEST_DDD" (String)?

g_theMap[TEST_ERR][0] - это первая строка из найденного Strings, и т.д.


--------------------
user posted image
PM MAIL WWW   Вверх
bel_nikita
Дата 13.1.2004, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



mr.DUDA
Вери сэнкс. Я уже более менее разобрался.
Тоже самое, что и у тебя, только чуть упрощено smile.gif

Цитата
К чему там вообще Error_t, и что ты хранишь в карте ?


Error_t - карта ошибок нейкого устройства. У этого устройства есть стандартные ошибки, например:
Код

Error_t  g_theData[]=
{
{ERR_DSP_TEST_OPTIC, NULL,"ERR68.0.24","Error test optic (McBSP0)","","","U1,U2,U19"},
};


Но эта ошибка не конкретизирует, что именно с оптикой. Произошла ошибка при передаче или приеме, или вообще нет синхронизации?
А так , при помощи char *ExstraString я конкретно сообщаю, что было передано столько-то пакетов, а принято столько-то. Т.е. при помощи char *ExstraString я могу дополнить комментарий к ошибке.
Но так же могу и ничего не трогать, что тоже хорошо. Т.е. оставить ошибку по деффаулту.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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