2009-11-10 67 views
1

我在调试代码时遇到问题。我有一个结构和一个 函数来计算以HH:MM:SS格式输入的时间差。 我的代码是:结构中的分段错误帮助

const int hourConv = 3600; // used to get total hours from total seconds 
const int minConv = 60; 
struct MyTime { 
    int hours, minutes, seconds; 
}; 

MyTime *determineElapsedTime(const MyTime *time1, const MyTime *time2) 
{ 
     long timeOneSec = time1->hours*hourConv + time1->minutes*minConv + time1->seconds; 
     long timeTwoSec = time2->hours*hourConv + time2->minutes*minConv + time2->seconds; 
     long ans = timeTwoSec - timeOneSec; 
     cout << ans; 
     MyTime *timeDiff; 
     timeDiff->hours = ans/hourConv; 
     timeDiff->minutes = ans % hourConv/minConv; 
     timeDiff->seconds = ans % hourConv % minConv; 
     return timeDiff; 
} 

我相信问题是与第二至最后一行: timeDiff->seconds = ans%hourConv%minConv; ,因为当我评论说,线路输出, 我没有得到一个分段错误。但我不明白为什么 那一行是无效的。任何帮助,将不胜感激。谢谢!

+1

@john你也是一位新手......让他休息一下,这不是复杂的代码。 – 2009-11-10 05:11:44

回答

6

代码包含:

MyTime *timeDiff; 
timDiff->hours = ... 

您已经创建了一个指明MyTime对应的指针,但没有分配任何东西。此时timeDiff为空。

+2

它是空值还是垃圾值? – bbg 2009-11-10 05:12:43

+0

好点(我的Java背景显示:-) – 2009-11-10 05:17:59

+3

我相信在C/C++的价值是不明确的那一点(纠正我,如果我错了) – 2009-11-10 05:18:48

5

你试着用下面的代码来访问未分配的内存:通过手动分配使用新代码

MyTime *timeDiff; 
timeDiff->hours = ans/hourConv; 

虽然可以解决这个问题,如:

MyTime *timeDiff = new MyTime; 
timeDiff->hours = ans/hourConv; 

我强烈建议改变你的函数来返回MyStruct的值,作为堆栈分配的变量。我也建议以参数传递参数:

MyTime determineElapsedTime(MyTime const &time1, MyTime const &time2) 
{ 
    long timeOneSec = time1.hours*hourConv + time1.minutes*minConv + time1.seconds; 
    long timeTwoSec = time2.hours*hourConv + time2.minutes*minConv + time2.seconds; 
    long ans = timeTwoSec - timeOneSec; 
    cout << ans; 
    MyTime timeDiff; 
    timeDiff.hours = ans/hourConv; 
    timeDiff.minutes = ans % hourConv/minConv; 
    timeDiff.seconds = ans % hourConv % minConv; 
    return timeDiff; 
} 
+0

是的,但也请按价值参数! – xtofl 2009-11-10 05:57:35

+0

%hourConv在分配给timeDiff.seconds时没有值。编译器很难发现这一点。 – 2009-11-10 05:59:56

+0

@xtofl:良好的捕获,更新以反映这一点。 – 2009-11-10 06:05:50

1

只是另一种说法:在这种情况下使用OOP。它会使你的代码更具可读性。您最终有更多时间考虑未初始化的内存。

struct MyTime { 
    int hours, minutes, seconds; 
    int timeInSeconds() const { 
     return hours*3600 + minutes*60 + seconds; 
    } 
    // the difference, in seconds 
    int operator-(const MyTime other) const { 
     return timeInSeconds() - other.timeInSeconds(); 
    } 
    void subtract(int seconds) { 
     seconds -= seconds; 
     while(seconds < 0) { seconds += 60; --minutes; } 
     while(minutes < 0) { minutes += 60; --hours; } 
     assert(hours >= 0); 
    } 
}; 

除此之外,区分时间差和“绝对”时间值是一个好主意。你可以添加两个时间差异,但你不能添加两个'日历'值。