|
Both Barbara's and mine example ought to work. I like Barbara's approach
better as it allows handling of varying data types, so I just tried it out.
Here are the results:
/*START C member source */
#include <stdio.h>
#include <decimal.h>
typedef struct inputArguments
{
char * pgmname;
char * userid;
decimal(10,2) * salary;
int * custno;
} main_args_t;
void main(int argc, main_args_t * main_args)
{
printf("1st arg = %s, 2nd arg = %s, 3rd arg = %D(10,2), 4th arg = %d",
main_args->pgmname, main_args->userid,
*main_args->salary, *main_args->custno);
}
/* END C member source */
Not sure if you're aware of it, but argv[0] is initialized implicitly by the
OS to the fully qualified program name (i.e. ELVIS/INPTST). So, first
argument is always a char *, as illustrated in the struct with the leading
pgmname variable.
To compile the C source, I used this command:
CRTBNDC PGM(ELVIS/INPTST) SRCFILE(ELVIS/C) OUTPUT(*print) DBGVIEW(*ALL)
/* START *CMD source */
CMD PROMPT('Command with 3 arguments')
PARM KWD(USERID) TYPE(*CHAR) LEN(10)
PARM KWD(SALARY) TYPE(*DEC) LEN(10 2)
PARM KWD(CUSTNO) TYPE(*INT4)
/* END *CMD source */
Note that there is no 'pgmname' keyword, as it's passed implicitly by the
OS.
To compile the *CMD source, I used this command:
CRTCMD CMD(ELVIS/INPTST) PGM(ELVIS/INPTST) SRCFILE(ELVIS/CMD)
Then, to test the program, I invoked my command as:
INPTST USERID(MYUSERID) SALARY(3300.44) CUSTNO(77)
And got the following output:
1st arg = ELVIS/INPTST, 2nd arg = MYUSERID , 3rd arg = 3300.44, 4th arg =
77
Hth, Elvis
Celebrating 11-Years of SQL Performance Excellence on IBM i, i5/OS and
OS/400
www.centerfieldtechnology.com
-----Original Message-----
Subject: Re: [C400-L] Submit a program call
Back again... I tried out both Elvis' and Barbara's (I hope a first name
basis is ok!) solutions but I can't even get a compile:
"A parameter of type "main_args_t *" cannot be initialized with an
expression of type "char **"."
After taking a closer look at the language ref manual it seems as though one
*has* to pass char **? Just seems so incredibly awkward that I, just to
perform a simple SBMJOB on the call to this program, would need to go
through a CL program and manually append null terminators etc... (which is
what they do in the Programmer's guide when calling C from CL).
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.