|
Main difference between C pointers and RPG pointers is that RPG pointers don't have a data type. RPG pointer arithmetic is done in bytes rather than size_t quanta. RPG pointers can't be dereferenced directly--that's where the based variable comes in. You can't assign the value of a dereferenced RPG pointer to another variable. You have to use the based variable. To do the equivalent of a malloc, you need to define a pointer, a variable based on it, and use the ALLOC opcode to allocate memory to it by specifying the number of bytes. Here's an example from TFM: +--------------------------------------------------------------------------- -----------------------+ ¦ ¦ ¦ ¦ ¦ D Ptr1 S * ¦ ¦ D Ptr2 S * ¦ ¦ C ALLOC 7 Ptr1 ¦ ¦ * Now Ptr1 points to 7 bytes of storage ¦ ¦ * ¦ ¦ C ALLOC (E) 12345678 Ptr2 ¦ ¦ * This is a large amount of storage, and sometimes it may ¦ ¦ * be unavailable. If the storage could not be allocated, ¦ ¦ * %ERROR will return '1', the status is set to 00426, and ¦ ¦ * %STATUS will return 00426. ¦ ¦ ¦ ¦ ¦ +--------------------------------------------------------------------------- -----------------------+ Figure 193. ALLOC Operation There are also REALLOC and DEALLOC opcodes that do what you might imagine. Besides the basing pointer, RPG also has the procedure pointer which can only refer to the address of a procedure. The %addr() and %paddr() bifs also come in real handy. Think of them as the address of operator. This is a brief introduction to a reasonably complex subject. The best part is that pointers offer the RPG programmer the same opportunies to generate unpredictable results that C programmers have exploited for years. <g> Seriously, you can do most everything you've done in C with pointers using pointers in RPG. Because RPG has pass by reference, you don't need them to the same extent you do in C. Dynamic memory allocation is a perfect example of a sensible use of pointers in RPG. If you've dynamically allocated 2 d arrays in C, you're probably prepared for the complexity of doing it in RPG. -----Original Message----- From: James David Rich [mailto:james@dansfoods.com] Sent: Friday, June 23, 2000 3:39 PM To: rpg400-l@midrange.com Subject: pointers Can someone explain the difference between a basing pointer in RPG and a pointer in C? Is there some other kind of pointer besides a basing pointer in RPG? Can someone explain how to do write the following C code in RPG: void main (){ char *buffer; buffer = (char *) malloc (sizeof(char) * 1024); return; } I know that I need to do something like: D ptr S * C alloc(e) 1024 ptr but now how do I specify that ptr points to a buffer of type char? Even better: how do I use alloc to allocate memory that looks like this: D data DS D field 100A basically I want a 2-dimensional array that I can dynamically increase or descrease. James Rich james@dansfoods.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.