> Tech > Invoquer des fonctions C depuis un programme RPG ILE

Invoquer des fonctions C depuis un programme RPG ILE

Tech - Par iTPro.fr - Publié le 24 juin 2010
email

par Mike Cravitz
Comment prototyper des fonctions C dans des programmes RPG ILE exactement comme s'il s'agissait de procédures ILE.
ILE offre un riche environnement multilangages. Il est donc facile d'invoquer des programmes écrits par l'utilisateur dans d'autres langages. En fait, depuis un programme RPG ILE, on peut invoquer n'importe quelle fonction C documentée dans la bibliothèque Run Time C/C++.
Comment les fonctions C sont-elles mappées dans un environnement ILE ? En réalité, une fonction C est mise en oeuvre comme une procédure ILE, de telle sorte qu'on peut la prototyper dans un programme RPG ILE puis l'invoquer comme si c'était une sous-procédure RPG ILE normale. C'est précisément ce qu'illustre cet article.

Les fonctions C documentées dans la bibliothèque Run Time C/C++ sont incluses dans plusieurs programmes de services. Heureusement, il n'est pas nécessaire de connaître les noms des programmes de service parce qu'IBM fournit un répertoire de liaison (appelé QC2LE) qui les identifie. Pour pouvoir accéder à  la bibliothèque Run Time C/C++, il suffit d'inclure dans votre programme une spécification de contrôle du type suivant :

H BndDir( 'QC2LE' )



Une fonction C est mise en oeuvre comme une procédure ILE

Pour bien utiliser les fonctions C, le programmeur RPG ILE doit être capable d’interpréter
la documentation de référence du C. Celle à  laquelle je fais référence dans cet
article est le manuel C Library Reference (SC09-2119). Commençons avec un exemple
simple tiré de ce manuel.



La figure 1 présente un extrait concernant la fonction log du C. Celle-ci est
décrite brièvement en A. Il s’agit ici uniquement d’expliquer la manière de lire
la documentation IBM, il n’est donc pas nécessaire de comprendre le concept d’un
logarithme népérien.En B se trouve le nom du membre du fichier physique source
qu’il faut inclure dans ce source au moment de la compilation. Cela ne s’applique
qu’aux programmes écrits en langage C et, par conséquent, est sans conséquence
directe quand on veut invoquer des fonctions C à  partir d’un programme RPG ILE.
Nous verrons cependant que cette information peut parfois s’avérer utile.



La déclaration qui se trouve en C est le prototype de la fonction log. Un prototype
C joue le même rôle qu’un prototype RPG ILE. Il indique au compilateur C quelle
valeur (éventuelle) est renvoyée par la fonction et quels paramètres (éventuels)
doivent être transmis à  la fonction.



La première indication d’un prototype C est le type de donnée renvoyée par la
fonction. Le prototype en C indique que la fonction log renvoie un champ (ou un
objet, appellation des champs en C) de type double. Un type C double correspond
à  un champ en virgule flottante double précision en RPG. Si une fonction C ne
renvoie pas de valeur, la spécification commencera par le mot void, comme ceci
:



void assert(int expression);



La figure 2 donne la correspondance entre quelques types de données C de base
et leurs contreparties en RPG ILE.

La portion suivante du prototype (en C sur la figure 1) est simplement le nom
(log) de la fonction. Il est suivi d’une liste entre parenthèses des paramètres
requis, séparés par des virgules. Dans le cas du prototype en C, on a un paramètre
unique défini comme double x. Le mot double indique que ce paramètre doit être
une valeur à  virgule flottante double précision. Le nom x est tout simplement
un nom officiel comme le sont les noms de paramètres dans des prototypes RPG.
Autrement dit, le paramètre transmis à  cette fonction ne s’appelle pas forcément
x. Mais ce doit être une valeur en virgule flottante double précision.



Tout comme les fonctions C n’ont pas à  renvoyer de valeur, elles n’ont pas besoin
non plus de paramètres. Si une fonction C ne requiert aucun paramètre, la liste
des paramètres dans le prototype C se limitera au simple mot void, comme ceci
:



clock_t clock(void);



Récapitulons l’information de prototype pour la fonction C log. La fonction log
accepte un paramètre en virgule flottante double précision et renvoie une valeur
en virgule flottante double précision. Avant qu’un programme RPG ILE ne puisse
utiliser cette fonction, il doit coder un prototype RPG ILE équivalent à  ce prototype
C, comme illustré par la figure 3.



