2009-11-10 6 views
1

J'ai des problèmes pour déboguer mon code. J'ai une structure et une fonction pour calculer la différence de temps entrée au format HH: MM: SS. Mon code est:Aide sur les erreurs de segmentation dans la structure

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

Je crois que le problème soit avec la 2e à la dernière ligne: timeDiff->seconds = ans%hourConv%minConv; depuis quand je commente cette ligne sur, je ne reçois pas une erreur de défaut de segmentation. Mais je ne comprends pas pourquoi cette ligne est invalide. Toute aide serait appréciée. Merci!

+1

@john vous étiez un débutant à un moment aussi ... donnez une pause au gars, ce n'est pas un code complexe. –

Répondre

6

Votre code contient:

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

Vous avez créé un pointeur MyTime mais rien alloué. timeDiff est null à ce stade.

+2

Est-ce une valeur nulle ou une valeur de déchet? – bbg

+0

Bon point (mon fond Java montre :-) –

+3

Je crois en C/C++ la valeur est indéfinie à ce point (corrigez-moi si je me trompe) –

5

Vous essayez d'accéder à la mémoire non alloué avec le code suivant:

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

Bien que vous puissiez résoudre cette situation en allouant manuellement le code à l'aide de nouveau, comme:

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

je serais très recommande de changer votre fonction pour retourner le MyStruct par valeur, comme une variable allouée par pile. Je vous suggère également de prendre les arguments comme référence passe par const:

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

oui, mais alors s'il vous plaît également prendre les arguments en valeur! – xtofl

+0

% heureConv est sans valeur dans l'affectation à timeDiff.seconds. Il sera difficile pour le compilateur de repérer cela. –

+0

@xtofl: bonne prise, mise à jour pour refléter cela. –

1

Juste une autre remarque: utiliser OOP dans ce cas. Cela rendra votre code beaucoup plus lisible. Vous aurez plus de temps pour réfléchir à la mémoire non initialisée.

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

À côté de cela, il est une bonne idée de faire la différence entre les différences de temps-et valeurs de temps « absolues ». Vous pouvez ajouter deux fois diff, mais vous ne pouvez pas ajouter deux valeurs de «calendrier».

Questions connexes