lemming Posted January 24, 2006 Report Share Posted January 24, 2006 Apologies for the hyperbolic title. I have been visiting this site: my new filing technique is unstoppable http://www.mnftiu.cc/mnftiu.cc/filing.html so I couldn't resist Anyway, I'm pleased to announce my new (AFAIK) array technique for Macex which I believe can be used for many purposes. For instance, you could use it to address variables in a loop, or just to create (virtually) unlimited variables, far more than Macex's 99 variable limit. It also opens up Macex to more complex data-manipulation such as sorting. As an example, check out the Bubble Sort routine I implemented in the Macro Express 3.x Third Party Tools forum http://pgmacros.com/community/index.php?showforum=9. My method involves creating an array within a text variable. While this has been proposed before, I believe my method is more efficient than previous implementations. My technique can retrieve any element in an array of any size by using only 6 operations, whereas the previous solutions required a number of operations proportional to the size of the array. That is, the bigger the array, the more operations needed to retrieve data. ARRAY CREATION My technique involves appending unique array element (record) markers to the start and the end of each element, in this format: Axxx~ Element ~xxxA where xxx is an integer, Axxx~ is the begin array element marker in the Text variable, and ~xxxA is the end array element marker. So for example, if we have the following records: dog,cat,bird The array would look like this: A1~dog~1AA2~cat~2AA3~bird~3A If the array is created from user input, you can just insert the markers on-the-fly for each entry. If you want to create the array using a loop, you can use a variable reference like: A%N2%~%T1%~%N2%A where N2 would be the loop counter, and T1 would be the record which will become an array element. READING FROM ARRAY To read a particular element from the array, say, no. 13: 1. Look for position of A13~ (the begin array element marker) in the Text variable. 2. Look for position of ~13A (the end array element marker) in the Text variable. 3. Calculate length of element by subtracting the position of the begin marker from the end marker. 4. Determine length of the begin array marker (i.e. length of A13~) 5. Calculate offset for the element by adding length of begin array marker to its position. 6. Copy the the specified number of characters from the array text variable, starting at the offset position. That might not sound very efficient, but note that the number of operations to retrieve any element always remains the same, whether it is the 10th element or the 500th element. WRITING TO ARRAY Say, for instance, you want to write the word "foo" to the 13th element in the array. If the array is empty, this can be accomplished in two operations: 1. Append ~13A to the word, resulting in foo~13A 2. Replace ~13A (the end array element marker) in the Text variable with foo~13A If the array is not empty, you will need to read the existing element first, which involves 6 operations described above, followed by another two operations: Assuming the 13th element contains "fighter", 1. Append ~13A to the word currently in the array, resulting in fighter~13A 2. Replace fighter~13A in the Text variable with foo~13A I hope this array technique will be useful to others. For an example of its use, refer to the Bubble Sort macro. Regards, Lemming. Quote Link to comment Share on other sites More sharing options...
aoz Posted July 26, 2007 Report Share Posted July 26, 2007 Lemming, I nevefr cease to learn new stuff in this forum !! I used to program in MUMPS language (now "m" language) They used an "^" as delimiter, and used counting (the code could select 2nd, third, etc position, data inside any delimiter; "^" was used since most data did not ever use it for other data stuff Anyway, thanks Nick Quote Link to comment Share on other sites More sharing options...
oicqcx Posted July 26, 2007 Report Share Posted July 26, 2007 Thanks lemming for sharing! This method sounds good for a Text array, but not good for an Integer or Decimal array. conversion would always needed. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.