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



Jim Wiant wrote:
> 
> I'm looking for a way that I can display or print the value of a Pointer
> in RPG IV.
> 
> It's not important if it displays in Hex or Decimal, just so I can see
> it's value. I can't find a way to either translate a Pointer into a
> character or numeric dataname that's displayable.
> 

You can call the C sprintf function with %p as the format type.  It
gives more information(*) than just the 16 byte value; more important,
it can tell the difference between data that looks like a pointer and
data that _is_ a pointer.  You can have 16 bytes with the exact same
value as a pointer, but it might not be a real pointer as far as the
system is concerned (real pointers have a "pointer bit" set somewhere in
the system that tell the system that your particular 16 bytes of storage
contains a valid pointer).

H bnddir('QC2LE')                                           
D fmtPointer      pr                  extproc('sprintf')    
D   buf                      65535a   options(*varsize)     
D   template                      *   value options(*string)
D   pointer                       *   value                 
                                                            
D pointerVal      s            100a                         
D p               s               *   inz(%addr(fld1))      
D fld1            s             10a                         
 /free                                                      
   callp fmtPointer(pointerVal : '%p' : p);                 
   // get rid of the null-terminator that sprintf added
   pointerVal = %str(%addr(pointerVal) : %size(pointerVal));
   // pointerVal = 'SPP:0000 :1aefQPADEV0008BMORRIS   648142
:1b5c0:0:2503'
   *inlr = '1';                                           

(*) I don't know what all that information about the pointer actually
means; maybe the sprintf documentation says.

Here's a version of the program that tests a pointer that has a value
that _looks_ ok, but isn't.

H bnddir('QC2LE')                                            
D fmtPointer      pr                  extproc('sprintf')     
D   buf                      65535a   options(*varsize)      
D   template                      *   value options(*string) 
D   pointer                       *   value                  
                                                             
D ptrds           ds                                         
D p                               *   inz(%addr(fld1))       
D   pchars                       1a   dim(16) overlay(p)  
D temp            s              1a   dim(16)                
                                                             
D pointerVal      s            100a                          
D fld1            s             10a                          
 /free                 
   callp fmtPointer(pointerVal : '%p' : p); 
   pointerVal = %str(%addr(pointerVal));            
   // pointerVal = 'SPP:0000 :1aefQPADEV0008BMORRIS   648142
:1b5c0:0:2503'

   // 1. Copy the 16 bytes of the pointer to a character array
   // 2. Copy the data back to the original storage.  The 16
   //    bytes of "ptrds" would look identical, but the pointer p 
   //    won't be valid any more.
   temp = pchars;      // 1
   pchars = temp;      // 2
   //    Try EVAL ptrds:x in the debugger before and after
   //    the pchars = temp
   callp fmtPointer(pointerVal : '%p' : p); 
   pointerVal = %str(%addr(pointerVal));            
   // pointerVal = 'NULL'
   *inlr = '1';


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.