| 1 | #include <fstream.hfa> | 
|---|
| 2 | #include <stdlib.hfa> | 
|---|
| 3 | #include <array.hfa> // learned has to come afer stdlib, which uses the word tag | 
|---|
| 4 |  | 
|---|
| 5 | // Usage: | 
|---|
| 6 | // ./a.out 5 | 
|---|
| 7 | // example does an unchecked reference to argv[1] | 
|---|
| 8 |  | 
|---|
| 9 |  | 
|---|
| 10 | forall( [@N@] )                                                         $\C{// array dimension}$ | 
|---|
| 11 | array( bool, @N@) & f( array( float, @N@ ) & x, array( float, @N@ ) & y ) { | 
|---|
| 12 | array( bool, @N@ ) & ret = *@alloc@();  $\C{// sizeof ret  used by alloc}$ | 
|---|
| 13 | for ( i; @N@ ) { | 
|---|
| 14 | ret[i] = 0.005 > 2 * (abs( x[i] - y[i] )) / (abs( x[i]) + abs(y[i] )); | 
|---|
| 15 | } | 
|---|
| 16 | return ret; | 
|---|
| 17 | } | 
|---|
| 18 |  | 
|---|
| 19 |  | 
|---|
| 20 |  | 
|---|
| 21 |  | 
|---|
| 22 |  | 
|---|
| 23 |  | 
|---|
| 24 |  | 
|---|
| 25 |  | 
|---|
| 26 |  | 
|---|
| 27 |  | 
|---|
| 28 | // TODO: standardize argv | 
|---|
| 29 |  | 
|---|
| 30 | int main( int argc, char * argv[] ) { | 
|---|
| 31 | const int @n@ = ato( argv[1] );                 $\C{// deduce conversion type}$ | 
|---|
| 32 | array( float, @n@ ) x, y;                               $\C{// VLAs}$ | 
|---|
| 33 | for ( i; n ) {                                                  $\C{// initialize arrays}$ | 
|---|
| 34 | x[i] = 3.14 / (i + 1); | 
|---|
| 35 | y[i] = x[i] + 0.005 ; | 
|---|
| 36 | } | 
|---|
| 37 | array( bool, @n@ ) & result = @f( x, y )@; $\C{// call}$ | 
|---|
| 38 | sout | "result: " | nonl;                               $\C{// print result}$ | 
|---|
| 39 | for ( i; n ) | 
|---|
| 40 | sout | result[i] | nonl; | 
|---|
| 41 | sout | nl; | 
|---|
| 42 | free( &result );                                                $\C{// free result storage}$ | 
|---|
| 43 | } | 
|---|
| 44 | /* | 
|---|
| 45 | $\$$ ./a.out 5 | 
|---|
| 46 | result: true true true false false | 
|---|
| 47 | $\$$ ./a.out 7 | 
|---|
| 48 | result: true true true false false false false | 
|---|
| 49 | */ | 
|---|
| 50 |  | 
|---|
| 51 | void fred() { | 
|---|
| 52 | array( float, @10@ ) x; | 
|---|
| 53 | array( float, @20@ ) y; | 
|---|
| 54 | f( x, x ); | 
|---|
| 55 | f( y, y ); | 
|---|
| 56 | //      f( x, y ); | 
|---|
| 57 | } | 
|---|
| 58 |  | 
|---|
| 59 | #ifdef SHOWERR1 | 
|---|
| 60 | forall( [M], [N] ) | 
|---|
| 61 | void bad( array(float, M) &x, array(float, N) &y ) { | 
|---|
| 62 | f( x, x );              $\C[1.5in]{// ok}$ | 
|---|
| 63 | f( y, y );              $\C{// ok}$ | 
|---|
| 64 | f( x, y );              $\C{// error}\CRT$ | 
|---|
| 65 | } | 
|---|
| 66 | #endif | 
|---|
| 67 |  | 
|---|
| 68 |  | 
|---|
| 69 |  | 
|---|
| 70 | forall( [M], [N] ) | 
|---|
| 71 | void bad_fixed( array( float, M ) & x, array( float, N ) & y ) { | 
|---|
| 72 | if ( M == N ) | 
|---|
| 73 | f( x, @(array( float, M ) &)@y ); $\C{// cast y to matching type}$ | 
|---|
| 74 | } | 
|---|
| 75 |  | 
|---|
| 76 | // Local Variables: // | 
|---|
| 77 | // compile-command: "sed -f sedcmd hello-array.cfa > ../build/tmp.cfa; cfa ../build/tmp.cfa -Wall -Wextra" // | 
|---|
| 78 | // End: // | 
|---|