Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1226 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Secondes en heures...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Secondes en heures...

n°1931875
dj_titeuf
Posté le 14-10-2009 à 19:28:18  profilanswer
 

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


 

mood
Publicité
Posté le 14-10-2009 à 19:28:18  profilanswer
 

n°1931881
Joel F
Real men use unique_ptr
Posté le 14-10-2009 à 19:58:01  profilanswer
 

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 ...

n°1931882
Elmoricq
Modérateur
Posté le 14-10-2009 à 20:01:44  profilanswer
 

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
n°1931883
dj_titeuf
Posté le 14-10-2009 à 20:04:45  profilanswer
 

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?

n°1931887
Elmoricq
Modérateur
Posté le 14-10-2009 à 20:11:55  profilanswer
 

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

n°1931889
dj_titeuf
Posté le 14-10-2009 à 20:23:28  profilanswer
 

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


 

n°1931893
Joel F
Real men use unique_ptr
Posté le 14-10-2009 à 20:37:24  profilanswer
 

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

n°1931899
dj_titeuf
Posté le 14-10-2009 à 20:46:41  profilanswer
 

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!

n°1931901
Joel F
Real men use unique_ptr
Posté le 14-10-2009 à 20:52:54  profilanswer
 

mais l'adresse de quoi o_O

n°1931965
xilebo
noone
Posté le 15-10-2009 à 08:13:15  profilanswer
 

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.

mood
Publicité
Posté le 15-10-2009 à 08:13:15  profilanswer
 

n°1931968
skeye
Posté le 15-10-2009 à 08:26:39  profilanswer
 

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 -
n°1932267
Sve@r
Posté le 15-10-2009 à 23:25:56  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Secondes en heures...

 

Sujets relatifs
auto clic avec timmmer de 5 secondesFaire attendre 1 secondes
action toutes les x secondes en javascriptTransformer des secondes en jour, heure, etc.
extraire Y, m, d, H, i, s d'une date(' ')Faire une boucle qui dure quelques secondes
Executer une action toute les X secondesConversion durées -> secondes sur un fichier avec sed
Convertir des milisecondes en heures, minutes, secondes, msConvertir des millisecondes en heures-minutes-secondes
Plus de sujets relatifs à : Secondes en heures...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR