免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3680 | 回复: 15
打印 上一主题 下一主题

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-06 14:08 |只看该作者 |倒序浏览
本人在C++做一个模拟电梯的程序时,在做了CLock模块后调试时,又遭遇内存不能读的头痛问题。本人把代码说明如下:
在CLock.h文件中代码如下:
#ifndef CLOCK_H_INCLUDED_BF66D153
#define CLOCK_H_INCLUDED_BF66D153
#include <time.h>;
#include <sys/timeb.h>;
class Clock
{
  public:
          Clock();
          ~Clock();
          void showToday();
          void showZoneDifference();
          void showTimeZoneName();
          void showPlusMilliseconds();
          void show12HourTime();
          void showUniversalTime();
          void showUNIXTimeAndDate();
          void showSystemDate();
          void showSystemTime();
          void showSecond();

  private:
        char tmpbuf[128],ampm[2];
        time_t ltime;                          //local time
        struct _timeb tstruct;
        struct tm *today,*gmt;
};
#endif /* CLOCK_H_INCLUDED_BF66D153 */
在Clock.cpp中代码如下:
#include "Clock.h"
#include "sys/timeb.h"
#include "sys/types.h"
#include "time.h"
#include "string.h"
#include "stdlib.h"
#include "iostream.h"

void Clock::showSecond()
{

}

void Clock::showSystemTime()
{
        _strtime( tmpbuf );
        cout << "OS Time: " << tmpbuf << '\n';
}

void Clock::showSystemDate()
{
        _strdate(tmpbuf);
        cout << "OS Date: " << tmpbuf << '\n';
}

void Clock::showUNIXTimeAndDate()
{
        time( &ltime );
        cout << "Time in seconds since UTC 1/1/70:\t" << ltime << '\n'
                << "UNIX time and date:\t\t\t" << ctime( &ltime ) << '\n';
}

void Clock::showUniversalTime()
{
        gmt = gmtime( &ltime );
        cout << "Coordinated universal time: \t\t" << asctime(gmt) <<endl;
}

