× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



Whoops I forgot to put the service program name on the procedures.

Should be

XVCVND_ConverttoFahrenheit
XVCNVD_ConvertToCelcius



On Wed, Feb 1, 2017 at 1:43 PM, Alan Campin <alan0307d@xxxxxxxxx> wrote:

If we are talking externalizing the procedures a complete different horse
or at last a different color.

Creating service programs is a bit of an art form. You really have to
think different.

You will need at least 4 source members.

Lets say we call it XVCNVD

You need a top level with the CRTSRVPGM instructions.

XVCNVD

CRTSRVPGM SRVPGM(Yourlib/XVCNVD)
MODULE(XVCNVD_M01) +
SRCFILE(*SRCLIB/*SRCFIL) SRCMBR(XVCNVD_B) +
TEXT('Degree Conversion functions') +
ACTGRP(YOURAGP) OPTION(*DUPPROC)

A bindery member

XVCNVD_B

STRPGMEXP PGMLVL(*CURRENT)
EXPORT SYMBOL('XVCNVD_ConvertToFahrenheit')
EXPORT SYMBOL('XVCNVD_ConvertToCelcius')
ENDPGMEXP

A prototype member.

XVCNVD_PR

//***************************************************************
//* ConvertToFahrenheit
//* Convert from Celsius to Fahrenheit
//* In - Degrees
//* Out - None
//* Returns - Result
//****************************************************************
dcl-pr ConverttoFahrenheit Packed(5:2) ExtProc(*DclCase);
PR_InDegrees Packed(5:2) Value;
end-pr;
//***************************************************************
//* ConvertToCelsius
//* Convert from Fahrenheit To Celsius
//* In - Degrees
//* Out - None
//* Returns - Result
//****************************************************************
dcl-pr ConverttoCelsius Packed(5:2) ExtProc(*DclCase);
PR_InDegrees Packed(5:2) Value;
end-pr;

And the actual code.

XVCNVD_M01


ctl-opt Option(*Srcstmt:*Nodebugio:*NoUnRef);
ctl-opt NoMain;

/copy *libl/qsrcf,XVCNVD_PR

//***************************************************************
//* ConvertToFahrenheit
//* Convert from Celsius to Fahrenheit
//* In - Degrees
//* Out - None
//* Returns - Result
//****************************************************************
dcl-proc ConverttoFahrenheit Export;
dcl-pi *N Packed(5:2);
InDegrees Packed(5:2) Value;
end-pi;

Return %Dec(((InDegrees * 1.8) + 32):5:2);

end-proc;
//***************************************************************
//* ConvertToCelsius
//* Convert from Fahrenheit To Celsius
//* In - Degrees
//* Out - None
//* Returns - Result
//****************************************************************
dcl-proc ConverttoCelsius Export;
dcl-pi *N Packed(5:2);
InDegrees Packed(5:2) Value;
end-pi;

Return %Dec(((InDegrees * 9) / 5)) + 32):5:2);

end-proc;


On Wed, Feb 1, 2017 at 1:13 PM, Tools/400 <thomas.raddatz@xxxxxxxxxxx>
wrote:

Jeff,

I gree with you regarding the EXPORT keyword, since the cvt2F()
procedure is for internal use only.

But I do not agree with you regarding the EXTPROC keyword. Reading a
stack trace or an error message is a lot easier, when the procedure name
is shown in camel case. Just my opinion and not necessarily yours.

Also it was a good idea, at least for our development team, to prefix
the external procedure names with the name of the module. This way it is
very easy to find the module that contains a procedure, e.g. when
displaying the exported procedures of a service program with DSPSRVPGM.
Or it is easy to find the module for a given unresolved referenced item.

I love camel case and the module name prefix, e.g.:

Exported procedure:

*
* Opens a job log.
D JobLog_open...
D PR like(JobLog_handle_t)
D extproc('JOBLOG1_+
D JobLog_open+
D ')
D i_qJob const likeds(qJob_t)
D options(*nopass: *omit)
D i_options const like(JobLog_options_t)
D options(*nopass: *omit)
D i_direction const like(JobLog_direction_t)
D options(*nopass: *omit)
D i_strMsgKey const like(JobLog_msgKey_t)
D options(*nopass: *omit)

Internal procedure:

*
* ------------------------------------
* Internal prototypes
* ------------------------------------
*
* Opens the job log and returns the first entry.
D openJobLog...
D PR n
D extproc('openJobLog')
D i_qJob const likeds(qJob_t)
D i_options const like(JobLog_options_t)
D i_direction const like(JobLog_direction_t)
D i_msgKey const like(JobLog_msgKey_t)
D o_listInf likeds(qgy_opnListInf_t)
D o_options likeds(listOptions_t)
D o_errCode likeds(errCode_t)

DSPSRVPGM SRVPGM(JOBLOG) DETAIL(*PROCEXP):

JOBLOG1_JobLog_open
JOBLOG1_JobLog_getEntry
JOBLOG1_JobLog_close
JOBLOG1_JobLog_getNewest
JOBLOG1_JobLog_getOldest
JOBLOG1_JobLog_getMessageType
JOBLOG1_JobLog_isNull
JOBLOG1_JobLog_null

Of course it is more work to add the EXTPROC keyword to prototypes of
internal procedures and in fact it is even more work for for **free. But
it is worth the effort for me.

Just my two cents.

Thomas.

Am 01.02.2017 um 20:58 schrieb Jeff Young:
Scott,
You do not want the EXTPROC on the Prototype if your procedure is in the
same module.
You also do not want the EXPORT value on the Procedure Interface.

Jeff Young
Sr. Programmer Analyst

On Wed, Feb 1, 2017 at 2:47 PM, Scott Williams <scottwill0707@xxxxxxxxx

wrote:

Been trying to learn procedures, and having some difficulty. After
reading
examples online, I've found myself going in circles and even more
confused.
I feel like I'm throwing knifes in a dark room...

I'm attempting to create a very simple procedure that converts a given
numeric value into another. In this case, a value in Celsius to be
converted to Fahrenheit.

I can't seem to get my PR and PI sorted out, and/or the positioning of
the
P spec decs. Do I create this as a module, or a bound program? Please
let
me know what I am doing wrong. I would like to understand how to
properly
use a procedure so I can extrapolate this simple example into larger
ideas.
(Machine is 7.1 version of the OS)

HDFTACTGRP(*NO)
HMAIN(C2F)
D CVT2F PR 5S 2 EXTPROC('C2F')
D
D $C 5S 2 VALUE

D$F S 5S 2

/FREE
$F = C2F($C);
DSPLY $F;
*INLR = *ON;
/END-FREE

PC2F B EXPORT
DC2F PI 5S 2
D $C 5S 2 VALUE
D$F S 5S 2
/FREE
$F = (($C * 1.8) + 32);
RETURN $F;
/END-FREE
P E

Thanks in advance!

--
Scott Williams
--
This is the RPG programming on the IBM i (AS/400 and iSeries)
(RPG400-L)
mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/rpg400-l.

Please contact support@xxxxxxxxxxxx for any subscription related
questions.

Help support midrange.com by shopping at amazon.com with our affiliate
link: http://amzn.to/2dEadiD


--
This is the RPG programming on the IBM i (AS/400 and iSeries) (RPG400-L)
mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/rpg400-l.

Please contact support@xxxxxxxxxxxx for any subscription related
questions.

Help support midrange.com by shopping at amazon.com with our affiliate
link: http://amzn.to/2dEadiD




As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

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.