Re: bug d'interfacage avec le c

Thomas De Contes <[email protected]>
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>
Le jeudi, 7 juin 2007, à 13:44 Europe/Paris, Ali Bendriss a écrit :

> Salut,
>
> tu peux essayer la modif en attachement sur to code.

Merci bcp, ça marche :-)
Je vais le proposer comme modif à Samuel Tardieu <[email protected]> si 
il n'a pas encore fait le nécessaire :-)


Par contre, il reste un truc qui me turlupine :

> On Thursday 07 June 2007 12:20, Thomas De Contes wrote:
>
>> sur [email protected] , John B. Matthews MD m'a dit :
>>> Recall that inet_addr returns an unsigned long.
>>> Your code had the effect of converting the unsigned long to a pointer
>>> to a record.
>>
>> alors j'aimerais avoir les idées claires sur une chose :
>>
>> Je savais qu'un record pouvait être traduit en "pointeur sur un 
>> record"
>> dans certains cas, où la structure de données est assez complexe par
>> exemple
>> Mais je croyais que dans des cas simples comme ça, les données du
>> record étaient alignées dans la mémoire directement, sans passer par 
>> un
>> pointeur
>>
>> Je me trompais ? Il y a un pointeur absolument à chaque fois ?


Si le record est traduit en "pointeur sur un record" (d'ailleurs même 
si c'est pas le cas, du moment que c'est constant),
je ne vois pas la différence entre

    type In_Addr is record
       S_B1, S_B2, S_B3, S_B4 : C.unsigned_char;
    end record;
    pragma Convention (C, In_Addr);

    function C_Inet_Addr
      (Cp : Strings.chars_ptr)
       return In_Addr;
    pragma Import (C, C_Inet_Addr, "inet_addr");

et

    type In_Addr is record
       S_B1, S_B2, S_B3, S_B4 : C.unsigned_char;
    end record;
    pragma Convention (C, In_Addr);

    function C_Inet_Addr
      (Cp : Strings.chars_ptr)
       return C.unsigned;
    pragma Import (C, C_Inet_Addr, "inet_addr");

    function To_In_Addr is new Ada.Unchecked_Conversion (Source => 
C.unsigned, Target => In_Addr);

puisque dans les 2 cas, le unsigned est traduit en In_Addr de façon 
"brutale"
La seule différence c'est que dans le 1er cas le changement de type est 
fait au moment de l'interfacage avec le c, et dans le 2eme cas le 
changement de type est fait juste après, avec Unchecked_Conversion

Et *chez moi, dans les mêmes conditions de compilation et d'exécution*, 
le 1er ne marche pas et le 2eme marche ...


Est ce que quelqu'un pourrait m'expliquer ça, svp ? :-)



> Sinon, la page de manuel de mon system (man inet_addr) precise que
>  The inet_addr() function  is an obsolete interface to inet_aton(),  
> described
> immediately  above;  it  is  obsolete  because  -1  is  a  valid  
> address
> (255.255.255.255), and inet_aton() provides a cleaner way to indicate 
> error
> return.

Oui, Samuel Tardieu viens de me l'indiquer aussi :-)

> Je ne pense pas que adasockets utilise inet_addr,

Non, pas la dernière version, il l'a indiqué sur sa liste de diffusion,
Mais je pense que si il a juste changé de fonction sans rien changer 
autour, le problème est resté



> as tu essaye les examples du package ?

Oui, et ça ne marchait pas, c'est pour ça que j'ai fait ce petit 
programme (pour essayer de circonscrire le problème)

Et toi, as tu adasockets ou pas ?
Si oui, tout marche comme il faut ?
Si non, mon petit programme de test (original), chez toi il marche 
comme il faut ou pas ?

(Je pose ces questions pour finir de circonscrire le problème)


-- 
Mon CV : http://tDeContes.hd.free.fr/divers/emploi/

_______________________________________________
Site WWW de l'association Ada-France: http://www.ada-france.org/
[email protected]
http://www.ada-france.org/mailman/listinfo/ada-france
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.