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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> vector с Unicode 
:(
    Опции темы
wallstreet
Дата 6.12.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем доброго дня.
Принимаю данные 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
      }


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

PM MAIL   Вверх
bsa
Дата 6.12.2011, 11:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



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


Бывалый
*


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

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



Вот так вот работает

Код

 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
          }


Это сообщение отредактировал(а) wallstreet - 6.12.2011, 12:24
PM MAIL   Вверх
bsa
Дата 6.12.2011, 12:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



wallstreet, в первой строчке нового кода условие всегда истинно. Оно не отличается от предыдущего варианта. Думаю, тебе стоит хорошенько подумать о том, зачем условие вообще нужно.
PM   Вверх
wallstreet
Дата 6.12.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да, конечно. 
Кстати не могу найти функцию определяющую размерность массива. Т.е. что-то вроде strlen() для строк.
Есть ли такая?
PM MAIL   Вверх
bsa
Дата 6.12.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



проблема не в массиве, а в его типе. для юникодовых строк следует использовать wcslen.
PM   Вверх
Andrey44
Дата 6.12.2011, 15:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



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

Код

int data[100];
_countoff(data);



Это сообщение отредактировал(а) Andrey44 - 6.12.2011, 15:35


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
volatile
Дата 7.12.2011, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

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



PM MAIL   Вверх
wallstreet
Дата 7.12.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

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


Что такое шорты?))
PM MAIL   Вверх
bsa
Дата 7.12.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



short int
PM   Вверх
wallstreet
Дата 8.12.2011, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



что бы выводилась дата в 16 ричном виде правильным ли будет такой вариант?

Код

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

PM MAIL   Вверх
bsa
Дата 8.12.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



wallstreet, тебе религия документацию читать запрещает?  smile 
PM   Вверх
wallstreet
Дата 8.12.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

Код

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


Но вопрос в скорее в другом. Правильно ли вобоще использовать данные модификаторы вывода чисел?
Или есть более универсальные функции?
PM MAIL   Вверх
bsa
Дата 8.12.2011, 23:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



правильно. Вот только я бы тебе рекомендовал явно преобразовать *it в целочисленный тип. А то однажды может получиться, что будут выводиться символы вместо их кодов.
PM   Вверх
volatile
Дата 9.12.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(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';
непонятно только зачем после каждой буквы всавлять перевод строки (да еще не юникодный) ...


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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