David;
In your calling pgm, is wMrsAdh the DS that you are passing the address of?
If so I would do something like this:
MyPtr = %Alloc(%Size(wMrsAdr : *ALL));
This way you don't have to carry the magic number (100) throughout the code[1].
*ALL, on the %Size bif, may not be required it depends on how you define your DS. If you define the DS as dimensioned, as you did in your prototype, then *ALL would be required to return the size of all elements, without it %Size will return the size of only one element.
I would also code your prototype with const:
D PGM2 PR EXTPGM ( 'PGM2' )
D OutParm * Const
This will ensure that the pointer is not changed by the called pgm/procedure. You have to be careful not to "loose" a pointer and the best practice, especially for a beginner and also for old timers, is to do all %Alloc, %ReAlloc, DeAlloc s in one procedure for a specific pointer. Many memory leaks, and almost(?) all in RPGIV are caused because allocated storage that is not deallocated (freed). For short running jobs this may not be a problem but in the i world we can have jobs that run for months at a time and even a small memory leak can be a problem in that amount of time.
Make sure that you %Alloc, %ReAlloc if needed, and DeAlloc pointers. If you MyPtr = %Alloc(...) and later on MyPtr = %Alloc(...) and haven't DeAlloc ed the original storage you have lost all references to the original storage and have created a leak.
Probably too much info but pointers will allow you to do almost anything including shoot yourself in the foot.
Good Luck
Duane Christen
[1]The %Elem() bif will give you the number of elements available in a dimensioned object (array, DS, table) thus avoiding coding a magic number
--
Duane Christen
Senior Software Engineer
(319) 790-7162
Duane.Christen@xxxxxxxxxx
Visit PAETEC.COM
-----Original Message-----
From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx] On Behalf Of David FOXWELL
Sent: Wednesday, August 12, 2009 7:41 AM
To: RPG programming on the IBM i / System i
Subject: Getting into pointers
Hi,
I just wrote my first program ever that passed a pointer from one program to another. I used it to access a data structure in the calling program that was alimented by the program being called. I won't explain why I did not just pass the data structure as a parameter. Anyway, it seems to work. I was a little surprised and found it good fun. However, having rather stumbled upon the solution when it didn't work, I ask the experts out there for confirmation :
Code simplified.
D PGM2 PR EXTPGM ( 'PGM2' )
D OutParm *
D MyDS DS LIKEDS ( gMyOtherDS ) DIM ( 100 )
D BASED ( MyPtr )
D MyPtr S *
/free
PGM2 ( MyPtr );
/end-free
This crashed because I understand I need to allocate storage for MyPtr before the call.
So I inserted this and it worked :
wLen = %LEN ( wMrsAdh ( 1 ));
MyPtr = %ALLOC ( wLen * 100 );
Is this the right way to initialize the pointer?
Thanks.
--
This is the RPG programming on the IBM i / System i (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.
As an Amazon Associate we earn from qualifying purchases.