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

  FORUM HardWare.fr
  Programmation
  Ada

  Import de la fonction C Math modf et utilisation.

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Import de la fonction C Math modf et utilisation.

n°2202343
Profil sup​primé
Posté le 09-09-2013 à 21:23:25  answer
 

Bonjour,
 
Je fais pour convertir des coordonnées GPS en degrés décimaux en DMS un import de la fonction de math "modf", mais j'ai un problème à l'utilisation, c'est un peu bizarre ; En effet ma fonction fonctionne si j'affiche la valeur de sortie de "modf", si non, la valeur vaut NaN***********.
Connaîtriez- vous la raison de ce dysfonctionnement ? S'il vous plaît. Merci.
Voici mon import et ma fonction.
 

Code :
  1. with Interfaces.C;
  2. use Interfaces.C;
  3. package body .... is
  4.  
  5.   procedure Modf (X : in Double; Iptr : out Double);
  6.   pragma Import(C, Modf, "modf" );


 
 

Code :
  1. function To_GPS(Decimal_longitude : in Decimal_Longitude_Type;
  2.                   Decimal_Latitude  : in Decimal_Latitude_Type)  return GPS_Coordonates_Type is
  3.  
  4.      GPS_Coordonates : GPS_Coordonates_Type;
  5.      Longitude : Longitude_Coordonate_Type;
  6.      Latitude  : Latitude_Coordonate_Type;
  7.  
  8.      Local : Double := 0.0;
  9.  
  10.      Degree_Int : Double := 0.0;
  11.      Minute_Flo : Double := 0.0;
  12.      Minute_Int : Double := 0.0;
  13.      Second_flo : Double := 0.0;
  14.   begin
  15.  
  16.      -- Longitude convertion                                                                                                                                                                                      
  17.      --                                                                                                                                                                                                            
  18.      Local := Double(Decimal_Longitude);
  19.      if Decimal_Longitude < 0.0 then
  20.         local := local * (-1.0);
  21.      end if;
  22.  
  23.      Modf(Local, Degree_Int);
  24.  
  25.      Minute_Flo := 60.0 * (Local - Degree_Int);
  26.  
  27.      Modf(Minute_Flo, Minute_int);
  28.  
  29.      Second_Flo := 60.0 * (Minute_Flo - Minute_Int);
  30.  
  31.      if Decimal_Longitude < 0.0 then
  32.         Degree_Int := Degree_Int * (-1.0);
  33.  
  34.      end if;
  35.      Longitude.Degr_Lon := Float(Degree_Int);
  36.      Longitude.Minu_Lon := Float(Minute_Int);
  37.      Longitude.Seco_Lon := Float(Second_Flo);
  38.  
  39.  
  40.      Local := Double(Decimal_Latitude);
  41.      if Decimal_Latitude < 0.0 then
  42.         local := local * (-1.0);
  43.      end if;
  44.  
  45.      Modf(Local, Degree_Int);
  46.  
  47.      -- Si je n'affiche pas ça passe pas.                                                                                                                                                                          
  48.  
  49.      Text_Io.Put(double'Image(Degree_int));
  50.  
  51.  
  52.  
  53.      Minute_Flo := 60.0 * (Local - Degree_Int);
  54.      --Text_Io.Put(double'Image(Minute_flo));                                                                                                                                                                      
  55.      Modf(Minute_Flo, Minute_int);
  56.      --Text_Io.Put(double'Image(Minute_Int));                                                                                                                                                                      
  57.      Second_Flo := 60.0 * (Minute_Flo - Minute_Int);
  58.      if Decimal_Latitude < 0.0 then
  59.         Degree_Int := Degree_Int * (-1.0);
  60.  
  61.      end if;
  62.      Latitude.Degr_Lat := Float(Degree_Int);
  63.  
  64.  
  65.      -- En effet Minute_Int vaut : NaN**************                                                                                                                                                              
  66.  
  67.      Latitude.Minu_Lat := Float(Minute_Int);
  68.  
  69.  
  70.  
  71.      Latitude.Seco_Lat := Float(Second_Flo);
  72.  
  73.  
  74.      GPS_Coordonates := (Longitude, Latitude);
  75.      return GPS_Coordonates;
  76.   end To_GPS;

mood
Publicité
Posté le 09-09-2013 à 21:23:25  profilanswer
 

n°2202345
Profil sup​primé
Posté le 09-09-2013 à 21:35:21  answer
 

Je viens de lire le prototype de modf, toute mes excuse, c'est de ma faute, je n'ai qu'a retenir ma confience en chacun.
 
 
Modf est une fonction qui retourn un double, je vais modifier mon import dans ce sens ça devrai fonctionner.
Si non, je reviens.

n°2202347
Profil sup​primé
Posté le 09-09-2013 à 21:40:21  answer
 

Bon, je reviens quand même.
 
Ca fonctionne donc :
 

les Escaldes]
 
 4.25073E+01
 1.53414E+00
Converting decimal to Degree.Minutes.Seconds
Long  42.0°30.0'26.2", Lat   1.0°32.0' 2.9"
X =  4.91816E+02, Y =  3.04971E+02


Message édité par Profil supprimé le 09-09-2013 à 21:40:33

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

  Import de la fonction C Math modf et utilisation.

 

Sujets relatifs
C# ADO.NET DataSet et DataTable[C/C++] Cherche fun en prog à plusieurs (social coding)
[C] Bout de code fonctionne avec gdb mais pas en vrai [Résolu]fonction combinaison en c++
Exercice en Cprogrammation C [aide]
Probleme import csv dans une base de donnéeSQL 3 tables récupérer des informations en fonction d'une variable
J'aimerais créer une fonction bien spéciale aidez-moi un peu svp ;)Fonction récursive R
Plus de sujets relatifs à : Import de la fonction C Math modf et utilisation.


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