Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > MFC. Таймер


Автор: Kirow 7.3.2011, 18:11
В общем начали в универе преподавать MFC и один из законспектированных примеров никак не могу довести до ума.
Код

//App.cpp
#include <afxwin.h>
#include "App.h"

BOOL CApp::InitInstance()
{
    m_pMainWnd = new CMainWin;
    m_pMainWnd -> ShowWindow(m_nCmdShow);
    m_pMainWnd ->UpdateWindow();
    return TRUE;
}

CMainWin::CMainWin()
{
    Create(NULL,"Окно");
    CWnd::SetTimer(1,5000,NULL);
}
void CMainWin::OnTimer(UINT_PTR nIDEvent)
{
    char s[250];
    CTime curtime = CTime::GetCurrentTime();
    struct tm* newtime;
    newtime = curtime.GetLocalTm(newtime);  //????????????????
    wsprintf(s,asctime(newtime));
    s[strlen(s)-1]='\0';
    SetWindowText(s);
    CClientDC dc(this);
    dc.TextOut(100,100,s,strlen(s));
}
CApp App;
BEGIN_MESSAGE_MAP(CMainWin,CFrameWnd)
    ON_WM_TIMER()
END_MESSAGE_MAP();

Код

//App.h
class CApp: public CWinApp
{public:
        BOOL InitInstance();
};

class CMainWin:public CFrameWnd
{public:
    CMainWin();
    void OnTimer(UINT_PTR nIDEvent);
    DECLARE_MESSAGE_MAP()
};


На компиляцию сего кода выдает Warning про не инициализированную переменную newtime.Ну и во время выполнения программы выдает ошибки на эту же тему с частотой заданной в таймере.
До VS2005 (использую VS2010),  newtime = curtime.GetLocalTm(newtime) можно было записать curtime.GetLocalTm(NULL)  (хотя я не уверен исчезла ли бы ошибка).
Вот вырезка с MSDNa по использованию GetLocalTm:
Код

CTime t( 1999, 3, 19, 22, 15, 0 );   // 10:15PM March 19, 1999
struct tm* osTime;   // A pointer to a structure containing 
                     // time elements.
osTime = t.GetLocalTm( osTime );

Отличий я что-то не заметил...В общем подскажите если можете.(по идее прога должна выводить текст с информацией про время в окне)

Автор: alexvs11 7.3.2011, 18:48
Цитата(Kirow @  7.3.2011,  18:11 Найти цитируемый пост)
    struct tm* newtime;
    newtime = curtime.GetLocalTm(newtime);  //????????????????

ты пишешь на ++, поэтому можно писать 
tm* newtime;
вообще странно, в примере ошибка, дб:

Код

CTime curtime = CTime::GetCurrentTime();
tm newtime;
curtime.GetLocalTm( &newtime );  //????????????????
wsprintf( s,asctime( &newtime ) );


Автор: Kirow 7.3.2011, 19:12
Спасибо.Заменил на:
Код

CTime curtime = CTime::GetCurrentTime();
tm newtime;
wsprintf(s,asctime(curtime.GetLocalTm(&newtime)));

Стало работать.Но тогда не понятен пример с MSDNa, там ошибка или у меня руки кривые?

Автор: alexvs11 7.3.2011, 19:48
Цитата(Kirow @  7.3.2011,  19:12 Найти цитируемый пост)
Стало работать.Но тогда не понятен пример с MSDNa, там ошибка или у меня руки кривые? 

удивительно, но похоже на явную ошибку smile 
грубо говоря там передавали указатель на невыделенную структуру
делая логичные предположения компилятор давал ворнинги, а программа падала

Добавлено через 1 минуту и 15 секунд
прочел, тамже есть комментарий

Цитата

Invalid Example!
The example is incorrect.... par for the course on MSDN i know. If you read the documentation it is actually correct, just not the example.

// Example for CTime::GetLocalTm
CTime t( 1999, 3, 19, 22, 15, 0 );   // 10:15PM March 19, 1999
struct tm osTime;    //  a buffer that will receive the time data
t.GetLocalTm( &osTime );
ATLASSERT( osTime.tm_mon == 2 ); // Note zero-based month!



Автор: Kirow 7.3.2011, 19:53
Спасибо...ответ был рядом, но я до него недокрутил колесиком smile. В следующий раз буду повнимательнее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)