|
RPG supports pointer arithmetic although not as neatly as C since pointers in RPG aren't pointers to a specific data type. You have to write a little code to translate the difference between the beginning of the array and the offset returned into an index number. Write a procedure once--use it forever. Here's some examples from TFM that should help: The following shows how you can add and subtract offsets from pointers and also determine the difference in offsets between two pointers. +--------------------------------------------------------------------------- -----------------------+ ¦ ¦ ¦ ¦ ¦ *.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...8 ¦ ¦ DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++ ¦ ¦ D.....................................Keywords+++++++++++++++++++++++++++++ ¦ ¦ * ¦ ¦ D P1 s * ¦ ¦ D P2 s * ¦ ¦ ¦ ¦ CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.... ¦ ¦ CL0N01++++++++++++++Opcode(E)+Extended Factor 2++++++++++++++++++++++++++++ ¦ ¦ * ¦ ¦ * Allocate 20 bytes of storage for pointer P1. ¦ ¦ C ALLOC 20 P1 ¦ ¦ ¦ ¦ * Initialize the storage to 'abcdefghij' ¦ ¦ C EVAL %STR(P1:20) = 'abcdefghij' ¦ ¦ ¦ ¦ * Set P2 to point to the 9th byte of this storage. ¦ ¦ C EVAL P2 = P1 + 8 ¦ ¦ ¦ ¦ * Show that P2 is pointing at 'i'. %STR returns the data that ¦ ¦ * the pointer is pointing to up to but not incuding the first ¦ ¦ * null-terminator x'00' that it finds, but it only searches for ¦ ¦ * the given length, which is 1 in this case. ¦ ¦ C EVAL Result = %STR(P2:1) ¦ ¦ C DSPLY Result 1 ¦ ¦ ¦ ¦ * Set P2 to point to the previous byte ¦ ¦ C EVAL P2 = P2 - 1 ¦ ¦ ¦ ¦ * Show that P2 is pointing at 'h' ¦ ¦ C EVAL Result = %STR(P2:1) ¦ ¦ C DSPLY Result ¦ ¦ ¦ ¦ * Find out how far P1 and P2 are apart. (7 bytes) ¦ ¦ C EVAL Diff = P2 - P1 ¦ ¦ C DSPLY Diff 5 0 ¦ ¦ ¦ ¦ * Free P1's storage ¦ ¦ C DEALLOC P1 ¦ ¦ C RETURN ¦ ¦ ¦ ¦ ¦ +--------------------------------------------------------------------------- -----------------------+ Figure 88. Pointer Arithmetic > -----Original Message----- > From: David.Biggs@bernardmatthews.com > [mailto:David.Biggs@bernardmatthews.com] > Sent: Friday, January 14, 2000 5:55 AM > To: RPG400-L@midrange.com > Subject: Re: bsearch on partial array elements > > > > > Thanks Jon and others. > I knew about the basing pointers but wasn't sure what the C > routine would do > when comparing (in my case) a 30 byte key with a 37 byte > element. I've tried it > for myself and it works just fine. > > I have another question though: in RPG LOKUP (or LOOKUP), you > can specify a > field that is set to the element number of the search > argument if the search is > successful. The C 'bsearch' returns a pointer to the key > value being sought, not > its ordinal position in the array. This seems a bit stupid as > I already know > what I'm looking for, what I want is whereabouts it is. Any > way I can get this > directly ? > > Regards, > Dave > > > > > > +--- > | This is the RPG/400 Mailing List! > | To submit a new message, send your mail to RPG400-L@midrange.com. > | To subscribe to this list send email to RPG400-L-SUB@midrange.com. > | To unsubscribe from this list send email to > RPG400-L-UNSUB@midrange.com. > | Questions should be directed to the list owner/operator: > david@midrange.com > +--- > +--- | This is the RPG/400 Mailing List! | To submit a new message, send your mail to RPG400-L@midrange.com. | To subscribe to this list send email to RPG400-L-SUB@midrange.com. | To unsubscribe from this list send email to RPG400-L-UNSUB@midrange.com. | Questions should be directed to the list owner/operator: david@midrange.com +---
As an Amazon Associate we earn from qualifying purchases.
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.