Модераторы: 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   Вверх
Alexeis
Дата 9.12.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bsa
Дата 9.12.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

может потому, что поток тоже не юникодный?  smile 
PM   Вверх
wallstreet
Дата 10.12.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я буду принимать данные в формате xltable и потом уже их парсить.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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