FWIW, COBOL can now call by value, if desired.

given:

int cfunc (int x, double x, struct t *p);

do this:
call 'cfunc' using value cobol-fullword cobol-double
                   reference cobol-structure  

             returning ret-fullword


Frank




>________________________________
>From: Bernd Oppolzer <[email protected]>
>To: [email protected]
>Sent: Sunday, November 6, 2011 1:10 PM
>Subject: Re: C newbie - pass a LDAP handle out to calling routine
>
>When calling C routines from other languages like COBOL or PL/1 (or FORTRAN),
>you have to take into account that in C the parameters are passed "by value", 
>whereas
>the other languages pass them "by reference", that is, addresses of the 
>variables.
>
>The solution is simple: to construct your C routines so that they can be 
>called from
>other languages, put a star on every parameter, so that C expects pointers 
>instead
>of values. Of course, when accessing the parameters inside the C functions,
>you have to specify the stars, too.
>
>that is:
>
>int cfunc (int *x, double *x, struct type *p, ..);
>
>Furthermore, the result type should be int, so that other languages can read 
>the
>return code from the C function result.
>
>If the parameter type is pointer, you need two stars, of course (that was your 
>point).
>
>Of course, this does not solve all the problems. You have still the issue with 
>char strings,
>which are in fact vectors of single chars, so there is already a star. And you 
>need to
>unterstand that when passing vectors as parameter, you normally pass the 
>starting address.
>
>And, with languages like PL/1, you have the locator/descriptor problem. But 
>that's
>another topic and has nothing to do with C.
>
>Kind regards
>
>Bernd
>
>
>
>Am 06.11.2011 20:08, schrieb Gibney, Dave:
>> With the assistance of several folks over on MVS-OE, I solved my problem. It 
>> is clear here that I did fail in the original question to be clear enough 
>> that my driving program is not C. The whole intent was to be able to pass 
>> that address from ldap_init back out to the non C driver so that it could be 
>> reused by the thousands of calls. The solution was: extern int ret2nat (int 
>> *back_value, LDAP **ld, char *msg) This pointer to a pointer format allows 
>> the fullword in the calling non C program hold the LDAP handle from call to 
>> call.
>
>----------------------------------------------------------------------
>For IBM-MAIN subscribe / signoff / archive access instructions,
>send email to [email protected] with the message: GET IBM-MAIN INFO
>Search the archives at http://bama.ua.edu/archives/ibm-main.html
>
>
>

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html

Reply via email to