× 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.



Oh wait, the Mid function returns correctly to Split because Split's
parameter is defined to allow longer parameters, but the parameter passed
in to Split is shorter. I'm surprised though that the compiler doesn't
catch that and truncate it since it knows that the caller might be passing
a shorter value. Maybe I have to deal with that with operational
descriptors.

It would be nice if Barbara would weigh in here.

On Tue, Dec 21, 2021 at 5:45 PM Mark Murphy <jmarkmurphy@xxxxxxxxx> wrote:

" Note: When this keyword is omitted for fixed-length fields, the
parameter may only contain more
or the same amount of data as indicated on the definition; for
variable-length fields, the parameter <========
must have the same declared maximum length as indicated on the definition."

options(*varsize) only applies to parameters, not the return value. I
wonder if the problem is the RtnParm keyword.

On Tue, Dec 21, 2021 at 5:30 PM Peter Dow <petercdow@xxxxxxxxx> wrote:

Right you are, my mistake.

I debugged it, and the problem is that when Split uses Mid to get
"part2", Mid returns a varchar with a length of 22 (which is perfectly
valid since the parm to Mid is defined as varchar(MAX_VARCHAR2), but
it's returned into variable "matno" which is defined as varchar(20).
Which doesn't seem to be a problem until the next statement which tries
to use "matno" and discovers the error.

Here's the value of "matno" right after returning from Split:

EVAL matno:x
00000 0016E2A4 97979699 A3404040 40404040 - ..Support
00010 40404040 4040.... ........ ........ - ..........

x'0016' = 22.

I would've thought that Split would've done the equivalent of an EVAL to
put "part2" into "matno", but I guess not. Maybe because of the
options(*VARSIZE)?

"*VARSIZE
The parameter may contain less data than is indicated on the definition.
This keyword is valid only
for character parameters, graphic parameters, UCS-2 parameters, or
arrays passed by reference.
The called program or procedure must have some way of determining the
length of the passed
parameter.
Note: When this keyword is omitted for fixed-length fields, the
parameter may only contain more
or the same amount of data as indicated on the definition; for
variable-length fields, the parameter <========
must have the same declared maximum length as indicated on the
definition."


--
*Peter Dow* /
Dow Software Services, Inc.
909 793-9050
petercdow@xxxxxxxxx
pdow@xxxxxxxxxxxxxx

/
On 12/21/2021 1:01 PM, Mark Murphy wrote:
Yes, the const keyword allows me to pass a char to a varchar. Since the
parameter is constant, the compiler creates a copy of the parameter, and
passes a read only reference to the copy.

On Tue, Dec 21, 2021 at 3:38 PM Peter Dow<petercdow@xxxxxxxxx> wrote:

Hi Mark,

The 2nd parameter of "split" is defined as varchar, and you're passing
it a"matterid" which is defined as char. I don't think the "const"
keyword will convert char to varchar for you.

--
*Peter Dow* /
Dow Software Services, Inc.
909 793-9050
petercdow@xxxxxxxxx
pdow@xxxxxxxxxxxxxx

/
On 12/21/2021 9:23 AM, Mark Murphy wrote:
The error is RNX0115. Length of varying length variable is out of
range.

IBM i v7r2

Here is a reproduction of the problem:

**free
ctl-opt DftActGrp(*No) ActGrp(*New)
Option(*NoDebugIo: *SrcStmt: *NoUnref)
Main(SPLITTST);

dcl-c MAX_VARCHAR2 32767;

dcl-proc splittst;
dcl-s matterid Char(25) Inz('LA-Support');
dcl-s clino Varchar(20) Inz('');
dcl-s matno Varchar(20) Inz('');
dcl-s climat Char(20);

split('-': matterid: clino: matno);
climat = left(clino + ' ': 10) + matno;

dsply matterid;
dsply clino;
dsply matno;
dsply climat;

return;
end-proc;

dcl-proc Split;
dcl-pi *n;
arg Varchar(64) const options(*varsize);
string Varchar(MAX_VARCHAR2) const options(*varsize);
part1 Varchar(MAX_VARCHAR2) options(*varsize);
part2 Varchar(MAX_VARCHAR2) options(*varsize);
end-pi;

dcl-s pos Int(5);

pos = %scan(arg: string);
if pos = 0;
part1 = string;
part2 = '';
else;
part1 = Left(string: pos-1);
part2 = Mid(string: pos+%len(arg));
endif;
end-proc;

dcl-proc Left;
dcl-pi *n Varchar(MAX_VARCHAR2) RtnParm;
string Varchar(MAX_VARCHAR2) const options(*varsize);
len Int(5) const;
end-pi;

if len <= 0;
return '';
elseif %len(string) <= len;
return string;
endif;
return %subst(string: 1: len);
end-proc;

dcl-proc Mid;
dcl-pi *n Varchar(MAX_VARCHAR2) RtnParm;
string Varchar(MAX_VARCHAR2) const options(*varsize);
start Int(5) const;
len Int(5) const options(*nopass);
end-pi;

if %len(string) < start;
return '';
elseif %parms() < %parmnum(len);
return %subst(string: start);
elseif len = 0;
return '';
elseif %len(string) < start + len;
return %subst(string: start);
endif;

return %subst(string: start: len);
end-proc;

Everything you need is here. In the real program, the procedures are
in a
service program, and the constant is in a separate header file. But I
have
consolidated it all down into a single program that exhibits the
problem.
The error is:

Additional Message Information



Message ID . . . . . . : RNX0115 Severity . . . . . . . :
50

Message type . . . . . : Diagnostic

Date sent . . . . . . : 12/21/21 Time sent . . . . . . :
12:07:21


Message . . . . : Length of varying length variable is out of
range.

Cause . . . . . : The length of a varying length character or
DBCS
variable
is less than 0 or greater than its declared maximum length in RPG
procedure
SPLITTST in program JMMLIB/SPLITTST.

Recovery . . . : Contact the person responsible for program
maintenance
to
determine the cause of the problem.














Bottom
Press Enter to continue.



F3=Exit F6=Print F9=Display message details

F10=Display messages in job log F12=Cancel F21=Select
assistance
level



The variables contain:

Evaluate Expression



Previous debug expressions



> EVAL matterid:x

00000 D3C160E2 A4979796 99A34040 40404040 - LA-Support

00010 40404040 40404040 40...... ........ -
.......

> EVAL clino:x

00000 0002D3C1 00000000 00000000 00000000 -
..LA............

00010 00000000 0000.... ........ ........ -
................

> EVAL matno:x

00000 0016E2A4 97979699 A3404040 40404040 - ..Support

00010 40404040 4040.... ........ ........ -
..........












Bottom
Debug . . .



F3=Exit F9=Retrieve F12=Cancel F16=Repeat find F19=Left
F20=Right
F21=Command entry F23=Display output




I don't see anything wrong with this.
But it gets better, change the value in matterid to '12345-001' and
the
program runs fine!!

Here is that output:

Display Program Messages



Job 195579/MMURPHY/QPADEV0002 started on 12/21/21 at 12:06:21 in
subsystem
Q
DSPLY 12345-001

DSPLY 12345

DSPLY 001

























Press Enter to continue.







F3=Exit F12=Cancel
--
This is the RPG programming on IBM i (RPG400-L) mailing list
To post a message email:RPG400-L@xxxxxxxxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit:https://lists.midrange.com/mailman/listinfo/rpg400-l
or email:RPG400-L-request@xxxxxxxxxxxxxxxxxx
Before posting, please take a moment to review the archives
athttps://archive.midrange.com/rpg400-l.

Please contactsupport@xxxxxxxxxxxxxxxxxxxx for any subscription
related
questions.

Help support midrange.com by shopping at amazon.com with our affiliate
link:https://amazon.midrange.com

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

Please contact support@xxxxxxxxxxxxxxxxxxxx for any subscription related
questions.

Help support midrange.com by shopping at amazon.com with our affiliate
link: https://amazon.midrange.com



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.