Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide Recherche
2320 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 shared_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 ...


---------------
MetaScale | Mes cartes Magic
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

---------------
Blacker than a moonless night, hotter and more bitter than hell itself... That is coffee.
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


---------------
Blacker than a moonless night, hotter and more bitter than hell itself... That is coffee.
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 shared_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


---------------
MetaScale | Mes cartes Magic
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 shared_ptr
Posté le 14-10-2009 à 20:52:54  profilanswer
 

mais l'adresse de quoi o_O


---------------
MetaScale | Mes cartes Magic
n°1931965
xilebo
t'facon je m'en fous
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.

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

mood
Publicité
Posté le   profilanswer
 


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


Hit-Parade
Copyright © 1997-2012 Hardware.fr SARL / Groupe LDLC / LesNumeriques.com / Version anglaise du site: BeHardware