Traduction du C vers Ada

Traduction du C vers Ada - Divers - Programmation

Marsh Posté le 11-07-2012 à 21:45:13    

Bonjour,
 
Je voudrais traduire ceci :
 

Code :
  1. #define Pm_Message(status, data1, data2) \
  2.         ((((data2) << 16) & 0xFF0000) | \
  3.          (((data1) << 8) & 0xFF00) | \
  4.          ((status) & 0xFF))
  5. #define Pm_MessageStatus(msg) ((msg) & 0xFF)
  6. #define Pm_MessageData1(msg) (((msg) >> 8) & 0xFF)
  7. #define Pm_MessageData2(msg) (((msg) >> 16) & 0xFF)


 
Avec Ada.
Deux chose : je ne connais pas la signification de ces macros et donc, je sais encore moins comment le traduire.
Peut-être qu'en répondant au premier problème, je résoudrait le second.
Je e suis pas de la partie C, c'est pourquoi, je traduit vers Ada.
Merci pour vos réponses.

Reply

Marsh Posté le 11-07-2012 à 21:45:13   

Reply

Marsh Posté le 11-07-2012 à 23:24:24    

<< est le décalage de bit (>> dans le sens contraire) et & est le ET logique et | est le OU logique
et le \ sert a continuer la macro sur la ligne suivante


Message édité par breizhbugs le 11-07-2012 à 23:26:40

---------------
Seul Google le sait...
Reply

Marsh Posté le 12-07-2012 à 09:58:34    

Merci breizhbugs.

Reply

Marsh Posté le 13-07-2012 à 16:07:24    

Bonjour,
 
Voilà ce que donne la fonction Ada de la macro Pm_Message :

Code :
  1. --
  2.   function Pm_Message(Status, Data1, Data2 : Interfaces.C.Long) return Interfaces.C.Long is
  3.  
  4.      Message : Unsigned_32 := 0;
  5.      Low     : Unsigned_32 := Unsigned_32(Data2);
  6.      Middle  : Unsigned_32 := Unsigned_32(Data1);
  7.      High    : Unsigned_32 := Unsigned_32(status);
  8.   begin
  9.      Message := ((Shift_Left(Low, 16) and 16#FF0000#) or
  10.                     (Shift_Left(middle, 8) and 16#FF00#) or
  11.                     (high and 16#FF#));
  12.  
  13.      return Interfaces.C.Long(Message);
  14.   end Pm_Message;


 
Ce que je cherche, c'est un moyen de me passer de corps de paquetage, autrement dit, comment en faire une macro avec Ada. j'ai cherché un peu mais je crois bien que ce soit impossible.

Message cité 1 fois
Message édité par Profil supprimé le 13-07-2012 à 16:08:14
Reply

Marsh Posté le 13-07-2012 à 16:38:35    


 
Le preprocessor cpp est indépendant du langage utilisé.

Message cité 1 fois
Message édité par Anonymouse le 13-07-2012 à 16:42:25
Reply

Marsh Posté le 13-07-2012 à 16:55:28    

Anonymouse a écrit :


 
Le preprocessor cpp est indépendant du langage utilisé.


 
Ah, si tu me dis ça, c'est que j'ai une chance...
 
Par exemple ?

Reply

Marsh Posté le 13-07-2012 à 17:29:05    


 
Un fichier macro.h
 

Code :
  1. #define Pm_Message(status, data1, data2) \
  2.             ((((data2) << 16) & 0xFF0000) | \
  3.              (((data1) << 8) & 0xFF00) | \
  4.              ((status) & 0xFF))
  5.            
  6. #define Pm_MessageStatus(msg) ((msg) & 0xFF)
  7. #define Pm_MessageData1(msg) (((msg) >> 8) & 0xFF)
  8. #define Pm_MessageData2(msg) (((msg) >> 16) & 0xFF)


 
Un fichier qui n'est même pas du code : test.txt
 

Code :
  1. #include "macro.h"
  2. N importe quoi
  3. Pm_MessageStatus(10);
  4. N importe quoi


 
La commande:

Code :
  1. cpp -P -I . non_code.txt prepro.txt


 
Le résultat prepro.txt
 

Code :
  1. N importe quoi
  2. ((10) & 0xFF);
  3. N importe quoi


 
T'intègre la commande dans la chaine de compilation pour compiler le résultat issu du préprocesseur.

Message cité 1 fois
Message édité par Anonymouse le 13-07-2012 à 17:29:52
Reply

Marsh Posté le 13-07-2012 à 17:39:21    

Anonymouse a écrit :


 
Un fichier macro.h
 

Code :
  1. #define Pm_Message(status, data1, data2) \
  2.             ((((data2) << 16) & 0xFF0000) | \
  3.              (((data1) << 8) & 0xFF00) | \
  4.              ((status) & 0xFF))
  5.            
  6. #define Pm_MessageStatus(msg) ((msg) & 0xFF)
  7. #define Pm_MessageData1(msg) (((msg) >> 8) & 0xFF)
  8. #define Pm_MessageData2(msg) (((msg) >> 16) & 0xFF)


 
Un fichier qui n'est même pas du code : test.txt
 

Code :
  1. #include "macro.h"
  2. N importe quoi
  3. Pm_MessageStatus(10);
  4. N importe quoi


 
La commande:

Code :
  1. cpp -P -I . non_code.txt prepro.txt


 
Le résultat prepro.txt
 

Code :
  1. N importe quoi
  2. ((10) & 0xFF);
  3. N importe quoi


 
T'intègre la commande dans la chaine de compilation pour compiler le résultat issu du préprocesseur.


 
 
Mais merci pour l'exemple, merci beaucoup même.
Je crois finalement que ma version soit d'avantage portable.
Qu'en penses- tu ? Si je peux me permettre !

Reply

Marsh Posté le 14-07-2012 à 14:09:04    

Si le "préprocessor cpp" est indépendant du langage, le corps de la macro lui ne l'est pas: le <<, >> & et | sont propre au langage et apparemment pas en ada?


---------------
Seul Google le sait...
Reply

Marsh Posté le 14-07-2012 à 14:17:00    

Pour les décalages effectivement il faut utiliser les fonction du paquetage Interfaces.
 
Pour les "et" et les "ou" il y a respectivement les "and" et "or" qui permettent de faire des opération logique sur des modulo.

Reply

Sujets relatifs:

Leave a Replay

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