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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
#1

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

16.08.2011, 17:59. Просмотров 1154. Ответов 12
Метки нет (Все метки)

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. Вывести в другое окно.
З.Ы. Окно - окно редактирования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2011, 17:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразование типа (C++):

Преобразование типа или преобразование типа указателя ? - C++
Добрый день. Помогите пожалуйста понять что делает вот эта команда: out.write ((char *) &n, sizeof n); Она что, перед записью в файл...

Преобразование типа - C++
Есть числа типов int и double. Их надо преобразовать в тип char, чтобы записать их в поток(файл *.bin). И какая функция соединяет...

Преобразование типа - C++
Есть две переменные: CString m_strVal; long m_lVal; Как c помощью MFC преобразовать тип long в CString, чтобы можно было...

Неявное преобразование типа - C++
Привет. Решаю задачу, не могу решить проблему. Есть класс 'time' и производный от него класс 'interval'. 1 - содержит поля h, m, s,...

Преобразование типа переменной - C++
Как сделать что бы компилятор не отслеживал преобразование типов переменных Конкретней на примере: #include <iostream> #include...

Автоматическое понижающее преобразование типа - C++
Не пойму почему так происходит. Компилировал в Code Blocks с MinGW. Переменная типа long без всяких предупрежнений присваивается к...

12
Сыроежка
Заблокирован
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 *
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
16.08.2011, 18:19 #3
Цитата Сообщение от AndreyZ01 Посмотреть сообщение
ne O;
// ....
wcstombs(O.l,x1.GetBuffer(128),128);
O.x1=atof(O.l);
Это участник конкурса на самый запутанный код?
0
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);
Это участник конкурса на самый запутанный код?
Если знаете, как сделать проще, то пожалуйста помогите, поумничать могут все.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
16.08.2011, 18:33 #5
Речь не про сложность программы. Просто читать программу, в которой используются идентификаторы O и l очень утомительно. А особенно такое их сочетание
O.l можно принять за 0.1 или за 0.l, при этом смысл, разумеется, разный. Ну и "ne O" тоже забавно смотрится.

Добавлено через 2 минуты
Что же касается непосредственно проблемы: что если убрать на время вызов wcstombs и передавать в atof() сразу полученный буфер? Так не работает? (Просто похоже, что программа собирается без включённой поддержки Unicode)
0
talis
791 / 543 / 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 );
1
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".
0
talis
791 / 543 / 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
0
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
16.08.2011, 18:48  [ТС] #9
Все, запутался. Не буду делать дальше)
Я не есть какой-то профи, чтобы понимать все прототипы и всевозможные фокусы с кодом.
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 18:49 #10
AndreyZ01, с вашего позволения - изучите сначала С++ без MFC
0
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)

Что может значить эта ошибка.
0
talis
791 / 543 / 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(){}
1
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
16.08.2011, 18:59  [ТС] #13
Вот решение. Большое спасибо.
Я обошолся переобразованием через atoi и этот помогло.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2011, 18:59
Привет! Вот еще темы с ответами:

Преобразование пользовательского типа, friend - C++
Этот код не работает, потому что класс X ничего не знает о классе Y? Ошибки:Error 5 error C2679: binary '=' : no operator found which...

Преобразование типа byte в десятичный - C++
Здравствуйте! Читаю файл побайтово, записал в переменную byte a соответственно 2 байта, которые находятся в 16ричной системе. В этих...

Преобразование типа функции (метода) - C++
Задача заставить код работать (: #include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;algorithm&gt; #include &lt;functional&gt; #include...

Явное преобразование типа в стиле С - C++
1) назовите направление преобразование ( из какого типа в какой ) 2) назовите точность преобразования (С потерей точности , без потери...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
16.08.2011, 18:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru