CTime的Format疏失

CTime的Format出错

    CString startTime,endTime;
    CTime dateStart, timeStart, dateEnd, timeEnd;
    ((CDateTimeCtrl*)(GetDlgItem(IDC_DATE_START)))->GetTime(dateStart);
    ((CDateTimeCtrl*)(GetDlgItem(IDC_DATE_END)))->GetTime(dateEnd);
    ((CDateTimeCtrl*)(GetDlgItem(IDC_TIME_START)))->GetTime(timeStart);
    ((CDateTimeCtrl*)(GetDlgItem(IDC_TIME_END)))->GetTime(timeEnd);
    
    startTime = dateStart.Format("%Y-%m-%d ") + timeStart.Format("%H:%M:%S");
    endTime = dateEnd.Format("%Y-%m-%d ") +timeEnd.Format("%H:%M:%S");
    

Format那里出错出现,换release就不会有问题!
Debug Assertion Failed! 
proogram:…….exe 
File:afx.inl 
Line:122
debug

------解决方案--------------------
引用:
Quote: 引用:

CTime::Format 
CString Format( LPCTSTR pFormat ) const;

CString Format( UINT nFormatID ) const;
返回的是常量对象,你不可能对常量对象用重载算符+号的
dateStart.Format("%Y-%m-%d ") + timeStart.Format("%H:%M:%S")  <-不能这么搞
下面这样
startTime  = dateStart.Format("%Y-%m-%d ");
startTime += timeStart.Format("%H:%M:%S"); 

貌似不是这个的原因, 我改成下面这样,还是会出问题
    startTime = dateStart.Format("%Y-%m-%d ");// + timeStart.Format("%H:%M:%S");
    endTime = dateEnd.Format("%Y-%m-%d ");// +timeEnd.Format("%H:%M:%S");
    

我这是没问题的

CString startTime;
CTime   dateStart;
dateStart = CTime::GetCurrentTime();
startTime = dateStart.Format("%Y-%m-%d ");
TRACE(startTime);
TRACE("\n");

------解决方案--------------------
CTime的Format疏失
既然出错了,打开堆栈窗口看看错误代码定位在哪里,分析一下。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

File:afx.inl 
Line:122 
afx.inl 122 行是啥?

120// CString
121 _AFX_INLINE CStringData* CString::GetData() const
122 { ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
 


引用:
撸主果断rebuild all 一下

rebuild 很多次, debuger也删除过! release下程序不会有问题!!!


release下没问题更危险,我想撸主是不是哪块程序段把内存搞乱了

这种怎么去查?


局部删减代码,缩小范围定位
------解决方案--------------------
   CString startTime,endTime;
    CTime dateStart, timeStart, dateEnd, timeEnd;
    ((CDateTimeCtrl*)(GetDlgItem(IDC_DATE_START)))->GetTime(dateStart);
    ((CDateTimeCtrl*)(GetDlgItem(IDC_DATE_END)))->GetTime(dateEnd);
    ((CDateTimeCtrl*)(GetDlgItem(IDC_TIME_START)))->GetTime(timeStart);
    ((CDateTimeCtrl*)(GetDlgItem(IDC_TIME_END)))->GetTime(timeEnd);
     
    startTime = dateStart.Format("%Y-%m-%d ") + timeStart.Format("%H:%M:%S");
    endTime = dateEnd.Format("%Y-%m-%d ") +timeEnd.Format("%H:%M:%S");
=====
引自你的代码,我发现很多程序喜欢这种方式。这可能会少打几个字,但出现问题后就会不知所措
我觉得
 CDateTimeCtrl* temp = (CDateTimeCtrl*)GetDlgItem(IDC_TIME_START);
ASSERT(temp!=NULL)
tmep->Gettime(starttime);
会更好一些