2009-11-10 4 views
1

У меня возникла проблема с отладкой моего кода. У меня есть функция struct и , чтобы вычислить разницу во времени, введенную в формате 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; 
} 

Я считаю, что проблема быть с 2-го по последней строке: timeDiff->seconds = ans%hourConv%minConv; , так как, когда я комментировать эту линию, я не получаю ошибку ошибки сегментации. Но я не понимаю, почему эта строка недействительна. Любая помощь будет оценена по достоинству. Благодаря!

+1

@john, вы были новичком в один момент тоже ... дать парню перерыв, это не сложный код. –

ответ

6

Ваш код содержит:

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

Вы создали указатель Mytime, но ничего не выделяется. timeDiff имеет значение null в этот момент.

+2

Действительно ли это значение null или мусор? – bbg

+0

Хорошая точка (мой фон Java показывает :-) –

+3

Я верю, что в C/C++ значение не определено в этой точке (исправьте меня, если я ошибаюсь) –

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

+0

% hourConv не имеет значения при назначении timeDiff.seconds. Компилятору будет сложно определить это. –

+0

@xtofl: хороший улов, обновленный, чтобы отразить это. –

1

Просто еще одно замечание: используйте ООП в этом случае. Это сделает ваш код более читабельным. У вас будет больше времени, чтобы подумать о неинициализированной памяти.

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); 
    } 
}; 

В дополнение к этому, рекомендуется отличать временные разности и абсолютные значения времени. Вы можете добавить два разных раза, но вы не можете добавить два значения «календарь».

Смежные вопросы