以下の例のほとんどは CodeGeneration[C] 関数を使用していますが、これらのオプションは上記の Options セクションで別途記載のあるものを除いて CodeGeneration の他の関数すべてで利用可能なものです。
coercetypes オプション
下記の呼び出しでは、変数 y が浮動小数型に型強制されます。2 番目の呼び出しではこの型強制は行われません。
>
|
C([z=x+y], declare=[x::numeric, y::integer]);
|
>
|
C([z=x+y], declare=[x::numeric, y::integer], coercetypes=false);
|
declare オプション
次の例では、 が浮動小数型として宣言されているため浮動小数値が代入されます。宣言が無ければトランスレータにより整数型であると推論され整数値 1 の代入文となります。
>
|
C([x=1], declare=[x::float]);
|
deducereturn オプション
次の Maple プロシージャは呼び出されたときに値 10 を返しますが、オプション deducereturn=false を指定して変換すると戻り値が void 型の C 関数を生成します。
>
|
f := proc(x::Vector(4), n::integer) local i; for i to 4 do x[i] := 10 end do; end proc:
|
>
|
C(f, deducereturn=false);
|
void f (int x[4], int n)
{
int i;
for (i = 1; i <= 4; i++)
x[i - 1] = 10;
}
| |
deducetypes オプション
次の例では、 にデフォルトの numeric 型が与えられ、浮動小数値が代入されます。オプションの指定がなければ、整数型と推論され整数値 1 の代入文が生成されます。
>
|
C([x=1], deducetypes=false);
|
defaulttype オプション
次の例では、型指定の無い変数は numeric ではなく整数型を与えられます。従って、変換は double の代わりに int の C 言語宣言を生成します。
>
|
f := proc(x) return x; end proc:
|
>
|
C(f, defaulttype=integer);
|
int f (int x)
{
return(x);
}
| |
digits オプション
次の呼び出しは、digits オプションが既知定数の変換に及ぼす影響を示します。
cg = 0.31415926535897932385e1;
| |
expandarrays オプション
次の例では、戻り値を格納するため変数 が自動的に生成されます。最初の呼び出しでは、要素ごとにコピーを行う命令文が生成され、2 番目の呼び出しでは配列の名前だけの代入文となります。後者の場合、出力の代入文 および を適当な C 命令文(例えば、ユーザ定義の C 関数)で置き換える必要があります。
>
|
f := proc(x::Vector(2), y::Vector(2), z) if z > 0 then x else y end if; end proc:
|
void f (
double x[2],
double y[2],
int z,
double cgret[2])
{
if (0 < z)
{
cgret[0] = x[0];
cgret[1] = x[1];
}
else
{
cgret[0] = y[0];
cgret[1] = y[1];
}
}
| |
>
|
C(f, expandarrays=false);
|
void f (
double x[2],
double y[2],
int z,
double cgret[2])
{
if (0 < z)
cgret = x;
else
cgret = y;
}
| |
functionprecision オプション
次の例では、Fortran で普通関数の代わりに倍精度関数の使用を指定します
>
|
Fortran(sin(x), functionprecision=double, resultname=w);
|
optimize オプション
次の例では、計算シーケンスを最適化してから変換します。
>
|
C([x=y*z, w=5.0*y*z], optimize);
|
x = y * z;
w = 0.50e1 * x;
| |
output オプション
次の例では結果を文字列に入れて返します。
>
|
s := C([y=sin(x)], output=string);
|
| (3.1) |
precision オプション
次の例では、単精度の変数・定数の生成を指定します。
>
|
f := proc(x) return x+2.0; end proc:
|
>
|
C(f, precision=single);
|
float f (float x)
{
return(x + 0.20e1f);
}
| |
reduceanalysis オプション
次の例の最初の呼び出しではフル解析を行います。トランスレータは、2 番目の代入の解析中に変数 が整数型を与えられている事が分かるので必要な型強制を加えます。2 番目のコールでは、各代入文の解析・変換は以前の代入文の解析からの情報を利用することなく個別に行われます。
x = 1;
y = (double) x + 0.20e1;
| |
>
|
CodeGeneration[C](s, reduceanalysis);
|
resultname オプション
次の例では、自動生成された名前ではなく指定された名前の変数に結果を代入します。
>
|
C(x^y, resultname="myresult");
|
returnvariablename オプション
次の例では、自動生成された名前の代わりに指定された名前を戻り値の変数に与えます。
>
|
f := proc(n) local i; for i to n do i*n end do end proc:
|
>
|
C(f, returnvariablename="myreturn");
|
int f (int n)
{
int i;
int myreturn;
for (i = 1; i <= n; i++)
myreturn = i * n;
return(myreturn);
}
| |