Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Ada
Ada Forum d'entraide sur la programmation en langage Ada
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/11/2011, 16h29   #1
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Par défaut Pointeur sur C.Char dans une fonction (char * name) importée

Bonjour,

Je voudrais importer un fonction définie avec C de la forme :

Code :
1
2
3
4
int gethostname(
  __out  char *name,
  __in   int namelen
);
J'ai essayer de passer un C.Char_Array, mais j'ai n'importe quoi dans la chaîne.
Et j'ai passé un C.Strings.Chars_Ptr, et là j'ai une erreur à l'exécution :
Citation:
raised INTERFACES.C.STRINGS.DEREFERENCE_ERROR : i-cstrin.adb:191
Si vous saviez comment procéder...
Merci pour votre aide.
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 10h14   #2
Membre confirmé
 
Avatar de Blackknight
 
Homme Frédéric Praca
Ingénieur développement logiciels
Inscription : février 2009
Messages : 140
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Praca
Âge : 38
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2009
Messages : 140
Points : 226
Points : 226
Envoyer un message via AIM à Blackknight Envoyer un message via MSN à Blackknight
Ben, il est où ton code ?
Tu as un exemple d'utilisation dans le Rationale au paragraphe B.2.5.
As-tu utilisé la fonction To_C pour passer un tableau de taille suffisante ou utilises-tu un Char_array directement ?
Blackknight est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 10h28   #3
Membre confirmé
 
Avatar de Blackknight
 
Homme Frédéric Praca
Ingénieur développement logiciels
Inscription : février 2009
Messages : 140
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Praca
Âge : 38
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2009
Messages : 140
Points : 226
Points : 226
Envoyer un message via AIM à Blackknight Envoyer un message via MSN à Blackknight
Finalement, j'ai trouvé deux minutes pour toi et j'ai fait ça
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
with Interfaces.C;
with Ada.Text_IO; use Ada.Text_Io;

procedure GetHostName is
   package C renames Interfaces.C;
   
   procedure gethostname(Target : out C.char_array;
			 Len : Positive);
   pragma Import(C, gethostname, "gethostname");
   
   Name_L : C.Char_array(1..50);  
begin
   GetHostname(Name_l, 50);
   Put_Line("Hostname " & C.To_Ada(Name_L));
end GetHostName;
Et ça marche
Blackknight est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 20h50   #4
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Ah, ben c'est intéressant merci.
Comme gethostname est une fonction, j'avais fait une fonction, donc, je me santais un peu coincé pour les paramètre out de fonction C.
Ca c'est une chose.
Une autre c'est l'utilisation simple de C.Char_Array en lieu est place de (char * )
C'est ce que j'avais passer, mais comme j'étais dans une fonction, aucune chance de retrouver mon résultat.

Merci Blackknight, j'ai pas testé, mais si tu dis que ça marche, je le retiens pour la prochaine fois.

Pour ce coup ci, je me suis simplement tourné vers Gnat.Sockets.Host_Name.
Mais je réviserai certainement mon code.

Merci encore.
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 13h51   #5
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Par défaut Je te dirai quand ce sera résolu.

Parce que passer une procédure en place de fonction...
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 14h27   #6
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
D'ailleurs ça marche pas, ni en fonction ni en procédure.
Ca marche peut-être sur Gnu/Linux, cette solution mais a priori pas sur Windows.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
with Ada.Unchecked_Conversion;
with System;
use System;



with Interfaces.C, Interfaces.C.Strings;
use Interfaces, Interfaces.C, Interfaces.C.Strings;

with Pp.Pp_Io;
use Pp;

with Lcd;

with Ada.Calendar.Formatting;
use Ada.Calendar;
procedure Main is
   
   
   type HANDLE is new Unsigned_32;
   function LoadLibrary (lpFileName : char_array) return HANDLE;
   pragma Import (stdcall, LoadLibrary, "LoadLibrary", "_LoadLibraryA@4");
   
   function GetProcAddress (hModule : HANDLE; lpProcName : char_array)
      return Address;
   pragma Import (stdcall, GetProcAddress, "GetProcAddress", "_GetProcAddress@8");      
   type Hostname_Type is access procedure (Char : out Char_Array; Len : in Int);
   pragma Convention (Stdcall, Hostname_Type);
   function To_Hostname_Type is new Ada.Unchecked_Conversion (Address, Hostname_Type);
   Library : HANDLE  := LoadLibrary (To_C ("Ws2_32"));
   Hostname_Pointer : Address := GetProcAddress (Library, To_C ("gethostname"));
      
   Hostname   : Char_Array(1..8) := (others => nul);