Notons que la valeur de renvoi et le paramètre sont tous deux définis comme des
champs 8F du fait que le prototype C précise que ce sont tous deux des champs
doubles et, comme le montre la figure 2, 8F est le type à  utiliser pour des champs
doubles en RPG ILE. L’entrée PR indique le mot-clé ExtProc(‘log’). Nous savons
donc que le nom réel de cette procédure est ‘log’. En général, les noms de procédures
ILE font la distinction entre majuscules et minuscules et donc ‘log’ et ‘Log’
sont deux noms différents. Le champ nom de cette carte D, qui indique comment
je souhaite faire référence à  cette procédure dans ce programme RPG ILE, contient
la valeur Log. Les noms de cartes D ne distinguent pas les majuscules des minuscules.
Par conséquent, dans le programme, je peux faire référence à  la fonction ‘log’
C en utilisant Log, LOG ou loG, indifféremment.



La carte D suivant la ligne PR définit le paramètre unique requis par la fonction
C log. En plus d’indiquer que c’est une zone en virgule flottante double précision,
elle utilise le mot-clé Value pour préciser que le paramètre est transmis par
valeur. Toutes les fonctions C s’attendent à  recevoir des paramètres transmis
par valeur. Par conséquent, il faut toujours utiliser le mot-clé Value pour tous
les paramètres quand on prototype une fonction C.



En D, figure 1, on trouve une description plus détaillée de la valeur renvoyée.
La fonction mathématique logarithme népérien n’accepte que des nombres positifs.
Cette description indique ce qui se passe si l’on tente de calculer le logarithme
népérien de zéro ou d’un nombre négatif. Elle indique que si la valeur est négative,
C attribuera la valeur EDOM à  errno. Qu’est ce que cela veut dire ?



La fonction errno est un moyen standard d’indiquer la bonne fin d’une fonction
C. Comme errno est une fonction C, on peut la prototyper et l’invoquer depuis
un programme RPG ILE comme toute autre fonction C. Nous verrons plus loin comment
accéder à  cette fonction dans un programme RPG ILE. Pour l’instant, contentons-nous
de savoir que la fonction errno donne accès à  un champ entier (RPG type I) qui
contient un code numérique décrivant l’erreur. Une valeur errno de zéro indique
que la fonction C n’a pas rencontré d’erreur.



EDOM est une constante numérique C indiquant une erreur de domaine. Un programme
C obtient l’accès à  la fonction errno et à  toutes les valeurs de renvoi possibles,
en définissant la directive de préprocesseur suivante :



#include [ERRNO.H]



C’est très analogue à  la directive de précompilateur /Copy de RPG ILE. Malheureusement,
les programmes RPG ILE ne disposent pas d’un ensemble de modules /Copy similaire.
Il faut donc un petit complément de recherche. Ce complément de recherche n’est
possible que si le produit programme C est installé sur l’AS/400. La bibliothèque
Run Time C est présente sur tous les systèmes AS/400, mais le source C fourni
par IBM n’est disponible qu’avec le produit programme C.



A chaque fois qu’une directive de préprocesseur C #include indique [ANYTHING.H]
, elle recherche dans les fichiers physiques source QSYNCH/H et QCLE/H le membre
ANYTHING. Dans ce cas, le #include trouvera le membre ERRNO dans QCLE/H. La
figure 4 montre les traductions des constantes numériques dans ce membre. Les
programmeurs C peuvent utiliser ces constantes à  peu près de la même manière
que les programmeurs RPG ILE utilisent des constantes nommées. Donc, comme le
montre la première entrée de la figure 4, quand un programme C indique EDOM,
il se réfère en fait à  la valeur numérique 3001. Un programme RPG ILE peut créer
une constante nommée EDOM de la manière suivante :



D EDOM C 3001



La documentation, en D sur la figure 1, fait référence à  une autre constante,
HUGE_VAL, supposée représenter l’infini dans un champ à  virgule flottante. Par
expérience, j’ai constaté que HUGE_VAL est en réalité la valeur hexadécimale
X’7FF0000000000000′ stockée dans un champ à  virgule flottante double précision.
­HUGE_VAL est X’FFF0000000000000′. Un programme RPG ILE peut créer un champ
appelé HUGE_VAL comme illustré figure 5. Un programme RPG ILE peut faire référence
à  HUGE_VAL ou à  ­HUGE_VAL en utilisant cette définition.


Téléchargez gratuitement cette ressource

Guide de Services Cloud Managés

Guide de Services Cloud Managés

Accélérer votre transformation digitale, protéger et sécuriser vos environnements Cloud avec les offres de support, d'accompagnement et de services managés. Découvrez le TOP 3 des Services Managés pour accompagner la transformation de vos environnements Cloud, gagner en agilité et en sécurité dans un monde d'incertitudes.

Tech - Par iTPro.fr - Publié le 24 juin 2010