Форум программистов, компьютерный форум CyberForum.ru

Конвертация char * -> WideString - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
03.03.2011, 10:31     Конвертация char * -> WideString #1
Ошибки там, где стоят ковычки с пробелом внутри.

C++
1
2
3
4
5
6
7
8
wchar_t * ptr;
   ptr = strtok(ADODataSet1FIO->Value, " ");
   while( i < 2 )
   {
     ptr = strtok(NULL, " ");
     i++;
   }
   ADODataSet1Name->Value = ptr;

[C++ Error] Unit2.cpp(46): E2034 Cannot convert 'WideString' to 'char *'
[C++ Error] Unit2.cpp(46): E2342 Type mismatch in parameter '__s1' (wanted 'char *', got 'WideString')
[C++ Error] Unit2.cpp(46): E2034 Cannot convert 'char *' to 'wchar_t *'
[C++ Error] Unit2.cpp(49): E2034 Cannot convert 'char *' to 'wchar_t *'

Пробовал _T(" "), L" " - не помогает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2011, 10:31     Конвертация char * -> WideString
Посмотрите здесь:

Конвертация int в char* C++
Конвертация числа в строку (int to char) C++
error: incompatible types in assignment of 'const char [5]' to 'char [10]' C++
C++ char конвертация
Конвертация из int в char C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
03.03.2011, 12:12     Конвертация char * -> WideString #2
mbstowcs, MultiByteToWideChar
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
03.03.2011, 12:14     Конвертация char * -> WideString #3
макрос W2A
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
03.03.2011, 15:22  [ТС]     Конвертация char * -> WideString #4
Сейчас попробую

Добавлено через 9 минут
MultiByteToWideChar - мороки ещё больше.

C++
1
2
3
4
5
6
7
8
9
10
11
const int BuffSize = 60;
   char npath[BuffSize];
 
   char * ptr;
   ptr = strtok(ADODataSet1FIO->Value, MultiByteToWideChar(CP_ACP, 0, " ", strlen(npath)+1, NULL, BuffSize));
   while( i < 2 )
   {
     ptr = strtok(NULL, MultiByteToWideChar(CP_ACP, 0, " ", strlen(npath)+1, NULL, BuffSize));
     i++;
   }
   ADODataSet1Name->Value = ptr;

[C++ Error] Unit2.cpp(50): E2034 Cannot convert 'WideString' to 'char *'
[C++ Error] Unit2.cpp(50): E2342 Type mismatch in parameter '__s1' (wanted 'char *', got 'WideString')
[C++ Error] Unit2.cpp(50): E2034 Cannot convert 'int' to 'const char *'
[C++ Error] Unit2.cpp(50): E2342 Type mismatch in parameter '__s2' (wanted 'const char *', got 'int')
[C++ Error] Unit2.cpp(53): E2034 Cannot convert 'int' to 'const char *'
[C++ Error] Unit2.cpp(53): E2342 Type mismatch in parameter '__s2' (wanted 'const char *', got 'int')

Добавлено через 1 час 25 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const int BuffSize = 20;
   char * ptr;
   char * p1;
   int i = 0;
 
   wcstombs( ptr, ADODataSet1FIO->Value, BuffSize);
 
   p1 = strtok( ptr, " ");
   while( i < 2 )
   {
     p1 = strtok( ptr, " ");
     i++;
   }
   ADODataSet1Name->Value = p1;
Так правильно.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
03.03.2011, 15:28     Конвертация char * -> WideString #5
Цитата Сообщение от 4ance Посмотреть сообщение
Сейчас попробую

Добавлено через 9 минут
MultiByteToWideChar - мороки ещё больше.

C++
1
2
3
4
5
6
7
8
9
10
11
const int BuffSize = 60;
   char npath[BuffSize];
 
   char * ptr;
   ptr = strtok(ADODataSet1FIO->Value, MultiByteToWideChar(CP_ACP, 0, " ", strlen(npath)+1, NULL, BuffSize));
   while( i < 2 )
   {
     ptr = strtok(NULL, MultiByteToWideChar(CP_ACP, 0, " ", strlen(npath)+1, NULL, BuffSize));
     i++;
   }
   ADODataSet1Name->Value = ptr;

