Hi Boris,

I assume you're familiar with the difference between passing data by reference (i.e. by pointer) and passing it by value, right? That's pretty much standard fare for a C programmer.

When you pass a string as char*, you're passing it by reference -- that means, under the covers, all that's passed to the RPG program is a pointer.

In RPG, the program will receive a character string (which can be up to 65535, by the way... though, in V6R1 it can be much, much larger). However, what the program is REALLY receiving (under the covers) is a pointer. The 65535 character string is really just how the RPG program dereferences that pointer -- so it's viewing 64k of data starting at the address in the pointer.

Without changing any of your C code, that RPG program can choose to take the address of it's parameter, and (with a little pointer math) examine the memory beyond the 64k limit...

So, really, there's no need to change your C code. It's the RPG side that needs to be modified.

Having said that... I would suggest (if you haven't done this already) that you pass an additional parameter that indicates the length of the character string, so the RPG program knows how much memory it's allowed to peruse. Just pass an int containing the length, that should suffice.

Also, the RPG programmer doesn't necessarily have to deal with the issue via a pointer. He/she could receive an array instead. For example, if the parameter is received into the following RPG definition, it can be up to 16 MB long:

D MyParm 512A dim(32767)

That's an array of 512 character strings. Since there's 32k elements in the array, the total size is around 16MB. The RPG programmer can then read through your data in 512 byte chunks...

I guess the tricky part is just making sure that the RPG programmer understands how to limit their use of the parameter to only the amount you've passed. This is where the average RPG programmer will get tripped up, they'll try to access memory beyond the end of the data you've passed (RPG does not look for a \0 to indicate the end of a string like C does) and start accessing memory they have no business accessing.

Boris wrote:
Hi All
I need to pass several char* parameters to an RPG program. Each parameter can be quite long, up to 99999A, where the max parameter length that an RPG program can receive, to the best of my knowledge, is 32K and there is also a limitation of the total length of parameters. So I was thinking to pass the pointer to the RPG program. That's where I got stuck. My knowledge of RPG is very limited. Could someone please post a short sample program on how to pass a char* pointer to an RPG program and how to use it in the RPG program - let's say just display the value?

Thanks a lot in advance.

This thread ...


Return to Archive home page | Return to MIDRANGE.COM home page