2009-11-10 118 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); 
    } 
}; 

除此之外,區分時間差和「絕對」時間值是一個好主意。你可以添加兩個時間差異,但你不能添加兩個'日曆'值。