Passing arrays to Fortran 77 code and retrieving array structures from Fortran 77 common blocks.
This test program gives an example of the usage of the following classes, functions, and preprocessor macros:
#define AFF_F77TEST_CC_VERSION \
"AFF_F77TEST_CC V1.2"
using std::cout;
using std::endl;
void section(
const char* s,
const char l=
'-')
{
cout << endl << s << endl;
const char* p=s;
while (*p) { cout << l; ++p; }
cout << endl;
}
{
{
cout << "fs1.offset(): " << fs1.offset() << endl;
CODE(subshape.shrink(0,2).shrink(1,3,5).shrink(3,10,20));
CODE(subshape.collapse(2,15));
cout << "fs2.offset(): " << fs2.offset() << endl;
}
section(
"Pass array to Fortran via subroutine arguments:",
'=');
{
}
section(
"Access to common block:",
'=');
{
CODE(
for(
int i=v1.f(0); i<=v1.l(0); i++) { v1(i)=2.*i; });
CODE(
for(
int i=v2.f(0); i<=v2.l(0); i++) { v2(i)=.5*i; });
}
section(
"Size-checked casts:",
'=');
{
CODE(
typedef std::complex<int> Ticvalue);
CODE(
typedef std::complex<float> Tcvalue);
CODE(v1(1)=Ticvalue(3,7));
CODE(cout << v1(1) <<
", " << v2(1) << endl);
CODE(Ticvalue *icp=fv1.castedpointer<Ticvalue>());
CODE(*icp=Ticvalue(35,60));
CODE(cout << v1(1) <<
", " << v2(1) << endl);
CODE(
const Ticvalue *cicp1=fv1.castedpointer<
const Ticvalue>());
CODE(
const Ticvalue *cicp2=fv2.castedpointer<
const Ticvalue>());
CODE(cout << *cicp1 <<
", " << *cicp2 << endl);
CODE(Tcvalue *cp=fv1.castedpointer<Tcvalue>());
CODE(*cp=Ticvalue(35,60));
CODE(cout << v1(1) <<
", " << v2(1) << endl);
CODE(
double *dp=fv1.castedpointer<
double>());
CODE(cout << v1(1) <<
", " << v2(1) << endl);
section(
"Test illegal usage (only if activated through macro-definition):",
' ');
CODE(cout << iv1(1) <<
", " << iv2(1) << endl);
CODE(
int *iv1p=fiv1.pointer());
CODE(
const int *iv2p=fiv2.pointer());
CODE(cout << *iv1p <<
", " << *iv2p << endl);
#ifdef ILLEGAL1
#warning intentionally compiling illegal code:
#warning direct discard of const qualifier in conversion from non-const
CODE(
int *ip1=fiv1.castedpointer<
const int>());
#endif
#ifdef ILLEGAL2
#warning intentionally compiling illegal code:
#warning direct discard of const qualifier in conversion from const array
CODE(
int *ip2=fiv2.castedpointer<
const int>());
#endif
#ifdef ILLEGAL3
#warning intentionally compiling illegal code:
#warning discards const in conversion (reinterpret_cast)
CODE(
int *ip3=fiv2.castedpointer<
int>());
#endif
#ifdef ILLEGAL4
#warning intentionally compiling illegal code:
#warning direct type mismatch
CODE(
float *ip4=fiv1.castedpointer<
int>());
#endif
#ifdef ILLEGAL5
#warning intentionally compiling illegal code:
#warning wrong type size in conversion through reinterpret_cast
CODE(
double *ip5=fiv1.castedpointer<
double>());
#endif
}
}