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

Reply via email to