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

Преобразование типа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
16.08.2011, 17:59     Преобразование типа #1
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
class ne
{
public:
    ne();
    ~ne();
    double x1;
    char l[128];
};
ne O;
ne::~ne(){};
 
void CNewwDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    CString x1;
    GetDlgItemText (IDC_EDIT1,x1);
    wcstombs(O.l,x1.GetBuffer(128),128);
    O.x1=atof(O.l);
}
 
void CNewwDlg::OnButton2() 
{
    // TODO: Add your control notification handler code here
    CString a;
    a.Format(_T("%f"),O.x1);
    SetDlgItemText (IDC_EDIT2, a);
}
При компиляции выдает ошибку:
error C2664: 'wcstombs' : cannot convert parameter 2 from 'char *' to 'const unsigned short *'
Уже все перепробовал. Проблема в преобразовании.
Программа делается под диалог, сюда скинул только один файл.
Она должна делать только две вещи:
1. Считать с окна число.
2. Вывести в другое окно.
З.Ы. Окно - окно редактирования.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
16.08.2011, 18:07     Преобразование типа #2
Цитата Сообщение от AndreyZ01 Посмотреть сообщение
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
class ne
{
public:
    ne();
    ~ne();
    double x1;
    char l[128];
};
ne O;
ne::~ne(){};
 
void CNewwDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    CString x1;
    GetDlgItemText (IDC_EDIT1,x1);
    wcstombs(O.l,x1.GetBuffer(128),128);
    O.x1=atof(O.l);
}
 
void CNewwDlg::OnButton2() 
{
    // TODO: Add your control notification handler code here
    CString a;
    a.Format(_T("%f"),O.x1);
    SetDlgItemText (IDC_EDIT2, a);
}
При компиляции выдает ошибку:
error C2664: 'wcstombs' : cannot convert parameter 2 from 'char *' to 'const unsigned short *'
Уже все перепробовал. Проблема в преобразовании.
Программа делается под диалог, сюда скинул только один файл.
Она должна делать только две вещи:
1. Считать с окна число.
2. Вывести в другое окно.
З.Ы. Окно - окно редактирования.
Если строго следовать сообщению компилятора, то у вас типом значения второго параметра x1.GetBuffer(128) является char *, а функция wcstombs требует, чтобы у второго аргумента был тип 'const unsigned short *, то есть скоерй всего имеется в виду, что тип второго аргумента должен быть

const wchar_t *
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
16.08.2011, 18:19     Преобразование типа #3
Цитата Сообщение от AndreyZ01 Посмотреть сообщение
ne O;
// ....
wcstombs(O.l,x1.GetBuffer(128),128);
O.x1=atof(O.l);
Это участник конкурса на самый запутанный код?
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
16.08.2011, 18:26  [ТС]     Преобразование типа #4
Я не понимаю.
Проще не как нельзя сделать, чтобы выводило?

Добавлено через 6 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Сообщение от AndreyZ01
ne O;
// ....
wcstombs(O.l,x1.GetBuffer(128),128);
O.x1=atof(O.l);
Это участник конкурса на самый запутанный код?
Если знаете, как сделать проще, то пожалуйста помогите, поумничать могут все.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
16.08.2011, 18:33     Преобразование типа #5
Речь не про сложность программы. Просто читать программу, в которой используются идентификаторы O и l очень утомительно. А особенно такое их сочетание
O.l можно принять за 0.1 или за 0.l, при этом смысл, разумеется, разный. Ну и "ne O" тоже забавно смотрится.

Добавлено через 2 минуты
Что же касается непосредственно проблемы: что если убрать на время вызов wcstombs и передавать в atof() сразу полученный буфер? Так не работает? (Просто похоже, что программа собирается без включённой поддержки Unicode)
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 18:33     Преобразование типа #6
AndreyZ01, а вам действительно необходимо работать с wide-char и multibyte string?

Я не думаю, что atof скушает multibyte string, которая получится на выходе wcstombs. Попробуйте swscanf. Работает как обычная sscanf, но принимает wchar.

C
1
2
3
4
5
wchar_t * str = L"212.541";
float number;
 
swscanf( str, L"%f", &number );
printf( "%f", number );
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
16.08.2011, 18:42  [ТС]     Преобразование типа #7
Я просто уже в который раз переписывал и как-то уже не замечал, какие ставить.
Просто хочу сделать элементарные действия, а чёт не получается.

Добавлено через 8 минут
Цитата Сообщение от talis Посмотреть сообщение
AndreyZ01, а вам действительно необходимо работать с wide-char и multibyte string?
Я не думаю, что atof скушает multibyte string, которая получится на выходе wcstombs. Попробуйте swscanf. Работает как обычная sscanf, но принимает wchar.
C++
1
2
3
4
wchar_t * str = L"212.541";
float number;
swscanf( str, L"%f", &number );
printf( "%f", number );
Но мне нужно чтобы оно выводило результат в окно типа "Edit Control".
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 18:47     Преобразование типа #8
Судя по этому коду

C++
1
2
CString cs("meow");
wcout << (const wchar_t*) cs << endl;
с [этой] страницы, простое приведение CString к const wchar_t* должно сработать:

C++
1
2
3
4
5
6
CString str = L"212.541";
float number;
 
swscanf( (const wchar_t*)str, L"%f", &number );
 
printf( "%f", number );
К сожалению, не имею возможности проверить.



------------------------------------------------------------------------------



Я не знаю, как работает visual studio, но могу предположить, что преобразование CString во float вам не поможет. Думаю, вам нужно использовать CEdit::SetWindowText и CEdit::GetWindowText.

Добавлено через 54 секунды
http://msdn.microsoft.com/ru-ru/library/yhczy8bz.aspx
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
16.08.2011, 18:48  [ТС]     Преобразование типа #9
Все, запутался. Не буду делать дальше)
Я не есть какой-то профи, чтобы понимать все прототипы и всевозможные фокусы с кодом.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 18:49     Преобразование типа #10
AndreyZ01, с вашего позволения - изучите сначала С++ без MFC
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
16.08.2011, 18:53  [ТС]     Преобразование типа #11
Ещё один вопрос:
error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall ne::ne(void)" (??0ne@@QAE@XZ) в функции "void __cdecl `dynamic initializer for 'О''(void)" (??__Ei@@YAXXZ)

Что может значить эта ошибка.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 18:56     Преобразование типа #12
AndreyZ01, скорее всего, вы не написали конструктор. Добавьте

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ne
{
public:
        ne();
        ~ne();
        double x1;
        char l[128];
};
ne O;
 
ne::ne( ) /* Вот эту функцию */
{
}
 
ne::~ne(){}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2011, 18:59     Преобразование типа
Еще ссылки по теме:

Преобразование типа C++
C++ Преобразование типа функции (метода)
Преобразование пользовательского типа, friend C++

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

Или воспользуйтесь поиском по форуму:
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
16.08.2011, 18:59  [ТС]     Преобразование типа #13
Вот решение. Большое спасибо.
Я обошолся переобразованием через atoi и этот помогло.
Yandex
Объявления
16.08.2011, 18:59     Преобразование типа
Ответ Создать тему
Опции темы

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