Advertisement
Langage C dans des programmes RPG

Il est possible d'utiliser les fonctions standards du langage C dans des programmes RPG (sous forme d'API : procédures du programme de service QC2LE).

Parmi ces procédures standards, il existe une procédure de tri rapide (comprendre beaucoup plus rapide que le SORT du RPG).

De plus, la comparaison de 2 éléments est à la charge du programmeur : possibilité de trier des tableaux de types simple (numériques, alpha ...), ou de type composé (DS utilisateur).

Voici un exemple de la dite API (iSeries Network pour le code) :

Prototype C de la fonction :

void qsort(void *base, size_t num, size_t width, int(*compare)(const void *key, const void *element));

*base : pointeur sur le début du tableau

num : nombre d'éléments à trier à partir du début du tableau

width : taille en octet d'un élément du tableau

*compare(...) : pointeur sur une procédure de comparaison de 2 éléments du tableau (renvoie un entier <0, 0 ou >0)

 

Code RPG :

H DFTACTGRP(*NO) BNDDIR('QC2LE')

D qsort PR ExtProc('qsort')

D base * value

D num 10U 0 value

D width 10U 0 value

D compare * procptr value

D LastName PR 10I 0

D parm1 like(name)

D parm2 like(name)

D name s 50A

D num_names s 10I 0

D test1 s like(name) dim(10)

c eval test1(1) = 'Bush, George W.'

c eval test1(2) = 'Clinton, Bill'

c eval test1(3) = 'Bush, George H.W.'

c eval test1(4) = 'Reagan, Ronald'

c eval test1(5) = 'Carter, Jimmy'

c eval test1(6) = 'Ford, Gerald'

c eval num_names = 6

c callp qsort(%addr(test1): num_names:

c %size(name): %paddr('LASTNAME'))

c eval *inlr = *on

P LastName B

D LastName PI 10I 0

D parm1 like(name)

D parm2 like(name)

c select

c when parm1 < parm2

c return -1

c when parm1 > parm2

c return 1

c other

c return 0

c endsl

P E