begin
   
   To_Hostname_Type(Hostname_Pointer)(Hostname, 8);
J'ai rien dans ma chaîne hostname.
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 15h12   #7
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Par défaut Changemement de stratégie. [erreur de compilation]

Je change de fonction, je vais chercher gethostname dans win32ada, win32.winsock.gethostname();

déjà mon installe est bidon, puisque je dois fournir le chemin d'accès à la bibliothèque win32.

je compile donc avec la commande suivante :
Code :
F:\LcdParAda_windows-0.0.1a>gnatmake -o LcdParAda src/main.adb -aIsrc/lib/Ada -aIc:/gnat/2010/include/win32ada/ -L C:\GNAT\2010\lib\win32ada\static
Mais j'ai cette erreur.
Code :
1
2
3
4
.\main.o:main.adb:(.text+0x104): undefined reference to `gethostname@8'
collect2: ld returned 1 exit status
gnatlink: error when calling C:\GNAT\2010\bin\gcc.exe
gnatmake: *** link failed.
Encore une autre histoire...
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 16h51   #8
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Par défaut Je reviens sur la version précédante avec ObjectAda

Bonjour, bonjour à tous... Ou re,

Voilà, alors, j'ai la chance d'avoir ce merveilleux outils qu'est un compilateur Ada, mais j'en ai plusieurs en plus.... La j'ai re- sortie un viel ObjectAda de 97 la version 7.1 professionnel...

J'ai chargé la dll Ws2_32 et j'ai passer une procédure défini ainsi :

Code :
1
2
procedure (host : out C.Char_Array;
                                        Data : in C.Int);
Et j'ai l'erreur suivante à la compilation :
Code :
1
2
3
main.adb: Error: line 79 col 47 LRM:6.4.1(3), Parameter mismatch in call, type mismatch for param 1, Item: char_array_access (found char_array).
Front end of ..\..\src\main.adb failed with 1 error. (0 Warnings)
Tool execution failed.
Mais au moins, je sais ce qu'il attend.... Ca nous rajeunis pas...
Plus qu'à trouver le ou est char_array_access.


Même résultta en passant un char_array en mode out, j'ai rien dans ma chaîne. Donc, t'es sur quel système Blacknight ?
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 08h56   #9
Membre confirmé
 
Avatar de Blackknight
 
Homme Frédéric Praca
Ingénieur développement logiciels
Inscription : février 2009
Messages : 140
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Praca
Âge : 38
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2009
Messages : 140
Points : 226
Points : 226
Envoyer un message via AIM à Blackknight Envoyer un message via MSN à Blackknight
J'ai testé sur Ubuntu 11.04 avec la version suivante de Gnat
Code :
1
2
3
4
5
$ gnatmake --version
GNATMAKE 4.4.5
Copyright (C) 1995-2008, Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Je n'ai pas tout de suite les moyens de tester sur un poste Windows mais ça peut se faire ce soir.
D'ailleurs, je peux aussi le faire sur un FreeBSD mais je pense que, dans ce cas, le résultat sera identique à Linux.
Blackknight est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 10h44   #10
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Merci Blackknight !
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 23h30   #11
Membre confirmé
 
Avatar de Blackknight
 
Homme Frédéric Praca
Ingénieur développement logiciels
Inscription : février 2009
Messages : 140
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Praca
Âge : 38
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2009
Messages : 140
Points : 226
Points : 226
Envoyer un message via AIM à Blackknight Envoyer un message via MSN à Blackknight
Bon,
j'ai essayé sur FreeBSD et bien sûr, ça marche.
Pour Windows, c'est une autre paire de manches.
Code :
1
2
3
4
5
6
7
gnatmake gethostname -largs -lws2_32
gnatbind -x gethostname.ali
gnatlink gethostname.ali -lws2_32
.\gethostname.o:gethostname.adb:(.text+0x44): undefined reference to `gethostname'
collect2: ld returned 1 exit status
gnatlink: error when calling C:\GNAT\2011\bin\gcc.exe
gnatmake: *** link failed.
C'est assez bizarre car l'analyse de la DLL ws2_32.dll avec le dependency walker annonce bien la présence de gethostname.
Ceci dit, après étude plus précise, il semblerait que Gnat utilise la version fournie avec le Cygwin intégré.
Du coup, j'ai pas trop de solution en l'état.
A suivre
Blackknight est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 16h46   #12
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Arff, dommage... Merci quand même.
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h45.


 
 
 
 
Partenaires

Hébergement Web