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



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.

This thread ...

Follow-Ups:
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.