[C++ Error] Unit2.cpp(50): E2034 Cannot convert 'WideString' to 'char *'
[C++ Error] Unit2.cpp(50): E2342 Type mismatch in parameter '__s1' (wanted 'char *', got 'WideString')
[C++ Error] Unit2.cpp(50): E2034 Cannot convert 'int' to 'const char *'
[C++ Error] Unit2.cpp(50): E2342 Type mismatch in parameter '__s2' (wanted 'const char *', got 'int')
[C++ Error] Unit2.cpp(53): E2034 Cannot convert 'int' to 'const char *'
[C++ Error] Unit2.cpp(53): E2342 Type mismatch in parameter '__s2' (wanted 'const char *', got 'int')

Добавлено через 1 час 25 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const int BuffSize = 20;
   char * ptr;
   char * p1;
   int i = 0;
 
   wcstombs( ptr, ADODataSet1FIO->Value, BuffSize);
 
   p1 = strtok( ptr, " ");
   while( i < 2 )
   {
     p1 = strtok( ptr, " ");
     i++;
   }
   ADODataSet1Name->Value = p1;
Так правильно.
У вас название темы char * -> WideString, а вы, смотрю, обратную конвертацию выполняетеО_о
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
03.03.2011, 15:53  [ТС]     Конвертация char * -> WideString #6
Цитата Сообщение от bigredcat Посмотреть сообщение
У вас название темы char * -> WideString, а вы, смотрю, обратную конвертацию выполняетеО_о
Вообще ADODataSet1FIO->Value - WideString,

strtok( char *, delim ) - char*, её я присваиваю char *p1.

Потом, чтобы записать этот p1 в ADODataSet1Name->Value,

надо char *p1 обратно конвертировать в WideString. Сейчас этим занимаюсь.

Так что, там всё надо
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
03.03.2011, 17:36     Конвертация char * -> WideString #7
Цитата Сообщение от 4ance Посмотреть сообщение
Вообще ADODataSet1FIO->Value - WideString,

strtok( char *, delim ) - char*, её я присваиваю char *p1.

Потом, чтобы записать этот p1 в ADODataSet1Name->Value,

надо char *p1 обратно конвертировать в WideString. Сейчас этим занимаюсь.

Так что, там всё надо
Так может вам вам стоит сразу wchar_t использовать, и Unicode-функции, типа wcstok, wcslen, чем гонять туда сюда преобразования
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
04.03.2011, 12:31  [ТС]     Конвертация char * -> WideString #8
Цитата Сообщение от bigredcat Посмотреть сообщение
Так может вам вам стоит сразу wchar_t использовать, и Unicode-функции, типа wcstok, wcslen, чем гонять туда сюда преобразования
Знал бы о таких функциях раньше - не гонял бы)
Хотя сейчас наверно буду их использовать, тк мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TDataModule2::ADODataSet1CalcFields(TDataSet *DataSet)
{
   const int BuffSize = 30000;
   char *ptr = new char[BuffSize];
   char *p1;
   wchar_t *p2 = new wchar_t[BuffSize];
   int i = 0;
 
   wcstombs( ptr, ADODataSet1FIO->Value, BuffSize);
 
   p1 = strtok( ptr, " ");
   while( i < 2 )
   {
     p1 = strtok( NULL, " ");
     i++;
   }
 
  mbstowcs(p2, p1, BuffSize);
  ADODataSet1Name->Value = p2;
 
  delete [] ptr;
  delete [] p2;
}
Выкидывает ошибку уже на этапе прогона программы(компиляция говорит, что ошибок нет) в строке

C++
1
mbstowcs(p2, p1, BuffSize);
Указывает что p1=NULL. С циклом скорее всего проблема, но на всякий случай поуменьшаю преобразования.

