Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > map и WCHAR[]


Автор: qweasd 14.2.2008, 16:28
Я делаю вот так: 


Код

#include <map>

......
typedef pair <WCHAR[10], WCHAR[255]> WCHARPair;

....

map <WCHAR[10], WCHAR[255]> m_mapBrowsersW;

....

WCHAR p1[10]=L"qwe", p2[255]=L"sdf";
m_mapBrowsersW.insert(WCHARPair(p1,p2));

.....


Выдает такой вот еррор:

Код

1>c:\program files\microsoft visual studio 8\vc\include\utility(37) : error C2536: 'std::pair<_Ty1,_Ty2>::std::pair<_Ty1,_Ty2>::first' : cannot specify explicit initializer for arrays
1>        with
1>        [
1>            _Ty1=WCHAR [10],
1>            _Ty2=WCHAR [255]
1>        ]
1>        c:\program files\microsoft visual studio 8\vc\include\utility(53) : see declaration of 'std::pair<_Ty1,_Ty2>::first'
1>        with
1>        [
1>            _Ty1=WCHAR [10],
1>            _Ty2=WCHAR [255]
1>        ]
1>        c:\program files\microsoft visual studio 8\vc\include\utility(35) : while compiling class template member function 'std::pair<_Ty1,_Ty2>::pair(const _Ty1 (&),const _Ty2 (&))'
1>        with
1>        [
1>            _Ty1=WCHAR [10],
1>            _Ty2=WCHAR [255]
1>        ]
1>        e:\programming\wowqwestermfc\wowqwestermfcdlg.cpp(180) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
1>        with
1>        [
1>            _Ty1=WCHAR [10],
1>            _Ty2=WCHAR [255]
1>        ]
1>c:\program files\microsoft visual studio 8\vc\include\utility(37) : error C2536: 'std::pair<_Ty1,_Ty2>::std::pair<_Ty1,_Ty2>::second' : cannot specify explicit initializer for arrays
1>        with
1>        [
1>            _Ty1=WCHAR [10],
1>            _Ty2=WCHAR [255]
1>        ]
1>        c:\program files\microsoft visual studio 8\vc\include\utility(54) : see declaration of 'std::pair<_Ty1,_Ty2>::second'
1>        with
1>        [
1>            _Ty1=WCHAR [10],
1>            _Ty2=WCHAR [255]
1>        ]


как это исправить и заставить правильно работать???

Автор: Daevaorn 14.2.2008, 16:35
Если уже используете STL, то используйте до конца. Т.е. для строк std::wstring. Тогда не будет проблем с контейнерами.

Автор: qweasd 14.2.2008, 17:04
Это да!!! Так понятно, и тут никаких проблем не возникает!!!
Но хотелось бы заполнять WCHAR'ом.

Автор: Lazin 14.2.2008, 17:13
у массивов нет конструктора по умолчанию, вместо него используй указатели, или создай структуру содержащую массив и напиши для нее конструктор...
Цитата(qweasd @  14.2.2008,  17:04 Найти цитируемый пост)
Но хотелось бы заполнять WCHAR'ом. 

счастливой отладки))

Автор: qweasd 14.2.2008, 17:34
Мдаа. Это уж точно счастливой отладки)))
Лучше уж я потом буду вытягивать CString'и и переводить их в WCHAR.
Что скажете???


Автор: Alek86 14.2.2008, 17:57
Цитата(Lazin @  14.2.2008,  17:13 Найти цитируемый пост)
содержащую массив и напиши для нее конструктор...


вот уж велосипед... ничего не напоминает? ;)


и помойму со массивами чаров в шаблонах были проблемы из-за того, что у них внутренняя привязка, чтоли. и решались они весьма извращенными способами... так что лучше уж std::wstring

Добавлено через 2 минуты и 45 секунд
Цитата(qweasd @  14.2.2008,  17:34 Найти цитируемый пост)
Что скажете???

лучше всего пользоваться однородными инструментами

если пользуешь MFC, то у него и карты свои были, вроде (вектора точно)

Автор: qweasd 15.2.2008, 10:57
В конце концов решил сделать вот так:

Код

........

struct strWCHARPoints
{
    strWCHARPoints(WCHAR* in_p1, WCHAR* in_p2)
    {
        p1 = in_p1;
        p2 = in_p2;
    }
    WCHAR* p1;
    WCHAR* p2;
};

.........

    vector<strWCHARPoints> m_vBrowsers;

.........

        m_vBrowsers.push_back(strWCHARPoints(L"qwe",L"qwe"));

........



Автор: Daevaorn 15.2.2008, 11:14
Цитата(qweasd @  15.2.2008,  11:57 Найти цитируемый пост)
В конце концов решил сделать вот так:

Свечку в церкви поставить не забудь;)

Автор: Alek86 15.2.2008, 11:23
qweasd, ужос, чесно слово

пока не поздно. поменяй на wstring
не поменяешь - сам потом материться буш (на себя)

Автор: qweasd 15.2.2008, 11:29
а чё? Вроде все норм работет!

Автор: Alek86 15.2.2008, 11:38
тогда закрывай тему
поживешь-увидишь

Автор: qweasd 15.2.2008, 11:52
Хороший ответ! А главное содержательный  smile 
Я так понимаю вы намекаете на утечку памяти?

