RPG Academy: /FREE Your Code - Convert Fixed-Format Code to Free-Format, Part 3

RPG
Typography
  • Smaller Small Medium Big Bigger
  • Default Helvetica Segoe Georgia Times

The last two TechTips provided some insights about the process of converting RPG “classic” code to free-format. This one covers a topic often overlooked, but extremely important: handling arrays.

Aside from the terrible trio (CABXX, TAG, and GOTO), I discussed in the previous TechTip another fact that’s hard for some to swallow: that MOVEA didn’t make it to free-format. This operation code is used for some specialized assignment functions related to arrays; it transfers character, graphic, UCS-2, or numeric values from factor 2 to the result field. However, there are some restrictions when moving numeric values. (Check IBM’s ILE RPG Reference Manual for details if you need to refresh your memory.) One of the fields must contain an array, and the fields cannot specify the same array, even if the array is indexed. The following operations are allowed:

  • Move several contiguous array elements to a single field.
  • Move a single field to several contiguous array elements.
  • Move contiguous array elements to contiguous elements of another array.

There’s an alternative. The %SUBARR BIF allows you to refer to a subsection of an array, starting at a given index (the start position) and continuing for a given number of elements:

 

%Subarr(<Array Name> : <Start Position> : <Number of Elements>)

With this BIF, you can perform the three types of operations I just mentioned. In order to “move several contiguous array elements to a single field,” you use something like this:

W_SomeField = %Subarr(<Array Name> : <Start Position> : <Number of Elements>);

To perform the second type of operation, “move a single field to several contiguous array elements,” you simply swap the position of the field and the BIF in the code instruction:

%Subarr(<Array Name> : <Start Position> : <Number of Elements>) = W_SomeField;

Finally, the last type of operation, “move contiguous array elements to contiguous elements of another array,” might be a bit difficult to wrap your head around:

%Subarr(<Target Array Name> : <Target Start Position> : <Target Number of Elements>) = %Subarr(<Source Array Name> : <Source Start Position> : <Source Number of Elements>);

Here are some additional examples from IBM’s ILE RPG Language Reference Manual V7.1:

D a               s             10i 0 dim(5)

D b               s             10i 0 dim(15)

D resultArr       s            10i 0 dim(20)

D sum             s             20i 0

/free

   a(1)=9;

   a(2)=5;

   a(3)=16;

   a(4)=13;

   a(5)=3;

   // Copy part of an array to another array:

   resultArr = %subarr(a:4:n);

   // this is equivalent to:

   // resultArr(1) = a(4)

   // resultArr(2) = a(5)

   // ...

   // resultArr(n) = a(4 + n - 1)

   // Copy part of an array to part of another array:

   %subarr(b:3:n) = %subarr(a:m:n);

   // Specifying the array from the start element to the end of the array

   // B has 15 elements and A has 5 elements. Starting from element 2

   // in array A means that only 4 elements will be copied to array B.

   // The remaining elements in B will not be changed.

   b = %subarr(a : 2);

   // Sort a subset of an array:

   sorta %subarr(a:1:4);

   // Now, A=(5 9 13 16 3);

   // Since only 4 elements were sorted, the fifth element

   // is out of order.

   // Using %SUBARR in an implicit array indexing assignment

   resultArr = b + %subarr(a:2:3)

   // this is equivalent to:

   // resultArr(1) = b(1) + a(2)

   // resultArr(2) = b(2) + a(3)

   // resultArr(3) = b(3) + a(4)

   // Using %SUBARR nested within an expression

   resultArr = %trim(%subst(%subarr(stringArr:i):j));

   // this is equivalent to:

   // resultArr(1) = %trim(%subst(stringArr(i+0):j))

   // resultArr(2) = %trim(%subst(stringArr(i+1):j))

   // resultArr(3) = %trim(%subst(stringArr(i+2):j))

   // Sum a subset of an array

   sum = %xfoot (%subarr(a:2:3));

   // Now sum = 9 + 13 + 16 = 38

Finally, the LOOKUP operation code, related to arrays but also to tables, was replaced by a flurry of BIFs:

  • %LOOKUPLT, %LOOKUPLE, %LOOKUP, %LOOKUPGE, and %LOOKUPGT for arrays
  • %TLOOKUPLT, %TLOOKUPLE, %TLOOKUP, %TLOOKUPGE, and %TLOOKUPGT for tables

These BIFs provide a finer-tuned functionality than the operation code and dispense with %EQUAL, %FOUND, or those pesky indicators. Here are a few examples, also taken from IBM’s ILE RPG Language Reference V7.1:

/FREE

arr(1) = ’Cornwall’;

arr(2) = ’Kingston’;

arr(3) = ’London’;

arr(4) = ’Paris’;

arr(5) = ’Scarborough’;

arr(6) = ’York’;

n = %LOOKUP(’Paris’:arr);

// n = 4

n = %LOOKUP(’Thunder Bay’:arr);

// n = 0 (not found)

n = %LOOKUP(’Kingston’:arr:3);

// n = 0 (not found after start index)

n = %LOOKUPLE(’Paris’:arr);

// n = 4

n = %LOOKUPLE(’Milton’:arr);

// n = 3

n = %LOOKUPGT(’Sudbury’:arr);

// n = 6

n = %LOOKUPGT(’Yorks’:arr:2:4);

// n = 0 (not found between elements 2 and 5)

/END-FREE

After this, we’re missing only two operation codes. The CAT operation code was mentioned earlier in this series. (You don’t need to go back there now; just use the plus sign instead of it in free-format). The last operation code, TESTN, doesn’t have a direct replacement, but you can test numeric values using a MONITOR/END-MON group and handle the errors in the ON-ERROR section. If you’re not familiar with these operation codes, don’t worry because I’ll review error-handling techniques in more depth later in this series.

This concludes this three-part TechTip about free-format conversion. To help you in the task of converting your own code, I prepared a table with the operation codes that don’t have a free-format equivalent and the respective alternative. You can download that table here. This is also the last article of the “/FREE Your Code” subseries. In case you’re wondering, I didn’t forget to talk about the “new” free-format H-, F- and D-specs: I’ll discuss them in detail later, along with the latest improvements that IBM introduced with TR7. But that’s for a bit later, because the next batch of TechTips will focus on the guidelines to help you improve your code’s readability and maintainability.

Rafael Victoria-Pereira

Rafael Victória-Pereira has more than 20 years of IBM i experience as a programmer, analyst, and manager. Over that period, he has been an active voice in the IBM i community, encouraging and helping programmers transition to ILE and free-format RPG. Rafael has written more than 100 technical articles about topics ranging from interfaces (the topic for his first book, Flexible Input, Dazzling Output with IBM i) to modern RPG and SQL in his popular RPG Academy and SQL 101 series on mcpressonline.com and in his books Evolve Your RPG Coding and SQL for IBM i: A Database Modernization Guide. Rafael writes in an easy-to-read, practical style that is highly popular with his audience of IBM technology professionals.

Rafael is the Deputy IT Director - Infrastructures and Services at the Luis Simões Group in Portugal. His areas of expertise include programming in the IBM i native languages (RPG, CL, and DB2 SQL) and in "modern" programming languages, such as Java, C#, and Python, as well as project management and consultancy.


MC Press books written by Rafael Victória-Pereira available now on the MC Press Bookstore.

Evolve Your RPG Coding: Move from OPM to ILE...and Beyond Evolve Your RPG Coding: Move from OPM to ILE...and Beyond
Transition to modern RPG programming with this step-by-step guide through ILE and free-format RPG, SQL, and modernization techniques.
List Price $79.95

Now On Sale

Flexible Input, Dazzling Output with IBM i Flexible Input, Dazzling Output with IBM i
Uncover easier, more flexible ways to get data into your system, plus some methods for exporting and presenting the vital business data it contains.
List Price $79.95

Now On Sale

SQL for IBM i: A Database Modernization Guide SQL for IBM i: A Database Modernization Guide
Learn how to use SQL’s capabilities to modernize and enhance your IBM i database.
List Price $79.95

Now On Sale

BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

$

Book Reviews

Resource Center

  •  

  • LANSA Business users want new applications now. Market and regulatory pressures require faster application updates and delivery into production. Your IBM i developers may be approaching retirement, and you see no sure way to fill their positions with experienced developers. In addition, you may be caught between maintaining your existing applications and the uncertainty of moving to something new.

  • The MC Resource Centers bring you the widest selection of white papers, trial software, and on-demand webcasts for you to choose from. >> Review the list of White Papers, Trial Software or On-Demand Webcast at the MC Press Resource Center. >> Add the items to yru Cart and complet he checkout process and submit

  • SB Profound WC 5536Join us for this hour-long webcast that will explore:

  • Fortra IT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators with intimate knowledge of the operating system and the applications that run on it is small. This begs the question: How will you manage the platform that supports such a big part of your business? This guide offers strategies and software suggestions to help you plan IT staffing and resources and smooth the transition after your AS/400 talent retires. Read on to learn: