Re: COBOL PIC format for a 64 bit unsigned int ("long long") ?



Jim Duff wrote:
Jan-Erik Söderholm wrote:
I am trying to call some COBOL code from a piece of C...

The call from C looks like this :

char cob_inart[16];
unsigned long long cob_insernr;
char cob_utben[16];
char cob_utordnr[16];
int rc;

rc = MES101(cob_inart, cob_insernr, cob_utben, cob_utordnr);

I get a ACCVIO when trying to use the "unsigned long long"
paramater on the COBOL side. I have probably not got the
right PIC clause to match the "unsigned long long", I guess.


"Trying to use" is defined as what? Can we see either the code that
produces the error or the error itself? Preferably both.

Currently it looks like this (in MES101.COB) :

WORKING-STORAGE SECTION.
01 Answer PIC S9(9) COMP.

LINKAGE SECTION.
01 c_inart PIC X(16).
01 c_insernr pic 9(16) comp.


Your COBOL picture clause for the quadword is not wide enough.


01 c_ben PIC X(16).
01 c_ordnr PIC X(16).

PROCEDURE DIVISION USING c_inart c_insernr c_ben c_ordnr
giving Answer.

As soon as I try to do anything with the "c_insernr"
paramater (such as DISPLAY or MOVE) the COBOL code ACCVIO's.

Does anyone have a clue what the PIC clause should look
like to match a "unsigned long long" ?


Try PIC 9(18) COMP.

See <http://h71000.www7.hp.com/doc/82final/6297/6297pro_097.html#vms_usages>

And yes, I have scanned the COBOL and C User Guides and
Ref Manuals, but didn't find anything clear on this point.




Working example:

#include <stdio.h>
#include <stdlib.h>

int main (void) {

extern int MES101 ();

char cob_inart[16] = "INART";
unsigned long long cob_insernr = 123;
char cob_utben[16] = "UTBEN";
char cob_utordnr[16] = "UTORDNR";
int rc;

rc = MES101 (cob_inart, cob_insernr, cob_utben, cob_utordnr);

exit (EXIT_SUCCESS);
}


identification division.
program-id. MES101.
environment division.
data division.
working-storage section.
01 answer pic s9(9) comp.
linkage section.
01 c_inart pic x(16).
01 c_insernr pic 9(18) comp.
01 c_ben pic x(16).
01 c_ordnr pic x(16).

procedure division using c_inart c_insernr c_ben c_ordnr
giving Answer.
00-begin.
display c_inart.
display c_insernr with conversion.
display c_ben.
display c_ordnr.
move 1 to answer.
01-end.
exit.

Jim.

Outputs "INART" (as expected) and then ACCVIO's on the
second DISPLAY. Anyway, see below...

glen herrmannsfeldt wrote:

> I don't know specifically about COBOL, but calls from C to
> many other languages expect the address of, not the value of,
> the arguments. For arrays that happens sort of automatically
> (an array name is a constant pointer to the first element),
> but not for scalars. Try an & in front of the non-array.

and Richard Mahrer wrote :

> Try telling C to send it by reference,


Tried that in Jim's code above, and that made it for his
test code.

And also for my original code. I changed the type of the
"unsigned long long" variable into a "pointer to unsigned
long long", but the effect is the same...

Richard Mahrer also wrote :

> Why you'd be using a quadword to store what is presumably
> an error number (or using C at all for that matter)
> I don't know.

"I don't know" is the key here. No, it's not an "error number".

It's a manufacturing serial number like "yyyywwnnnnn" where
"yyyy" is year, "ww" is the week and "nnnnn" is a counter.

Now this *could* just as well have been a string (no calculations
needed), but it isn't. It's a "bigint" in the Rdb database. Yes,
I could have passed it as a string from the Office/Excel application
and made the string->bigint convert in the COBOL code, and that
would probably have been the "solution" if the "ByRef" (&) above
hadn't worked. But right now it's passed it as a "number" and
I'll see how which way I take in the final code.

B.t.w, FWIW, this is part of the production lines of this kind of stuff :

http://www.douglaslawnmowercentre.com/training/images/front/h560-0012.jpg








.



Relevant Pages

  • Re: COBOL PIC format for a 64 bit unsigned int ("long long") ?
    ... right PIC clause to match the "unsigned long long", ... WORKING-STORAGE SECTION. ... paramater (such as DISPLAY or MOVE) the COBOL code ACCVIO's. ... int main { ...
    (comp.os.vms)
  • The main program is working with two vectors and we can use them together.
    ... External void destroyed; ... External void display; ... int main ( ... Vector v (address of first element and the elements): ...
    (sci.math)
  • Re: A COBOL conundrum
    ... DISPLAY 'Account not at EOF' ... I think the "conundrum" in all of this is not the behaviour of the COBOL ... we HAD to specifically set a flag by moving a value to it. ...
    (comp.lang.cobol)
  • Re: Non-Cobol person getting error code
    ... I neither do have a COBOL ... can then do an informative error display. ... because you have locked yourself in to the DECLARATIVES SECTION ... If it's OO then I invoke the FileErrors ...
    (comp.lang.cobol)
  • Re: simple compression routine
    ... I don't want to link to external routines, just do it with COBOL code. ... char-value pic 9value 0. ... display 9-byte space 8-byte-value ... ABCDEFGHI ...
    (comp.lang.cobol)