Secondes en heures...

Secondes en heures... - C - Programmation

Marsh Posté le 14-10-2009 à 19:28:18    

Bonjour,
 
J'ai essayé de coder un programme qui me transforme les secondes en heures minutes et secondes... Ca compile, mais plante à l'exécution. Pouvez-vous me dire ce qui ne va pas? Merci d'avance.
 

Code :
  1. #include <stdio.h>
  2. void Secondes_Hms(int * pSecondes);
  3. int main()
  4. {
  5. int sec = 2400;
  6. int heures=0;
  7. int minutes=0;
  8. int secondes=0;
  9. Secondes_Hms(&sec);
  10. printf("%d heures et %d minutes et %d secondes", heures, minutes, secondes);
  11. return 0;
  12. }
  13. void Secondes_Hms(int * pSecondes)
  14. {
  15. int * pMinutes=NULL;
  16. int * pHeures=NULL;
  17. *pSecondes = *pSecondes%60;
  18. *pMinutes = (*pSecondes/60)%60;
  19. *pHeures = *pSecondes/3600;
  20. }


 

Reply

Marsh Posté le 14-10-2009 à 19:28:18   

Reply

Marsh Posté le 14-10-2009 à 19:58:01    

tes pointeurs sont NULL, et tu les dereference, donc ca plante.
et y a pas de miracle, comment veut tu recupérer tes sorties si tu passes pas heure,minute,secodnes en entrée ...

Reply

Marsh Posté le 14-10-2009 à 20:01:44    

Ici, tu utilises des pointeurs qui pointent vers l'adresse mémoire "NULL" qui, comme son nom l'indique, représente le grand nul part, le néant, les abysses.
Autant dire que dès que tu vas exécuter ton programme, le système d'exploitation va l'arrêter immédiatement pour cause de tentative d'accès à une adresse mémoire invalide.

 

Donc, pourquoi utiliser des pointeurs d'entiers, et pas simplement des entiers ?

 

