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



Duane makes a good point about the use of CONST.

If this were a subprocedure, I'd recommend VALUE instead because as it
stands now with or without CONST you are actually passing a pointer to
a pointer. What is actually being passed in the original program is
the address of myPtr, not the value of myPtr which is the address of
myDS.

So my other post, where I said this would work
PGM2 (%addr(myDS) );

was incorrect, you'd actually need to have

D PGM2 PR EXTPGM ( 'PGM2' )
D OutParm *


D MyDS DS LIKEDS ( gMyOtherDS ) DIM ( 100 )
d myPtr s *
/free

myPtr =%addr(myDS)
PGM2 ( myPtr );

/end-free

Honestly, in this simple example, there's no reason to be using pointers at all.

I'd be curious as to why you think you need them.

Charles

On Wed, Aug 12, 2009 at 9:48 AM, Christen,
Duane<Duane.Christen@xxxxxxxxxx> wrote:
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.

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

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.