Добавлено через 17 часов 50 минут
C++
1
2
3
4
5
6
7
8
9
void __fastcall TDataModule2::ADODataSet1CalcFields(TDataSet *DataSet)
{
   wchar_t **p3;
 
   **p3 = *wcstok( ADODataSet1FIO->Value, L" ");
   **p3 = *wcstok( NULL, L" ");
 
   ADODataSet1Name->Value = *p3;
}

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00402977 in module 'Project1.exe'. Write of address 00000000'. Process stopped.

Ошибка вылетает на

C++
1
**p3 = *wcstok( ADODataSet1FIO->Value, L" ");
При компиляции ошибок не даёт.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
04.03.2011, 16:36     Конвертация char * -> WideString #9
Цитата Сообщение от 4ance Посмотреть сообщение
Добавлено через 17 часов 50 минут
C++
1
2
3
4
5
6
7
8
9
void __fastcall TDataModule2::ADODataSet1CalcFields(TDataSet *DataSet)
{
   wchar_t **p3;
 
   **p3 = *wcstok( ADODataSet1FIO->Value, L" ");
   **p3 = *wcstok( NULL, L" ");
 
   ADODataSet1Name->Value = *p3;
}
А для чего вы так делатете?
wchar_t **p3 - указатель на указатель на wchar_t. Заметье, что вы не выделяли памяти для хранения собственно строки.
**p3 - попытка разыменования двойного указателя, т.е. хотите получить доступ к памяти массива символов, который вы не создавали, и записать туда массив *wcstok. Но массивы, в том числе и символьные, так не копируются.

Делайте так
C++
1
2
3
wchar_t * p3;
p3 = wcstok( ADODataSet1FIO->Value, L" ");
ADODataSet1Name->Value = p3;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 02:52     Конвертация char * -> WideString
Еще ссылки по теме:

Конвертация ' string hex ' to char C++
C++ Поворот массива на 90 градусов (cannot convert form char to char*)
C++ Конвертация int в char

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kost91
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 5
09.11.2011, 02:52     Конвертация char * -> WideString #10
У меня не хочет компилить что делать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
namespace Qeditfox
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TEditFox)};
                 RegisterComponents("KISIT", classes, 0);
        }
}
float __fastcall TEditFox::GetValue()
{
if (Text.Length())
        return StrToFloat(Text);
else
        return 0;
}
void __fastcall TEditFox::SetValue(float v)
{
Text=FloatToStr(v);
Update();
}
void __fastcall TEditFox::KeyPress(char &Key)
{
int p;
int n;
switch (Key) {
 case '0':
 case '1':
 case '2':
 case '3':
 case '4':
 case '5':
 case '6':
 case '7':
 case '8':
 case '9':
        p=Text.Pos(DecimalSeparator);
        if ((p==0)||(SelStart < p))
        {
          if (p==0)  { n = Text.Length(); }
          else n = p-1;
          if ((n>0)&&(Text[1]=='-')) { n--; }
          if (n==FMaxLenInt) { Key=0; }
        }
        else
        {
        n=Text.Length()-p;
        if(n==FMaxLenFrac){ Key=0; }
        }
        break;
 case '.':
 case ',':
        Key = DecimalSeparator;
        if ((FMaxLenFrac==0)||(Text.Pos(DecimalSeparator)!=0))
        { Key=0; }
        break;
 case '-':
        if ((FOnlyPositive)||(SelStart>0))
        { Key=0;}
        break;
 case VK_RETURN:
        if (Next!=NULL){ FNext->SetFocus(); }
 case VK_BACK:break;
 default: Key=0;
 }
 TEdit::KeyPress(Key);
 }
Ошибки:
[C++ Error] QEditFox.cpp(67): E2064 Cannot initialize 'const WideString &' with 'char'
[C++ Error] QEditFox.cpp(67): E2342 Type mismatch in parameter 'subStr' (wanted 'const WideString &', got 'char')
[C++ Error] QEditFox.cpp(87): E2064 Cannot initialize 'const WideString &' with 'char'
[C++ Error] QEditFox.cpp(87): E2342 Type mismatch in parameter 'subStr' (wanted 'const WideString &', got 'char')
Yandex
Объявления
09.11.2011, 02:52     Конвертация char * -> WideString
Ответ Создать тему
Опции темы

Текущее время: 06:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru