Re: bug d'interfacage avec le c
Ali Bendriss <[email protected]>
| Newsgroups | gmane.comp.lang.ada.france |
|---|---|
| Organization | The Dementia Research Centre |
| Message-ID | <[email protected]> |
Salut, tu peux essayer la modif en attachement sur to code. 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. Je ne pense pas que adasockets utilise inet_addr, as tu essaye les examples du package ? On Thursday 07 June 2007 12:20, Thomas De Contes wrote: > Le mercredi, 6 juin 2007, à 15:48 Europe/Paris, Thomas De Contes a > > écrit : > > Le mardi, 5 juin 2007, à 17:44 Europe/Paris, Thomas Quinot a écrit : > >> J'aurais tendance à vérifier qu'il n'y a pas un bug côté utilisateur > > > > ok, sur [email protected] qqn m'a dit à peu près ça > > > > > > j'ai deja signalé le pb à un moment, et je ne sais plus les > > circonstances mais j'avais cru comprendre à ce moment là d'après les > > réponses que j'ai eu que le pb n'était que sous mac os x > > > > http://tDeContes.hd.free.fr/mise-a-disposition/archives/systeme/ > > composants%20systeme/compilateur%20ada/adasockets-1.8.4.7.tar.gz > > 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. > > extrait de v.adb : > > 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"); > > 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 ? > > > PS : > Est ce que qqn voudrais bien me faire passer la dernière version > d'adasockets svp ? > (Si qqn a la dernière version d'adasockets mais n'a pas d'espace web, > il y a http://dl.free.fr/ ) > > Même si ce pb (qui n'est peut être pas un pb sur toutes les > plateformes, j'ai pas bien compris) n'est pas corrigé, > j'ai vu qu'il y avait de toutes façons des corrections et améliorations > qui peuvent tjr être intéressantes :-) -- Ali _______________________________________________ Site WWW de l'association Ada-France: http://www.ada-france.org/ [email protected] http://www.ada-france.org/mailman/listinfo/ada-france
v.patch
(text/x-diff, 1.1 KB)
--- v-old.adb 2007-06-06 18:57:57.237919420 +0100
+++ v-new.adb 2007-06-06 18:57:44.777140672 +0100
@@ -42,7 +42,7 @@
with Interfaces.C; use Interfaces.C;
with Interfaces.C.Strings; use Interfaces.C.Strings;
-
+with Ada.Unchecked_Conversion;
procedure v is
@@ -55,14 +55,17 @@
type In_Addr is record
S_B1, S_B2, S_B3, S_B4 : C.unsigned_char;
end record;
+ for In_Addr'Size use 32;
pragma Convention (C, In_Addr);
function C_Inet_Addr
(Cp : Strings.chars_ptr)
- return In_Addr;
+ 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);
Naming_Error : exception;
@@ -92,7 +95,7 @@
end if;
declare
C_Add : chars_ptr := New_String (Add);
- Converted : constant In_Addr := C_Inet_Addr (C_Add);
+ Converted : constant In_Addr := To_In_Addr (C_Inet_Addr (C_Add));
begin
Free (C_Add);
return Converted;