void Clock::show12HourTime()
{
        today = localtime( &ltime );
       
//        if ( today == 0 )
//                exit(1);

        if ( today->;tm_hour >; 12 )
        {
                strcpy(ampm,"M";
                today->;tm_hour -= 12;
        }
       
        if ( today->;tm_hour == 0 )
                today->;tm_hour = 12;

        cout << "12-hour time:\t\t\t\t" << asctime( today ) + 11
                << ampm << endl;
}

void Clock::showPlusMilliseconds()
{
        _ftime( &tstruct );                //additional time information
        cout << "lus milliseconds:\t\t\t" << tstruct.millitm << endl;
}

void Clock::showTimeZoneName()
{
        cout <<"Daylight savings:\t\t\t" << (tstruct.dstflag? "YES":"NO"
                << endl;
}

void Clock::showZoneDifference()
{
        cout << "Zone differnece in seconds from UTC:\t" << tstruct.timezone
                << "Time zone name:\t\t\t\t" << _tzname[0] << endl;
}

void Clock::showToday()
{
        today = localtime( &ltime );
        strftime( tmpbuf, 128,
         "Today is %A, day %d of %B in the year %Y.\n", today );
    cout << tmpbuf << endl;
}

Clock::Clock()
{
        strcpy(ampm,"AM";
        strcpy(tmpbuf,"";
        today = NULL;
        gmt = NULL;
       

        _tzset();        //set time zone from TZ environment variable.
}

Clock::~Clock()
{
}

在驱动程序中代码如下:
int main()
{
        Clock clock;

        clock.show12HourTime();
       
        return 0;
}

问题:编译和连接通过后,就是运行时显示内存不读。错误代码停在箭头处
void Clock::show12HourTime()
{
        today = localtime( &ltime );
       
//        if ( today == 0 )
//                exit(1);

-->;   if ( today->;tm_hour >; 12 )
        {
                strcpy(ampm,"M";
                today->;tm_hour -= 12;
        }
       
        if ( today->;tm_hour == 0 )
                today->;tm_hour = 12;

        cout << "12-hour time:\t\t\t\t" << asctime( today ) + 11
                << ampm << endl;
}
肯请哪位高手不吝指教? 多谢!!!

论坛徽章:
0
2 [报告]
发表于 2004-05-06 15:46 |只看该作者

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!!

是嵌入式设备?

论坛徽章:
0
3 [报告]
发表于 2004-05-06 15:55 |只看该作者

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!!

构造函数中:

  1. void Clock::Clock()
  2. {
  3. strcpy(ampm,"AM");
  4. strcpy(tmpbuf,"");
  5. today = NULL;
  6. gmt = NULL;


  7. _tzset(); //set time zone from TZ environment variable.
  8. }
复制代码

没有给指针成员分配内存。改成这样:

  1. void Clock::Clock()
  2. {
  3. strcpy(ampm,"AM");
  4. strcpy(tmpbuf,"");
  5. today = new sizeof(struct tm);
  6. gmt = new sizeof(struct tm);


  7. _tzset(); //set time zone from TZ environment variable.
  8. }
复制代码

PS:别忘了在析构函数里面释放

论坛徽章:
0
4 [报告]
发表于 2004-05-06 16:10 |只看该作者

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!!

上面的修改还不够充分。 today = localtime( &ltime );  这样以来,你的努力就白费了。

论坛徽章:
0
5 [报告]
发表于 2004-05-06 16:19 |只看该作者

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!!

today = new sizeof(struct tm);
gmt = new sizeof(struct tm);

不需要分配内存。和此无关。

论坛徽章:
0
6 [报告]
发表于 2004-05-06 16:54 |只看该作者

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!!

[quote]原帖由 "whyglinux"]上面的修改还不够充分。 today = localtime( &ltime );  这样以来,你的努力就白费了。[/quote 发表:
我错了……偶怎么犯这种低等错误哩。。。。。。。。。。。。。。。。没脸见人了。。。。。。。。。

论坛徽章:
0
7 [报告]
发表于 2004-05-06 17:47 |只看该作者

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!!

yy_yangy 说得有理,错误不在于为 today 分不分配内存上,因为 today 指向的是静态存储区。

但是这就让人很困惑。在我的机器上运行并没有出现楼主所说的错误。正如yy_yangy所问的那样:是嵌入式设备?,我也怀疑楼主调试程序的时候不是在通用的 PC 机上。

不过,程序中确实存在着一处错误: char tmpbuf[128],ampm[2]; 这一句中 ampm 字符数组要用来保存 "AM" 或 "M" 显然其容量是不足的;数组的长度至少应该是 3(因为还要加上字符串结束标志)。楼主可把这里改过来试试。

论坛徽章:
0
8 [报告]
发表于 2004-05-06 18:05 |只看该作者

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!!

whyglinux说得不错,ampm[2]的长度应为3,因为要有一个结束标志。
不过改过来以后,还是存在同样的问题。 同时,本人说明一点,不是嵌入设备,只是pc而矣。谢谢各个大侠,请再帮帮忙,再给一点提示先??? :-)

论坛徽章:
0
9 [报告]
发表于 2004-05-06 18:21 |只看该作者

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!!

在使用 ltime 之前,先给它赋值。如 time( &ltime ); 难道错误会与此有关?想不通。这个再不行的话,吾已技穷矣!

论坛徽章:
0
10 [报告]
发表于 2004-05-06 18:30 |只看该作者

江湖求急之二:又是一个内存不能读的问题,求教高手大侠指点!!

whyglinux: Thank you!!!!!
     You说得对,先给它赋值。就是使用time( &ltime );这条语句!!!!
problem is OVER! 但为什么呢????老大,我也是青蛙跳水---不通,不通!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP