[Résolut]Traduction du C++

Traduction du C++ [Résolut] - C++ - Programmation

Marsh Posté le 10-08-2009 à 14:32:24    

Bonjour,
 
Je souhaite utiliser une bibliothèque avec C++  avec Ada et je dois importer chaque function.
Pour info il s'agit de la bibliothèque libportmidi.
 
Dans le portmidi.h je trouve une fonction :
 

Code :
  1. PmError Pm_OpenOutput( PortMidiStream** stream,
  2.                 PmDeviceID outputDevice,
  3.                 void *outputDriverInfo,
  4.                 long bufferSize,
  5.                 PmTimeProcPtr time_proc,
  6.                 void *time_info,
  7.                 long latency );


 
Dont je voudrai connaître le type de données attendu ligne 3 et 6 s'il vous plaît, Merci.


Message édité par The matrix le 12-08-2009 à 20:33:14

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 10-08-2009 à 14:32:24   

Reply

Marsh Posté le 10-08-2009 à 15:03:21    

Voir la documentation de la bibliothèque. Le type "void*" est un pointeur générique.

Reply

Marsh Posté le 10-08-2009 à 15:36:01    

Merci Elmoricq.


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 11-08-2009 à 02:06:03    

Salutations, bien ?
j'en ai un autre à traduire qui est ::= typedef void PortMidiStream.
Pour l'instant j'ai tradui par le type System.Address;  Mais ça tourne pas.
Merci !


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 11-08-2009 à 08:53:58    

Bonjour, pour le type ci dessus, je me suis arangé avec des gens bien sympa, qui bosse la nuit, et qui font pas semblant comme certain ici  [:frag_facile]  
 
Bref !  [:dawa_neowen]  
 
j'ai déclaré un type record null; end record, j'ai instancié System.Address_To_Access_Conversions avec.
J'ai déclaré un pointeur sur un record que j'ai initialisé et je passe l'adresse de l'objet.
Ingénieux non ....   [:dawa_neowen]


Message édité par The matrix le 11-08-2009 à 08:54:34

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 11-08-2009 à 09:07:35    

Hm. Ici c'est un forum, pas un repaire de psychopathes qui fournissent un support 24h/24.

Reply

Marsh Posté le 11-08-2009 à 09:10:25    

Elmoricq a écrit :

Hm. Ici c'est un forum, pas un repaire de psychopathes qui fournissent un support 24h/24.


[:rofl] Psychomachin... je le répéterais pas, mais c'est tentant  :o  


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 11-08-2009 à 10:51:52    

Si je mettais les valeurs suivantes : (0x90, 60, 100)
Dans cette variable : long Message;
les la manière suivante :

Code :
  1. #define Pm_Message(status, data1, data2) \
  2.         ((((data2) << 16) & 0xFF0000) | \
  3.          (((data1) << 8) & 0xFF00) | \
  4.          ((status) & 0xFF))


Obtiendrais-je cet entier : 100601440 ?
Ou cellui-ci : 144060100 ?
S'il vous plaît ? Merci !

Message cité 1 fois
Message édité par The matrix le 11-08-2009 à 10:55:26

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 11-08-2009 à 11:03:06    

Ca arrive souvant les double_fault ?
 
Parait que c'est soit ça, soit un device qu'est pas là ou il devrait être.
 
Je suis embêté là ! :/


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 11-08-2009 à 15:32:42    

The matrix a écrit :

Si je mettais les valeurs suivantes : (0x90, 60, 100)
Dans cette variable : long Message;
les la manière suivante :

Code :
  1. #define Pm_Message(status, data1, data2) \
  2.         ((((data2) << 16) & 0xFF0000) | \
  3.          (((data1) << 8) & 0xFF00) | \
  4.          ((status) & 0xFF))


Obtiendrais-je cet entier : 100601440 ?
Ou cellui-ci : 144060100 ?
S'il vous plaît ? Merci !


 
 
 
Up !  
Vous avez pas une petite idée ? s'il vous plaît ?  
100060144 ou 144060100
 
Merci !


Message édité par The matrix le 11-08-2009 à 15:33:19

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 11-08-2009 à 15:32:42   

Reply

Marsh Posté le 12-08-2009 à 10:42:33    

Up !
 
S'il vous plaît, merci. Bonnes journées.


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 12-08-2009 à 10:47:52    

J'en ai pas la moindre idée. Mais tu ne peux pas tester ? Genre afficher le résultat ?

Reply

Marsh Posté le 12-08-2009 à 11:02:57    

alexandre_j a écrit :

J'en ai pas la moindre idée. Mais tu ne peux pas tester ? Genre afficher le résultat ?


 
Yep !
 
C'était une idée !
 
Alors, j'ai fait ça :

Code :
  1. #include <portmidi.h>
  2. #include <stdio.h>
  3.  
  4. int main (void) {
  5.  printf("%i", Pm_Message(0x90, 60, 100));
  6. }


 
Est ça donne "6569104" Rien à voir avec mes résultats... :fou:  


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 12-08-2009 à 15:44:42    

montre ton code

Message cité 1 fois
Message édité par Joel F le 12-08-2009 à 15:45:12
Reply

Marsh Posté le 12-08-2009 à 15:58:23    

Joel F a écrit :

montre ton code


Ste plais !


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 12-08-2009 à 15:59:52    

Code :
  1. function Hex_Image(Num : Integer) return String is
  2.      Image : String(1..9);
  3.      Last  : Positive := 9;
  4.      Number : Integer := num;
  5.      type Hexa_Digit is
  6.        ('0', '1', '2', '3', '4', '5', '6', '7',
  7.         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
  8.  
  9.      Rest : Integer;
  10.   begin
  11.      loop
  12.  
  13.         Rest := (Number rem 16);
  14.         image(Last) := Character'Value(Hexa_Digit'image(Hexa_Digit'val((Rest))));
  15.         number := Number - rest;
  16.  
  17.         Last := Last - 1;
  18.         exit when (Number rem 16) = 0;
  19.      end loop;
  20.      image(Last) := Character'Value(Hexa_Digit'image(Hexa_Digit'val(Number/16)));
  21.      return Image(Last..Image'length);
  22.   end Hex_Image;
  23.  
  24.  
  25.  
  26.   type String_Access is access String;
  27.  
  28.  
  29.   File : Text_Io.File_Type;
  30.   Filename : constant String := "Harmonie.tmp";
  31.   Last : Natural;
  32.   function Pm_Message(Message : T_Message) return Interfaces.C.Long is
  33.  
  34.      Result : Interfaces.C.Long := 0;
  35.  
  36.      Hexa_String : String_Access := new String '
  37.        ( Hex_Image(Message.Data2) &
  38.         Hex_Image(Message.Data1) &
  39.          Hex_Image(Message.Status));
  40.   begin
  41.      Text_Io.Put_Line("Status : " & Hex_Image(Message.Status));
  42.      Text_Io.Put_Line("Data1 : " & Hex_Image(Message.Data1));
  43.      Text_Io.Put_Line("Data2 : " & Hex_Image(Message.Data2));
  44.      Text_Io.Create(File, Out_File, Filename);
  45.      Text_Io.Put(File, "16#" & Hexa_String.all & '#');
  46.      Text_Io.Close(File);
  47.      Text_Io.Open(File, In_File, Filename);
  48.      Long_io.Get(File, Result);
  49.      return Result;
  50.   end Pm_Message;


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 12-08-2009 à 16:06:29    

Voici pour l'import du portmidi.h
 

Code :
  1. with Porttime;
  2. with System;
  3. with Interfaces.C;
  4. with System.Address_To_Access_Conversions;
  5. package Portmidi is
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.   type PmError is (pmNoErro,
  13.                    PmHostError,
  14.                    pmInvalidDeviceId,
  15.                    pmInsufficientMemory,
  16.                    pmBufferTooSmall,
  17.                    pmBufferOverflow,
  18.                    pmBadPtr,
  19.                    pmBadData,
  20.                    pmInternalError,
  21.                    PmBufferMaxSize);
  22.  
  23.   type T_PortMidiStream is
  24.     record
  25.        null;
  26.     end record;
  27.  
  28.  
  29.  
  30.  
  31.  
  32.   package Pm_Stream_Conversion is new System.Address_To_Access_Conversions(T_PortMidiStream);
  33.   use Pm_Stream_Conversion;
  34.  
  35.  
  36.   type T_ErrorText is new Interfaces.C.Char_Array(0..10);
  37.  
  38.   function Pm_GetErrorText( Errnum : PmError  ) return T_ErrorText;
  39.   Pragma Import (C, Pm_GetErrorText, "Pm_GetErrorText" );
  40.  
  41.   type DeviceInfo is
  42.      record
  43.         StructVersion : Integer;
  44.         Interf : System.address;
  45.         Name : System.Address;
  46.         Input : Integer;
  47.         Output : Integer;
  48.         Opened : integer;
  49.      end record;
  50.  
  51.  
  52.   package DeviceInfo_Conversion is new System.Address_To_Access_Conversions(DeviceInfo);
  53.   use DeviceInfo_Conversion;
  54.  
  55.  
  56.   function Pm_HasHostError( PortMidiStream : System.address) return Interfaces.C.Int;
  57.   pragma Import (C, Pm_HasHostError, "Pm_HasHostError" );


 
Voici l'utilisation de portmidi
 

Code :
  1. Pm_Error : PmError;
  2.  
  3.   PortMidiStream_Ptr : Pm_Stream_Conversion.Object_Pointer :=
  4.     new T_PortMidiStream;
  5.  
  6.   OutputDriverInfo_Ptr,
  7.   Time_Info_Ptr : System.Address := Null_Address;
  8.  
  9.  
  10.   Current_DeviceInfo : DeviceInfo;
  11.  
  12.   Device : Natural;
  13.  
  14.   Pt_Error : PtError;
  15.   Resolution : Integer := 1;
  16.   PtCallback,
  17.   UserData : System.Address := Null_Address;
  18.  
  19.   Pm_Event : PmEvent;
  20.  
  21.   Content : T_Message := (16#90#, 60, 100);
  22.  
  23.   Char : Character;
  24.  
  25.   package Long_Io is new Ada.Text_Io.Integer_Io(Interfaces.C.Long);
  26.  
  27. begin
  28.   Pt_Error := Pt_Start(Resolution, PtCallback, UserData);
  29.   Pm_Error := Pm_Initialize;
  30.   New_Line;
  31.   for I in 0..Pm_CountDevices-1 loop
  32.      Current_DeviceInfo := DeviceInfo_Conversion.To_Pointer(Pm_GetDeviceInfo(I)).all;
  33.      if Current_DeviceInfo.Output /= 0 then
  34.         Put(I);
  35.         Put_Line(" : " & To_Ada(To_Pointer(Current_DeviceInfo.Name).all));
  36.      end if;
  37.   end loop;
  38.   New_Line;
  39.  
  40.   Put("Choose device : " );
  41.   Get(Device);
  42.   Pm_Error := Pm_OpenOutput(PortMidiStream => Pm_Stream_Conversion.To_Address(PortMidiStream_Ptr),
  43.  
  44.                             OutputDevice => device,
  45.                             outputDriverInfo => OutputDriverInfo_ptr,
  46.                             BufferSize => 0,
  47.                             Time_Proc => Pt_Time'access,
  48.                             Time_Info => Time_Info_Ptr,
  49.                             latency => 50);
  50.  
  51.   Put_line("Pm_OpenOutput... Ok !" );
  52.   --Put_Line("Address_Image : " & System.Address_Image(Pm_Stream_Conversion.To_Address(PortMidiStream_Ptr)));
  53.   if Pm_HasHostError(Pm_Stream_Conversion.To_Address(PortMidiStream_Ptr)) /= 0 then
  54.  
  55.      Put_line(To_Ada(Pm_GetErrorText(Pm_Error)));
  56.   else
  57.  
  58.      Put_line("PortMidiStream... Ok !" );
  59.   end if;


 
L'exécution s'arrête sur la Pm_HasHostError.
 
Merci pour votre aide.  :jap:


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Sujets relatifs:

Leave a Replay

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