Puede invocar (o llamar) una función C desde un programa EGL. Antes de seguir las instrucciones que se proporcionan a continuación, debe compilar y enlazar el código C tal como se indica en el apartado Funciones C con EGL.
Por ejemplo, la sentencia de invocación de función siguiente llama a la función C sendmsg( )
sendmsg(chartype, 4, msg_status, return_code);
Pasa dos argumentos (chartype y 4, respectivamente) a la función y espera que se devuelvan dos argumentos (msg_status y return_code, respectivamente). Esto queda claro al definir la función en una biblioteca nativa de la forma siguiente:
Library I4GLFunctions type nativeLibrary {callingConvention = "I4GL", dllName = "mydll"} Function sendmsg(chartype char(10) in, i int in, msg_status int out, return_code int out) end end
Los argumentos que se pasan se especifican utilizando el parámetro "in" y los argumentos a devolver se especifican utilizando el parámetro "out".
La función C recibe un argumento entero que especifica cuántos valores se han puesto en la pila de argumentos (en este caso, dos argumentos). Este es el número de valores que se deben sacar de la pila en la función C. La función también necesita devolver valores para los argumentos msg_status y return_code antes de devolver el control al programa EGL. Las funciones externas de extracción se describen en el apartado Recibir valores de EGL; las funciones externas de devolución se describen en el apartado Devolver valores a EGL.
La función C no debe dar por supuesto que se haya pasado el número correcto de valores apilados. La función C debe probar el argumento entero para ver cuántos argumentos EGL tiene apilados.
En este ejemplo se muestra una función C que necesita exactamente un argumento:
int nxt_bus_day(int nargs); { int theDate; if (nargs != 1) { fprintf(stderr, "nxt_bus_day: wrong number of parms (%d)\n", nargs ); ibm_lib4gl_returnDate(0L); return(1); } ibm_lib4gl_popDate(&theDate); switch(rdayofweek(theDate)) { case 5: /* change friday -> monday */ ++theDate; case 6: /* saturday -> monday*/ ++theDate; default: /* (sun..thur) go to next day */ ++theDate; } ibm_lib4gl_returnDate(theDate); /* stack result */ return(1) /* return count of stacked */ }
La función devuelve la fecha del siguiente día hábil después de una fecha dada. Puesto que la función debe recibir exactamente un argumento, la función comprueba el número de argumentos pasados. Si la función recupera un número distinto de argumentos, termina el programa (con un mensaje de identificación.)
Consulta relacionada
Funciones BIGINT para C
Tipos de datos C y tipos primitivos EGL
Crear un componente de biblioteca de EGL
Funciones DATE para C
Funciones DATETIME e INTERVAL para C
Funciones DECIMAL para C
Invocaciones de función
Componente de biblioteca de tipo nativeLibrary
Funciones de pila para C
Funciones de devolución para C
Funciones C con EGL