Because nobody else has a solution so far, I'll try to give some
advice, although I don't see the problem, too. Don't know much about
CEEPIPI.
First:
#pragma map(SDKREAD,"SDKREAD")
is not needed. #pragma map is meant to rename longer names to the classical
linker, which allows only 8 char names, all upper case. But SDKREAD is a
perfect
name for the classical linker, so you don't need this #pragma map.
Then:
I don't think -extern "OS"- is needed. The funktion SDKREAD is extern,
anyway.
I would write the function like this:
int SDKREAD (char *PRINTLine)
{
printf ("SDKREAD Entered \n"); // This executed successfully
//function will be called from assembler
printf ("%s\n", PRINTLine);
return 0;
}
Does "This executed successfully" mean, that you see the message
"SDKREAD Entered"
in the output, that is, that the C function has been entered
successfully? If so, there is no problem
with CEEPIPI etc., only a problem with the parm.
If written like this, C expects an address list pointed to by register 1,
where the first address is a pointer pointing to a null-terminated char.
Note: I modified the printf, because in your variant, the PRINTLine will
be scanned
for % signs, to see, if more parameters have to be read. With my
solution, there is
only one string parameter, PRINTLine.
I guess: the way you pass the parm using the CEEPIPI interface is wrong
in some manner.
Normal call from ASSEMBLER (using static linkage) would be
CALL SDKREAD,(PRINTLINE)
or
LA R1,ADRLIST
CALL SDKREAD
...
ADRLIST DC A(PRINTLINE)
BTW: this is C, not C++
(which makes a big difference, at least to me).
Kind regards
Bernd
Am 03.03.2015 um 15:33 schrieb Donald Likens:
This has been a frustrating adventure. I hope this is easy for someone who has
already done this. I need to call a C++ program from an ASM program and pass it
parameters. I plan to use CEEPIPI to do the call because it is documented as
being efficient(as documented in the “LE Programming Guide”) but when tried it
abends on an S0C4 when attempting to access the parameter. Note: The call was
successful but it failed when accessing the passed parameter. So I tried the
example exactly as coded in the “C++ Programmer’s Guide”. I could not get it to
link properly so I renamed some modules and changed the assembler program to
issue a load and finally received an S0C7! In all cases the CEEDUMP was pretty
much useless and it is not abending in my code.
EDIT TSSDON.CSOURCE(SDKMAIN) - 01.15
Command ===>
****** ***************************** Top of Data ******
000001
000002 // this program will print what is passed. It is
000003
000004 #include <stdio.h>
000005 #include <stdlib.h>
000006 #include <string>
000007
000008 #pragma map(SDKREAD,"SDKREAD") (I do not know what this does)
000009
000010 extern "OS" int SDKREAD(char PRINTLine[121])
000011 {printf("SDKREAD Entered \n"); This executed successfully
000012 //function will be called from assembler
000013 printf(PRINTLine,"\n");
000014 return 0;
000015 }
The meat of the ASM calling program:
Start of program
LOAD EP=CEEPIPI LOAD CEEPIPI ROUTINE DYNAMICALLY
ST R0,PPRTNPTR SAVE THE ADDR OF CEEPIPI ROUTINE
*C INITIALIZE AN LE PIPI SUBROUTINE ENVIRONMENT.
*
LA R5,PPTJL GET ADDRESS OF PIPI TAJLE
ST R5,@CEXPTJL CEEXPTJL-ADDR -> PIPI TAJLE
L R15,PPRTNPTR GET ADDRESS OF CEEPIPI ROUTINE
* INVOKE CEEPIPI ROUTINE
INITPPI CALL (15),(INITSUB,@CEXPTJL,@SRVRTNS,RUNTMOPT,TOKEN)
*C CALL SDKREAD
* CALL (15),(CALLSUB,SDKREADI,TOKEN,SDKBUFA,
* SUBRETC,SUBRSNC,SUBFBC) INVOKE CEEPIPI ROUTINE
LA R1,PRINTA
ST R1,SDKREADM
LA R1,SDKREADP
L R15,PPRTNPTR GET ADDRESS OF CEEPIPI ROUTINE
BASR R14,R15
** End of program **
INITSUB DC F'3' FUNCTION CODE TO INITIALIZE FOR SUBR
@CEXPTJL DC A(PPTJL) ADDRESS OF PIPI TAJLE
@SRVRTNS DC A(0) ADDR OF SERVICE-RTNS VECTOR, 0 = NONE
RUNTMOPT DC CL255' ' FIXED LENGTH STRING OF RUNTIME OPTNS
TOKEN DS F UNIQUE VALUE RETURNED (OUTPUT)
CALLSUB DC F'4' FUNCTION CODE TO CALL SUBROUTINE
PTBINDEX DS F THE ROW NUMBER OF PIPI TAJLE ENTRY
PARM DS A PARAMETER TO PASS TO MEASTRMN
SUBRETC DS F SUBROUTINE RETURN CODE (OUTPUT)
SUBRSNC DS F SUBROUTINE REASON CODE (OUTPUT)
SUBFBC DS 3F SUBROUTINE FEEDBACK TOKEN (OUTPUT)
*
* ====================================================================
* PIPI TAJLE.
* ====================================================================
PPTJL CEEXPIT , PIPI TAJLE WITH INDEX
PPT DS 0A
CEEXPITY SDKPUT,0
CEEXPITY SDKREQ,0
CEEXPITY SDKREAD,0
CEEXPITS END OF PIPI TAJLE
SDKPUTI DC F'0' ROW NUMBER OF PIPI TAJLE FOR SDKPUT
SDKREQI DC F'1' ROW NUMBER OF PIPI TAJLE FOR SDKREQ
SDKREADI DC F'2' ROW NUMBER OF PIPI TAJLE FOR SDKREAD
SDKREADP DS 0A PARAMETER LIST TO CALL SDKREAD
DC A(CALLSUB)
DC A(SDKREADI)
DC A(TOKEN)
SDKREADM DC A(0) MESSAGE TO READ
DC A(SUBRETC)
DC A(SUBRSNC)
SDKREADE DC A(SUBFBC)
PRINTA DC A(X'80000000'+PRINT)
PRINT DC CL121'PRINT THIS LINE'
DC X'00'
I've been working on this for days now, so any help will be greatly appreciated.
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN