Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > vector с Unicode


Автор: wallstreet 6.12.2011, 11:14
Всем доброго дня.
Принимаю данные Unicode в массив, потом пытаюсь добавить в вектор, но если объявить массив как WCHAR и тип данных вектора как WCHAR, то происходит ошибка С2664 (Error    2    error C2664: 'void std::vector<_Ty>::push_back(_Ty &&)' : cannot convert parameter 1 from 'WCHAR [200]' to 'WCHAR &&'    c:\users\a.gursky\documents\visual studio 2010\projects\ddeserver\ddeserver\ddemlfn.cpp    165)

Код

std::ifstream in;                                          // in file
std::ofstream out;                                      // out file
WCHAR  szDDEData[200];                          // Буфер для приема данных
std::vector<WCHAR> v;                             // vector
std::vector<WCHAR>::iterator it;               // iterator

// часть кода с ошибкой
if(szDDEData != NULL)
     {
                v.push_back(szDDEData);         // в этой строке ошибка С2664
    out.open(name);
    for(it=v.begin(); it!=v.end(); ++it)
    out << *it << '\n';
    out.close();
                
            return 0
      }


Подскажите как можно исправить ошибку?

Автор: bsa 6.12.2011, 11:42
wallstreet, в строке 8 у тебя происходит проверка, которая всегда верна. Так как массив ВСЕГДА не равен NULL.
А в строке 10 ты пытаешь добавить к вектору не один элемент, а целый массив. Естественно, что push_back такому не обучен. Воспользуйся vector::insert - он умеет работать с итераторами и указателями (читай массивами).

Автор: wallstreet 6.12.2011, 12:24
Вот так вот работает

Код

 if(szDDEData)
          {
              for(int i=0; i<200; ++i)
              {
                v.push_back(szDDEData[i]);
              }
            out.open(name);
              
            for(it=v.begin(); it!=v.end(); ++it)
                out << *it << '\n';
            out.close();
            // Признак успешного завершения транзакции
            return 0
          }

Автор: bsa 6.12.2011, 12:33
wallstreet, в первой строчке нового кода условие всегда истинно. Оно не отличается от предыдущего варианта. Думаю, тебе стоит хорошенько подумать о том, зачем условие вообще нужно.

Автор: wallstreet 6.12.2011, 13:15
Да, конечно. 
Кстати не могу найти функцию определяющую размерность массива. Т.е. что-то вроде strlen() для строк.
Есть ли такая?

Автор: bsa 6.12.2011, 13:36
проблема не в массиве, а в его типе. для юникодовых строк следует использовать wcslen.

Автор: Andrey44 6.12.2011, 15:35
Цитата(wallstreet @  6.12.2011,  13:15 Найти цитируемый пост)
Кстати не могу найти функцию определяющую размерность массива.

Код

int data[100];
_countoff(data);


Автор: volatile 7.12.2011, 00:03
Цитата(wallstreet @  6.12.2011,  11:14 Найти цитируемый пост)
out << *it << '\n';

Здесь он будет шорты в десятичном виде записывать в файл.



Автор: wallstreet 7.12.2011, 15:21
Цитата

Здесь он будет шорты в десятичном виде записывать в файл.


Что такое шорты?))

Автор: bsa 7.12.2011, 15:32
short int

Автор: wallstreet 8.12.2011, 18:22
что бы выводилась дата в 16 ричном виде правильным ли будет такой вариант?

Код

out << dec << *it << '\n';

Автор: bsa 8.12.2011, 20:21
wallstreet, тебе религия документацию читать запрещает?  smile 

Автор: wallstreet 8.12.2011, 23:31
Вот блин ошибся, перепутал все на свете. ХОтел вот так вот вывести:

Код

out << hex << *it << '\n';


Но вопрос в скорее в другом. Правильно ли вобоще использовать данные модификаторы вывода чисел?
Или есть более универсальные функции?

Автор: bsa 8.12.2011, 23:39
правильно. Вот только я бы тебе рекомендовал явно преобразовать *it в целочисленный тип. А то однажды может получиться, что будут выводиться символы вместо их кодов.

Автор: volatile 9.12.2011, 00:05
Цитата(wallstreet @  8.12.2011,  23:31 Найти цитируемый пост)
out << hex << *it << '\n';

Ну выведет теперь в шест.-ном виде.
Например вместо юникодной буквы 'Ж', в файл уйдет: "42F" и перевод строки следом, вы этого хотите ?

Цитата(bsa @  8.12.2011,  23:39 Найти цитируемый пост)
А то однажды может получиться, что будут выводиться символы вместо их кодов. 

bsa, мне кажется, (телепатирую) что автор именно это и хочет.
то есть что-то типа:
out << (char)*it << (char)(*it>>8) << '\n';
непонятно только зачем после каждой буквы всавлять перевод строки (да еще не юникодный) ...


Автор: Alexeis 9.12.2011, 09:01
  Не знаю зачем точно автор использует std::vector<WCHAR> ,  возможно на это есть свои причины, но вдруг он не знает про std::wstring ? 

Автор: bsa 9.12.2011, 11:14
Цитата(volatile @  9.12.2011,  01:05 Найти цитируемый пост)
непонятно только зачем после каждой буквы всавлять перевод строки (да еще не юникодный) ...

может потому, что поток тоже не юникодный?  smile 

Автор: wallstreet 10.12.2011, 14:04
Я буду принимать данные в формате xltable и потом уже их парсить.

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