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:

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 Victória-Pereira has more than 16 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 50 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. He writes in an easy-to-read, practical style that's highly popular with his audience of IBM technology professionals.

Rafael currently works as an Enterprise Architect 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 "modern" programming languages, such as C# and Python, as well as project management and consultancy.

- See more at: http://www.mcpressonline.com/rpg/rpg-academy-/free-your-code-convert-fixed-format-code-to-free-format-part-3.html#sthash.p09weZkM.dpuf

Victoria Mack

Also in MC Press Articles

Just what is Bluemix, and what could it mean for you? An interview with an IBMer reveals the answers.

Written by Steve Pitcher

Last week, I sat down with Adam Gunther, Director of Cloud Developers Services at IBM, to talk about IBM Bluemix. I told Adam I wasn’t a developer up front, but I wanted him to explain just exactly how my small-to-medium-sized business with an investment in on-premises infrastructure could really take advantage of Bluemix. I wasn’t disappointed.

MQ on IBM i continues to adapt to the needs of modern IT environments.

Written by Andrew Schofield

IBM MQ has been a familiar part of the corporate IT landscape for over 20 years. It’s been through a few name changes, but the fundamental idea of using asynchronous messaging to decouple communication between applications is as important now as it has ever been. Of course, over such a long period of time, there have been huge changes—in particular, the way that developers work using the Internet and open-source, and the rise of cloud computing. Therefore, we at IBM are doing many things in MQ to make sure that existing systems remain relevant and able to interact with the latest tools and platforms.

Linear-main RPG programs eliminate the RPG logic cycle and add new levels of variable scoping to protect your code from bugs down the road.

Written by Brian May

While I am no expert in the RPG logic cycle, I have had to deal with it in older applications over the years. Most RPG developers have dealt with a logic cycle program at least once. I can honestly say I have never written a new logic cycle program, but I have seen others in the community doing it. This article is not intended to start a religious war about cycle programming. There are some who will never give it up. Instead, this article will demonstrate how to create a program without the logic cycle and concentrate on what I think is a very useful benefit to using linear-main procedures in program.

Categories

About us

MC Press Online, LLC is the world's leading provider of educational materials for IBM Power Systems (System i, eServer i5/iSeries, and AS/400) professionals. Our mission is to deliver hands-on, nuts-and-bolts information about current and significant new technologies in the IBM field, so you can be more productive on the job and get more out of your career.

MC Press offers books, ebooks, and electronic publications that take you inside the technology, so you can find out how to best leverage the power and potential of your IBM platforms. Our books cover a wide range of topics--from hands-on, how-to programming to the most advanced communications, connectivity, and security issues facing the industry today.