Autre chose : tu as une fonction, qui utilise des variables "pSecondes", "pMinutes", etc. Une autre fonction (main() n'est qu'une fonction presque comme les autres) utilise des variables "heures", "minutes", etc.
Rien qu'avec le nom de ces variables, tu devrais te dire qu'il n'y a strictement aucun rapport entre elles.
Mais, mieux encore, même si elles portaient le même nom, elles seraient distinctes et indépendantes (la variables "heures" de main() n'appartenant qu'à main() et étant différente de la variable "heures" d'une autre fonction lambda).

 

Ce qui m'amène à croire que tu as tenté de reproduire les mécanismes de passage de paramètres par adresse, sans les comprendre.
Un petit lien explicatif en ce cas : http://www.bien-programmer.fr/note [...] e_variable


Message édité par Elmoricq le 14-10-2009 à 20:02:51
Reply

Marsh Posté le 14-10-2009 à 20:04:45    

Merci pour vos réponses! N'y-a-t-il pas possibilité, avec une fonction ne prenant en paramètre que les secondes, de pouvoir faire ce que je souhaite?

Reply

Marsh Posté le 14-10-2009 à 20:11:55    

Ben si, il suffit de déplacer le printf() dans la fonction. :o

Reply

Marsh Posté le 14-10-2009 à 20:23:28    

J'ai un peu modifié, mais cela n'est guère mieux (et j'ai pourtant l'impression d'avoir saisi le cours sur les pointeurs, & pour l'adresse, * pour la valeur sur laquelle il pointe..)
 

Code :
  1. #include <stdio.h>
  2. void Secondes_Hms(int * secondes);
  3. int main()
  4. {
  5. int heures=0;
  6. int minutes=0;
  7. int secondes=2400;
  8. Secondes_Hms(&secondes);
  9. return 0;
  10. }
  11. void Secondes_Hms(int * secondes)
  12. {
  13. int * heures;
  14. int * minutes;
  15. *secondes = *secondes%60;
  16. *minutes = (*secondes/60)%60;
  17. *heures = *secondes/3600;
  18. printf("%d heures et %d minutes et %d secondes", *heures, *minutes, *secondes);
  19. }


 

Reply

Marsh Posté le 14-10-2009 à 20:37:24    

sauf que tu n'as pas besoin de pointeur dans ta fonction ...
 

Code :
  1. void Secondes_Hms(int secondes)
  2. {
  3. int heures, minutes;
  4. secondes = secondes%60;
  5. minutes = (secondes/60)%60;
  6. heures = secondes/3600;
  7. printf("%d heures et %d minutes et %d secondes", heures, minutes, secondes);
  8. }


 
On est pas en JAVA

Reply

Marsh Posté le 14-10-2009 à 20:46:41    

Il semblerait que l'algo ne fonctionne pas... Et je ne vois pas pourquoi on n'utiliserait pas de pointeurs, il me semble qu'on perd l'adresse sinon!

Reply

Marsh Posté le 14-10-2009 à 20:52:54    

mais l'adresse de quoi o_O

Reply

Marsh Posté le 15-10-2009 à 08:13:15    

dj_titeuf a écrit :

Il semblerait que l'algo ne fonctionne pas... Et je ne vois pas pourquoi on n'utiliserait pas de pointeurs, il me semble qu'on perd l'adresse sinon!


 
 
Salut,
 
Ton algo ne fonctionne pas car tu détruis la valeur de secondes à ta première affectation :
 
secondes = secondes % 60; -> secondes ne vaut plus 2400 mais le reste de la division par 60 (soit 0)
 
du coup les lignes suivantes seront fausses : minutes et heures vaudront 0 car calculés à partir de secondes qui vaut maintenant 0.

Reply

Marsh Posté le 15-10-2009 à 08:13:15   

Reply

Marsh Posté le 15-10-2009 à 08:26:39    

dj_titeuf a écrit :

Et je ne vois pas pourquoi on n'utiliserait pas de pointeurs, il me semble qu'on perd l'adresse sinon!


Il n'y a pas d'adresse à perdre sur cet exercice très simple...les pointeurs n'ont ici aucun semblant d'utilité. D'ailleurs pour un truc aussi court autant tout mettre dans le main() :D


Message édité par skeye le 15-10-2009 à 08:28:03

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-10-2009 à 23:25:56    

dj_titeuf a écrit :

Il semblerait que l'algo ne fonctionne pas... Et je ne vois pas pourquoi on n'utiliserait pas de pointeurs, il me semble qu'on perd l'adresse sinon!


 
Parce que ça ne sert à rien. Certes on peut faire avec (mais à condition d'avoir des pointeurs qui pointent sur quelque chose de valide et non des pointeurs qui pointent sur NULL) et comme quelque chose de valide sera forcément une zone mémoire de type utilisable pour tes calculs (donc une zone mémoire de type int), tant qu'à avoir des pointeurs sur des int autant travailler directement avec les variables de type int.
 
Pour l'exemple, voici ta fonction avec des pointeurs

Code :
  1. void Secondes_Hms(unsigned long secondes)
  2. {
  3.    unsigned long heures, minutes;
  4.  
  5.    unsigned long *ptHeures=&heures;
  6.    unsigned long *ptMin=&minutes;
  7.    unsigned long *ptSec=&secondes;
  8.  
  9.    *ptHeures=(*ptSec) / 3600;
  10.    *ptSec=(*ptSec) % 3600;
  11.  
  12.    *ptMin=(*ptSec) / 60;
  13.    *ptSec=(*ptSec) % 60;
  14.  
  15.    printf("%ul heures et %ul minutes et %ul secondes", *ptHeures, *ptMin, *ptSec);
  16. }


Tu conviendras que c'est totalement inutile et lourd et qu'on aura le même résultat en utilisant directement les variables heures, minutes et secondes


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed