ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º Lesson 7 Part 140F-PC 3.5 Tutorial by Jack Brown º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ The Average Array ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Here is an application of the compiler extension words CREATE...DOES> to form an intelligent data structure. The idea is to have an array that automatically maintains the running average of its non zero elements in slots 1 through n in array position 0. This means that every time a number is stored in the array the word itself must be smart enough to know that the store operation is being performed and then calculate the average of its non-zero elements and update the value of the average in position 0 of the array. Remember that this idea of extending the compiler is new and unheard of in other languages. How would you do this in C? Of what use would this type of intelligent array be? Perhaps you could use it in you stock monitoring program. You could use one of these intelligent arrays to keep track of the performance of your favorite stocks. As you add each daily or weekly value of the stock the average would be automatically calculated. You could even extend this idea to have the array keep track of more information. How about also maintaining a moving average of the last three or ??? non zero entries made into the array? Well I will leave the extensions up to you. Let me know if you find this type of structure useful or if you come up with any interesting variations. \ Finds the average of the n elements at adr+4 and stores the \ result at adr+2. Only non zero elements are counted. \ AARRAY --> : n : avg : x1 : x2 : ..... : xn : : AAVERAGE ( adr -- ) DUP 4 + OVER @ 2* OVER + SWAP 0 0 2SWAP ?DO I @ DUP 0<> IF 1 D+ ELSE DROP THEN 2 +LOOP / SWAP 2+ ! ; \ This a flag that indicates access mode. \ false is fetch mode, the default, and true is store mode. VARIABLE (:=) (:=) OFF : := (:=) ON ; : AARRAY ( n - ) CREATE DUP , 1+ 0 ?DO 0 , LOOP DOES> DUP >R (:=) @ >R (:=) OFF SWAP 1+ 2* + R> IF ! R> AAVERAGE ELSE @ R> DROP THEN ; \ Examples of the AARRAY 5 AARRAY junk ok \ Create an average array with 5 elements. 12 := 2 junk ok \ Set element number 2 to the value 12 0 junk . 12 ok \ Fetch element 0, the current average. 8 := 1 junk ok \ Set element number 1 to 8. 0 junk . 10 ok \ Now element 0 is 10, the average of 8 and 12. 1 := 4 junk ok \ Set element number 4 to 1. 0 junk . 7 ok \ And of course the average is now 7! \ Now can you think of anything else you might like an intelligent \ array to do? ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Please Move to Lesson 7 Part 150 ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