Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/28: Рейтинг темы: голосов - 28, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 29

Функции преобразования типов в MFC

20.02.2010, 22:50. Показов 5881. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте, работаю в MFC, есть задание: "Вывести в окно приложения результаты вычислений G (см. миниатюру) Все вычисления производятся внутри метода OnDraw. Входные данные можно задавать константами."
Как я понял, чтобы вывести G, сначала нужно преобразовать его из типа float в CString, как это сделать, вот в чем вопрос.

Вот мой незавершенный код метода OnDraw, пока он просто выводит "Добро пожаловать в Visual C++"
C++
1
2
3
4
5
6
7
8
9
10
11
12
void CwelcomeView::OnDraw(CDC* pDC)
{
    CString welcome_string("Добро пожаловать в Visual C++");
    float x=100, A=50, G;
    CwelcomeDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    G=(-1/(x*x-A*A)-2*A*A/(3*((x*x-A*A)*(x*x-A*A))));
    pDC->TextOut(0, 0, welcome_string);
 
}
Изображения
 
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2010, 22:50
Ответы с готовыми решениями:

Существуют ли MFC'шные функции для преобразования типов?
А существуют MFC'шные ф-ии для преобразования типов?

Преобразования типов
error: request for member ‘data’ in ‘data’, which is of non-class type ‘const uint64_t {aka const long unsigned int}’ ...

Преобразования типов
Доброго времени суток. Разбираясь с преобразователями типов в С++ возник вот такой вопрос: допустим у нас есть класс Alpha и какая-то...

14
8 / 8 / 1
Регистрация: 29.09.2009
Сообщений: 28
21.02.2010, 16:22
C++
1
2
3
4
5
6
7
8
9
10
11
12
CMFC_testDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
     CString welcome_string("Äîáðî ïîæàëîâàòü â Visual C++");
     CString value;
        float x=100, A=50, G;
        
        if (!pDoc)
                return;
        G=(-1/(x*x-A*A)-2*A*A/(3*((x*x-A*A)*(x*x-A*A))));
        value.Format("%f",G);
        pDC->TextOut(0, 0, value);
1
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 29
21.02.2010, 20:52  [ТС]
rubic, появляется ошибка error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Fo rmat(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [3]' to 'const wchar_t *'
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CwelcomeView::OnDraw(CDC* pDC)
{
        CString welcome_string("Добро пожаловать в Visual C++");
        CString value;
        float x=100, A=50, G;
        CwelcomeDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
 
        if (!pDoc)
                return;
        G=(-1/(x*x-A*A)-2*A*A/(3*((x*x-A*A)*(x*x-A*A))));
            value.Format("%f",G);
        pDC->TextOut(0, 0, value);
 
}
0
8 / 8 / 1
Регистрация: 29.09.2009
Сообщений: 28
22.02.2010, 00:34
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CMFC_testView::OnDraw(CDC* pDC)
{
    CMFC_testDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
     CString welcome_string("Добро пожаловать в Visual C++");
     CString value;
        float x=100, A=50, G;
        
        if (!pDoc)
                return;
        G=(-1/(x*x-A*A)-2*A*A/(3*((x*x-A*A)*(x*x-A*A))));
        value.Format("%f",G);
        pDC->TextOut(0, 0, value);
}
даже неварнит результат -0,000163 компилировал на VC++6
1
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
22.02.2010, 06:42
Цитата Сообщение от rubic Посмотреть сообщение
даже неварнит результат -0,000163 компилировал на VC++6
В MSVS VC++ 6.0 поддержка UNICODE опциональная.
А в новых версиях студий - по умолчанию.
CString::Format() с UNICODE корректно работать не будет.
1
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 29
22.02.2010, 09:52  [ТС]
А что сделать, чтобы она на Visual Studio 2008 заработала?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
22.02.2010, 10:24
Цитата Сообщение от Pathfinder Посмотреть сообщение
А что сделать, чтобы она на Visual Studio 2008 заработала?
Отключить UNICODE в настройках проекта.
Но это не есть хороший вариант.
Склероз, склероз...
Можно попробовать смухлевать.
Напишите
C++
1
value.Format(TEXT("%f"),G);
Может, сработает.
1
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 29
22.02.2010, 10:54  [ТС]
Patch, спасибо, в таком виде заработала!
C++
1
1   value.Format(TEXT("%f"),G);
Задача решена.
0
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 29
23.02.2010, 15:26  [ТС]
Столкнулся с другой проблемой. По заданию (MFC, Visual Studio 2008) нужно доработать предыдущюю программу , чтобы x и A вводились с клавиатуры, используя метод OnChar(), я написал ниже приведенный код, но он выводит огромные рандомные числа, подскажите, где ошибка?
C++
1
2
3
4
5
6
7
8
void CkeystrokesView::OnDraw(CDC* pDC)
{
    CkeystrokesDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    pDC->TextOut(0, 0, pDoc->vyvod_x);
    pDC->TextOut(0, 20, pDoc->StringData_x);
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
CkeystrokesView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    CString value_x, value_A,value_G;           //локальные строковые переменные для хранения x, A, G
    int x,A,G;                                  //для хранения x,A,G в числовом виде
    CkeystrokesDoc* pDoc = GetDocument(); 
    ASSERT_VALID(pDoc);
    if(char(nChar)!='x')
    {
        pDoc->StringData_x += char(nChar);                          /*оператор -> используется для обращения к объекту StringData документа, на который ссылается pDoc*/
        Invalidate();                                               /*Чтобы  заставить программу вызвать OnDraw() и перерисовать обновленную строку мы  вызовем  метод Invalidate() объекта вида: */
    }
    if(char(nChar)=='x')                        //если нажимаю "х", то в value_x записывается последовательность ранее введенных символов
    {                                                               
        value_x=pDoc->StringData_x;
        pDoc->vyvod_x=pDoc->vyvod_A;
        pDoc->StringData_x="";                  //удаляю введенные ранее символы
        Invalidate();   
    }
    if(char(nChar)=='a')                        //если нажимаю "a", то в value_A записывается последовательность ранее введенных символов
    {                                                               
        value_A=pDoc->StringData_x;
        pDoc->vyvod_x=pDoc->vyvod_G;
        x=_ttoi(value_x);
        A=_ttoi(value_A);
        G=(-1/(x*x-A*A)-2*A*A/(3*((x*x-A*A)*(x*x-A*A))));
        value_G.Format(TEXT("%f"),G);
        pDoc->StringData_x=value_G;             
        Invalidate();   
    }
    CView::OnChar(nChar, nRepCnt, nFlags);//!!!!!!!!!
}
а если 27-ю строчку поменять на,
C++
1
value_G.Format(TEXT("%f"),x);
то вместо x он опять же выводит какую-то бяку

Добавлено через 12 минут
Чтобы было понятнее, вот значения других переменных, объявленных в другом месте
C++
1
2
3
4
vyvod_x="Введи x (Для окончания ввода нажмите клавишу x)";
vyvod_A="Введи A (Для окончания ввода нажмите клавишу a)";
vyvod_G="G=";
StringData_x = "";
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
23.02.2010, 15:53
Не вполне ясно, что надо было получить.
Попробую прокомментировать то, что вижу.

Как я понимаю, есть некий класс CkeystrokesView, в котором есть объекты класса CString vyvod_x, vyvod_A, vyvod_G и StringData_x.

При нажатии любой клавиши, кроме "x", символ записывается в объект StringData_x.

При нажатии "x":
объект StringData_x обнуляется, vyvod_x = vyvod_A(который непонятно где и чем заполняется),
а зачем делается "value_x=pDoc->StringData_x;" я вообще понять не могу, ведь value_x - локальная переменная и стирается при выхода из OnChar().
Загадочная конструкция...

При нажатии "a":
сначала срабатывает pDoc->StringData_x += char(nChar); (потому, что выполняется условие if(char(nChar)!='x') ), а дальше...
A = числовому значению StringData_x, но поскольку там еще и символ "a" в конце - результат не вполне предсказуем
x = хрен_знает_чему, а скорее всего 0, потому, что переменная value_x на момент использования ничем не заполнена,
G = куче операций над x = 0 и A = числовому значению StringData_x,
а value_G вообще получает случайное значение, потому, что модификатор "%f" в методе Format расчитан на использование переменной с плавающей запятой(float), а там стоит G - определенное, как целое(int). Для целых, используется то-ли "%d", то-ли "%i", а может они оба, не помню точно.
StringData_x записывается полученное случайное значение.


Что-то мне подсказывает, что переменные
CString value_x, value_A,value_G; //локальные строковые переменные для хранения x, A, G
int x,A,G;
надо было объявить, как static.
1
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 29
23.02.2010, 17:11  [ТС]
Patch, спасибо, вроде исправил все указанные тобой недочеты, а также упростил прогу - удалил кучу ненужных вещей, программа стала работать стабильно - все время выдавать 0, но оно и понятно, так как тип переменных x,A,G int, а результат вычислений стремится к нулю. В следствии этого возникает нужда поменять тип переменых x,A,G на float, но я не знаю чем заменить функцию _ttoi, подскажи пожалуйста.
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
void CkeystrokesView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    int x,A,G;                                  //для хранения x,A,G в числовом виде
    CkeystrokesDoc* pDoc = GetDocument(); 
    ASSERT_VALID(pDoc);
    if(char(nChar)!='x' & char(nChar)!='a')
    {
        pDoc->StringData += char(nChar);                            /*оператор -> используется для обращения к объекту StringData документа, на который ссылается pDoc*/
        Invalidate();                                               /*Чтобы  заставить программу вызвать OnDraw() и перерисовать обновленную строку мы  вызовем  метод Invalidate() объекта вида: */
    }
    if(char(nChar)=='x')                        //если нажимаю "х", то в value_x записывается последовательность ранее введенных символов
    {                                                               
        pDoc->value_x=pDoc->StringData;
        pDoc->vyvod="Введи A (Для окончания ввода нажмите клавишу a)";
        pDoc->StringData="";                    //удаляю введенные ранее символы
        Invalidate();   
    }
    if(char(nChar)=='a')                        //если нажимаю "a", то в value_A записывается последовательность ранее введенных символов
    {                                                               
        pDoc->value_A=pDoc->StringData;
        pDoc->vyvod="G=";
        x=_ttoi(pDoc->value_x);
        A=_ttoi(pDoc->value_A);
        G=(-1/(x*x-A*A)-2*A*A/(3*((x*x-A*A)*(x*x-A*A))));
        pDoc->value_G.Format(TEXT("%d"),G);
        pDoc->StringData=pDoc->value_G;             
        Invalidate();   
    }
    CView::OnChar(nChar, nRepCnt, nFlags);//!!!!!!!!!
}
C++
1
2
3
4
5
6
7
8
9
10
void CkeystrokesView::OnDraw(CDC* pDC)
{
    CkeystrokesDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    pDC->TextOut(0, 0, pDoc->vyvod);
    pDC->TextOut(0, 20, pDoc->StringData);
    // TODO: add draw code for native data here
}
Объявление переменных:
C++
1
2
3
4
5
6
class CkeystrokesDoc : public CDocument
{
protected: // create from serialization only
    CkeystrokesDoc();
    DECLARE_DYNCREATE(CkeystrokesDoc)
    CString StringData,vyvod,value_x,value_A,value_G;
Инициализация переменных:
C++
1
2
3
4
5
6
7
8
9
CkeystrokesDoc::CkeystrokesDoc()
{
    // TODO: add one-time construction code here
vyvod="Введи x (Для окончания ввода нажмите клавишу x)";
StringData = "";
value_x=""; 
value_A="";
value_G="";
}
Результаты работы:
Миниатюры
Функции преобразования типов в MFC   Функции преобразования типов в MFC   Функции преобразования типов в MFC  

0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
23.02.2010, 17:39
Цитата Сообщение от Pathfinder Посмотреть сообщение
В следствии этого возникает нужда поменять тип переменых x,A,G на float, но я не знаю чем заменить функцию _ttoi
А зачем заменять _ttoi?
Ты-же все равно целые величины вводишь?
Ну и... объявляешь переменные float, и явно преобразуешь числовые значения.
C++
1
2
3
4
5
6
...
float x,A,G;  
...
x=(float)_ttoi(pDoc->value_x);
A=(float)_ttoi(pDoc->value_A);
...
1
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 29
23.02.2010, 17:47  [ТС]
Спасибо, все работает!
0
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 29
27.02.2010, 17:30  [ТС]
Форумчане, снова нужна ваша помощь! Помогите построить диаграмму последовательности для метода OnChar все той же программы. Опыт в построении таких диаграмм у меня практически равен нулю, с чего начать?...линии жизни каких объектов выбрать?...какие сообщения используются в методе?
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
void CkeystrokesView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
        // TODO: Add your message handler code here and/or call default
        int x,A,G;                                                                      //для хранения x,A,G в числовом виде
        CkeystrokesDoc* pDoc = GetDocument(); 
        ASSERT_VALID(pDoc);
        if(char(nChar)!='x' & char(nChar)!='a')
        {
                pDoc->StringData += char(nChar);                                                        /*оператор -> используется для обращения к объекту StringData документа, на который ссылается pDoc*/
                Invalidate();                                                                                           /*Чтобы  заставить программу вызвать OnDraw() и перерисовать обновленную строку мы  вызовем  метод Invalidate() объекта вида: */
        }
        if(char(nChar)=='x')                                            //если нажимаю "х", то в value_x записывается последовательность ранее введенных символов
        {                                                                                                                               
                pDoc->value_x=pDoc->StringData;
                pDoc->vyvod="Введи A (Для окончания ввода нажмите клавишу a)";
                pDoc->StringData="";                                    //удаляю введенные ранее символы
                Invalidate();   
        }
        if(char(nChar)=='a')                                            //если нажимаю "a", то в value_A записывается последовательность ранее введенных символов
        {                                                                                                                               
                pDoc->value_A=pDoc->StringData;
                pDoc->vyvod="G=";
                x=_ttoi(pDoc->value_x);
                A=_ttoi(pDoc->value_A);
                G=(-1/(x*x-A*A)-2*A*A/(3*((x*x-A*A)*(x*x-A*A))));
                pDoc->value_G.Format(TEXT("%d"),G);
                pDoc->StringData=pDoc->value_G;                         
                Invalidate();   
        }
        CView::OnChar(nChar, nRepCnt, nFlags);//!!!!!!!!!
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
28.02.2010, 08:20
Цитата Сообщение от Pathfinder Посмотреть сообщение
построить диаграмму последовательности для метода
Цитата Сообщение от Pathfinder Посмотреть сообщение
с чего начать?...
с выбрасывания учебника, где написано это сделать. ИМХО.
никогда не видел ничего более бесполезного, чем диаграммы последовательности действий.
Цитата Сообщение от Pathfinder Посмотреть сообщение
какие сообщения используются в методе?
только те, что ты написал.
берешь листок, карандашик, и рисуешь...
пример здесь: http://www.informicus.ru/defau... visionid=5
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.02.2010, 08:20
Помогаю со студенческими работами здесь

Преобразования типов
Не подскажите как быть. Я из базы access через ado вытаскиваю из поля Данные тип которых дата/время. Как мне записать эти данные в поле...

преобразования типов
опять затык int uint16_t r; r=325; (uint8_t)(r-100) - вроде бы получается 225 а вот (uint8_t)((ftoot)(r)/2.0f) почему-то не...

Преобразования типов
Почему можно присваивать символьной переменной типа char целые числа? И наоборот, целочисленному типу int можно присваивать символы....

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

Преобразования типов
Имеются несколько структур, содержащих один и тот же набор элементов, но в разных последовательностях. ({x,y,z};{y,x,z};{z,y,x},...). ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru