Import de la fonction C Math modf et utilisation.

Import de la fonction C Math modf et utilisation. - Ada - Programmation

Marsh Posté le 09-09-2013 à 21:23:25    

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;

Reply

Marsh Posté le 09-09-2013 à 21:23:25   

Reply

Marsh Posté le 09-09-2013 à 21:35:21    

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.

Reply

Marsh Posté le 09-09-2013 à 21:40:21    

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
Reply

Sujets relatifs:

Leave a Replay

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