#include #include extern "C" { int atoi(const char *str); } #include "stdlib.hfa" #include "array.hfa" // learned has to come afer stdlib, which uses the word tag // Usage: // ./a.out 5 // example does an unchecked reference to argv[1] forall( ztype( N ) ) array(bool, N) & f( array(float, N) & a, array(float, N) & b ) { array(bool, N) & ret = *alloc(); for( i; z(N) ) { float fracdiff = 2 * abs( a[i] - b[i] ) / ( abs( a[i] ) + abs( b[i] ) ); ret[i] = fracdiff < 0.005; } return ret; } // TODO: standardize argv int main( int argc, char ** argv ) { int n = atoi(argv[1]); array(float, Z(n)) a, b; for (i; n) { a[i] = 3.14 / (i+1); b[i] = a[i] + 0.005 ; } array(bool, Z(n)) & answer = f( a, b ); printf("answer:"); for (i; n) printf(" %d", answer[i]); printf("\n"); free( & answer ); } /* $ ./a.out 5 answer: 1 1 1 0 0 $ ./a.out 7 answer: 1 1 1 0 0 0 0 */ forall( ztype(M), ztype(N) ) void not_so_bad(array(float, M) &a, array(float, N) &b ) { f( a, a ); f( b, b ); } #ifdef SHOWERR1 forall( ztype(M), ztype(N) ) void bad( array(float, M) &a, array(float, N) &b ) { f( a, a ); // ok f( b, b ); // ok f( a, b ); // error } #endif forall( ztype(M), ztype(N) ) void bad_fixed( array(float, M) &a, array(float, N) &b ) { if ( z(M) == z(N) ) { f( a, ( array(float, M) & ) b ); // fixed } }