Автор: qweasd 15.2.2008, 12:13
Ну допустим тут я могу использовать стандартные классы!
А как тогда быть если нужно создавать вектор или мап своими руками написаных класов???

Автор: Mayk 15.2.2008, 12:33
Цитата(qweasd @  15.2.2008,  15:29 Найти цитируемый пост)
а чё? Вроде все норм работет!

при попытке перезаписи может не хорошо кончится. 
пример раз.
Цитата

        m_vBrowsers.push_back(strWCHARPoints(L"qwe",L"qwe"));
        m_vBrowsers.back().p2[1]='W';

и вот тут возможны варианты:
1) m_vBrowsers.back().p1[1] == 'W'
в том случае если компилятор захотел и склеил две L"qwe" в одну, дабы не занимать память. [ не йа придумал http://elias.rhi.hi.is/gcc/gcc_13.html] и положил их в область памяти, доступную для записи
2) SIGSEGV, если положил в область памяти куда записывать низзя
3) ожидаемое p1[1] == 'w', p2[1]  == 'W'.

пример два
Цитата

void foo(){
      wchar_t text[]=L"hello";
      m_vBrowsers.push_back(strWCHARPoints(L"e",text));
      return ;
}

foo завершается, локальный массив рушится к чертям. что в m_vBrowsers --- нипаняятна (с) но ой как навряд ли то что нам нужно

Пример три
Код

wchar_t arr[4];
m_vBrowsers.push_back(strWCHARPoints(L"e",arr));
wchar_t* x = m_vBrowsers.back().p2;
x[9]  = 0;  

ой! какой-то умник положил массив на 4 wchar'а, а обращается к [9]-ому.  и мы черт-а с два узнаем что к [9]-ому  обращаццо низзя
sigsegv здесь лучший вариант.

все эти три обходятся std::wstring'ом.

Автор: qweasd 15.2.2008, 12:45
Большое спасибо! smile 
Буду набиратся опыта smile 

Автор: Alek86 15.2.2008, 13:53
Mayk, насчет примера 2 - не уверен.
почему это строчки будут удаляться после выхода из блока?

ЗЫ. не очень хорошо в этом разбираюсь, так что, если нетрудно, ссылкой со стандарта или статьей (еслит отвечать кто-то будет вообще smile )

Автор: Daevaorn 15.2.2008, 13:58
Цитата(Alek86 @  15.2.2008,  14:53 Найти цитируемый пост)
Mayk, насчет примера 2 - не уверен.
почему это строчки будут удаляться после выхода из блока?

Не строки, а массив. Он то на стеке

Автор: Alek86 15.2.2008, 14:07
Daevaorn, но указатель будет показывать на строку?

или 
Код
wchar_t text[]=L"hello";

может копировать строку?

Автор: Daevaorn 15.2.2008, 14:09
Это не указатель, а массив. Массив инициализуется строкой, т.е. она в него копируется.

Автор: Alek86 15.2.2008, 14:09
а, хотя понял
ведь массив менять можно, значит будет копировать

Добавлено через 38 секунд
кстати, а вот так?
Код
const wchar_t text[]=L"hello";

Автор: Fazil6 15.2.2008, 14:13
Цитата(Alek86 @  15.2.2008,  13:09 Найти цитируемый пост)
кстати, а вот так?

что так?

определение 
Код

char m[] = "11111";


всегда копирование в массив и от константности ничего не зависит

Автор: Daevaorn 15.2.2008, 14:13
Цитата(Alek86 @  15.2.2008,  15:09 Найти цитируемый пост)
кстати, а вот так?

Что вот так? Это ничего не изменит

Автор: Alek86 15.2.2008, 14:13
верю

странно, правда. почему бы не сэкономить память?

Автор: qweasd 18.2.2008, 10:57
Дабы не множить посты задам вопрос тут(на туже тему):

Например мне надо заполнять,а потом считывать, изменять список элементов. Элементом является структура состоящая из поля типа строки, 2х полей int, и  одного поля bool. Вопрос в чем все это дело хранить??? vector?? B как описать даную структуру??? Создавать клас?
Каким требованиям должна отвечать структура(клас)?

Автор: Alek86 18.2.2008, 11:27
Цитата(qweasd @  18.2.2008,  10:57 Найти цитируемый пост)
список элементов. Элементом является структура

помойму ты сам ответил на свой вопрос - вектор структур (лучше классов)


Цитата(qweasd @  18.2.2008,  10:57 Найти цитируемый пост)
Каким требованиям должна отвечать структура(клас)?

как обычно - требованиям ООП

Автор: Lazin 18.2.2008, 11:36
Зависит от того как потом такой список будет использоваться.
Вектор не подойдет если:
- часто добавляются и удаляются элементы, в этом случае возможны частые перераспределения памяти.
- где-то хранятся итераторы на элементы в списке, после добавления элемента в вектор, в приличных домах, принято считать все итераторы недействительными.  smile 

Цитата(qweasd @  18.2.2008,  10:57 Найти цитируемый пост)
Каким требованиям должна отвечать структура(клас)?

она должна иметь конструктор по умолчанию и конструктор копирования

Автор: qweasd 18.2.2008, 11:46
А что подойдет?

Автор: Alek86 18.2.2008, 12:09
std::list

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)