funcalc - クラウドでオンライン

これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド funcalc です。

プログラム:

NAME


funcalc - Funtools 計算機 (バイナリ テーブル用)

SYNOPSIS


ファンカルク [-n] [-a argstr] [-e expr] [-f file] [-l link] [-p prog] [名前 [列]]

OPTIONS


-a argstr # コンパイルされたプログラムに渡すユーザー引数
-e expr # funcalc 式
-f file # funcalc 式を含むファイル
-l libs # リンクコマンドに追加するライブラリ
-n # コンパイルして実行する代わりに、生成されたコードを出力します
-p prog # 名前付きプログラムを生成します。実行はしません
-u # 宣言されていない変数がある場合は終了します (自動宣言しない)

DESCRIPTION


ファンカルク 任意の式を作成できる計算プログラムです。
Funtools テーブル (FITS バイナリ テーブルまたは生のイベント) 内の列でコンパイルおよび実行されます。
ファイル)。 ユーザーが指定した式をテンプレート C プログラムに統合することで機能します。
プログラムをコンパイルして実行します。 ファンカルク 式は C ステートメントですが、一部の式は C ステートメントです。
重要な簡略化 (変数の自動宣言など) がサポートされています。

ファンカルク 式は XNUMX つの方法で指定できます。コマンド ラインで -e
[表現] スイッチ、ファイル内で -f [ファイル] スイッチ、または標準入力から (どちらでもない場合) -e
また -f が指定されています)。 もちろん、 ファンカルク 式はから読み取ることができます
stdin。

それぞれの呼び出し ファンカルク 入力 Funtools テーブル ファイルを
最初のコマンドライン引数。 出力 Funtools テーブル ファイルは XNUMX 番目のオプションです。
口論。 これは、出力 FITS ファイルが作成されている場合 (つまり、
  ファンカルク 式は値を出力するだけであり、出力ファイルは必要ありません)。 入力と出力の場合
ファイルが両方とも指定されている場合、XNUMX 番目のオプションの引数で列のリストを指定できます。
アクティブ化(を使用して FunColumnActivate()) ご了承ください ファンカルク するかどうかを決定します
出力の有無に基づいて出力ファイルを書き込むコードを生成する
ファイル引数。

A ファンカルク 式はテーブルの各行で実行され、XNUMX つ以上の C で構成されます。
その行の列を操作するステートメント (おそらく一時変数を使用)。
式内で、その列への参照が行われます。 現在 C 構造体を使用した行
構文 現在-[colname]>、例: cur->x、cur->pha など。ローカル スカラー変数を定義できます。
式の先頭で C 宣言を使用するか、定義できます。
自動的に ファンカルク (double 型である必要があります)。 したがって、たとえば、列 x の交換
テーブル内の y は、次の同等のいずれかを使用して実行できます。 ファンカルク
式:

二重の温度。
温度 = cur->x;
cur->x = cur->y;
cur->y = 温度;

または:

温度 = cur->x;
cur->x = cur->y;
cur->y = 温度;

この式が次のようなコマンドを使用して実行されると、

funcalc -f swap.expr itest.ev otest.ev

結果のファイルでは、x 列と y 列の値が交換されます。

デフォルトでは、列の変数のデータ型は、列の変数のデータ型と同じです。
ファイルに保存されている列。 これは、最初の行に「:[dtype]」を追加することで変更できます。
そのコラムを参照してください。 上の例では、x と y を double として強制的に出力するには、次のようにします。
タイプ「D」を明示的に指定します。

temp = cur->x:D;
cur->x = cur->y:D;
cur->y = 温度;

データ型指定子は、TFORM を使用して列を定義するための標準 FITS テーブル構文に従います。

・A:ASCII文字

・B:符号なし8ビット文字

· I: 符号付き 16 ビット int

· U: 符号なし 16 ビット int (標準 FITS ではありません)

・J:符号付き32ビット整数

· V: 符号なし 32 ビット int (標準 FITS ではありません)

・E:32ビット浮動小数点数

・D:64ビット浮動小数点数

· X: ビット (文字の配列として扱われます)

列への最初の参照のみに明示的なデータ型を含める必要があることに注意してください。
指定子。

もちろん、列のデータ型を正しく処理することが重要です。 のXNUMXつ
最も頻繁に発生するエラーの原因 ファンカルク プログラミングとは、間違ったデータを暗黙的に使用することです
式内の列の型。 たとえば、次のような計算になります。

dx = (cur->x - cur->y)/(cur->x + cur->y);

通常、浮動小数点演算を使用して実行する必要があります。 x と y が
列が整数である場合、これは明示的なメソッドを使用して列を double として読み取ることで実行できます。
タイプ指定:

dx = (cur->x:D - cur->y:D)/(cur->x + cur->y);

あるいは、式で C の型キャストを使用して実行することもできます。

dx = ((double)cur->x - (double)cur->y)/((double)cur->x + (double)cur->y);

現在の行の列にアクセスするだけでなく、
使用する行 前へ-[colname]>、そして 次の 使用する行 次-[列名]>。 ご了承ください
if 前へ-[colname]> は、 ファンカルク 式の最初の行はそうではありません
加工された。 もし 次-[colname]> は、 ファンカルク 式、最後の行
処理されていません。 このようにして、 前のページ および 次の 常に有効な行を指すことが保証されます。
たとえば、現在の x 列と前の y 列の値を出力するには、次のようにします。
C の fprintf 関数を使用します。 ファンカルク 式:

fprintf(stdout, "%d %d\n", cur->x, prev->y);

同じものを使用して新しい列を指定できます 現在-[colname]> 列を追加する構文
type (およびオプションの tlmin/tlmax/binsiz 指定子) をコロンで区切って指定します。 例えば、
cur->avg:D は、double 型の新しい列を定義します。 型指定子は同じです
既存の列に新しいデータ型を指定するために上記で使用されています。

たとえば、x と y の平均値である新しい列を作成して出力するには、
列に加えて、新しい「avg」列を定義できます。

cur->avg:D = (cur->x + cur->y)/2.0

最後の「;」に注意してください。 単一行の式には必要ありません。

FITS TFORM データ型指定と同様に、列データ型指定子を前に置くことができます。
数値カウントによって配列を定義します。たとえば、「10I」は 10 個の short int のベクトルを意味し、「2E」は
XNUMX つの単精度浮動小数点数などを意味します。新しい列を定義する必要があるのは XNUMX つの中で XNUMX 回だけです。
ファンカルク 式を作成した後は、型を再指定することなく使用できます。 これ
列配列の要素への参照が含まれます。

cur->avg[0]:2D = (cur->x + cur->y)/2.0;
cur->avg[1] = (cur->x - cur->y)/2.0;

'X' (ビット) データ型は、次元 (numeric_count/8) の char 配列として扱われます。つまり、次のようになります。
16X は 2 バイトの char 配列として処理されます。 8 ビット配列の各要素は個別にアクセスされます。

cur->stat[0]:16X = 1;
cur->stat[1] = 2;

ここでは、MSB が 16、LSB が 1 に設定された 2 ビット列が作成されます。

デフォルトでは、処理されたすべての行が指定された出力ファイルに書き込まれます。 あなたがしたい場合は
特定の行の書き込みをスキップし、単に C の「Continue」ステートメントを最後に実行します。
ファンカルク 行の書き込みは式の直後に実行されるため、
式が実行されます。 たとえば、平均が同じ行の書き込みをスキップするには、
現在の x 値:

cur->avg[0]:2D = (cur->x + cur->y)/2.0;
cur->avg[1] = (cur->x - cur->y)/2.0;
if( cur->avg[0] == cur->x )
続ける;

出力ファイル引数が指定されていない場合、 ファンカルク コマンドラインでは出力ファイルはありません
開かれていますが、行は書き込まれません。 これは、単純に出力を出力する式で役立ちます。
新しいファイルを生成する代わりに結果を生成します。

fpv = (cur->av3:D-cur->av1:D)/(cur->av1+cur->av2:D+cur->av3);
fbv = cur->av2/(cur->av1+cur->av2+cur->av3);
fpu = ((double)cur->au3-cur->au1)/((double)cur->au1+cur->au2+cur->au3);
fbu = cur->au2/(double)(cur->au1+cur->au2+cur->au3);
fprintf(stdout, "%f\t%f\t%f\t%f\n", fpv, fbv, fpu, fbu);

上記の例では、明示的な型指定 (「av」列の場合) と型の両方を使用しています。
すべての操作が二重に実行されることを保証するためのキャスト (「au」列の場合)
精度。

出力ファイルを指定すると、選択した入力テーブルが処理されて行が出力されます。
出力ファイルにコピーされます。 出力ファイルは「stdout」として指定できることに注意してください。
出力行を標準出力に書き込むため。 出力ファイルの引数が
渡されると、オプションの XNUMX 番目の引数を渡して、処理する列を指定することもできます。

FITS バイナリ テーブルでは、他の FITS 拡張機能をすべてコピーすることが望ましい場合があります。
出力ファイルにも。 これを行うには、名前に「+」記号を追加します。
入力ファイル名の拡張子。 見る ファンタブル 関連する例については。

ファンカルク ユーザー指定の式をテンプレート C プログラムに統合することで機能します。
tabcalc.c と呼ばれます。 完成したプログラムはコンパイルされて実行されます。 変数
で始まる宣言 ファンカルク 式はローカル宣言セクションに配置されます
テンプレートメインプログラムの。 他のすべての行はテンプレートのメイン プログラムに配置されます。
内部処理ループ。 プログラム生成のその他の詳細は自動的に処理されます。 のために
たとえば、列指定子は、行を処理するための C 構造体を構築するために分析されます。
に渡された FunColumnSelect() そしてで使用された FunTableRowGet()。 未知の変数を使用した場合
式内でコンパイル エラーが発生した場合、プログラムのビルドはその後再試行されます。
未知の変数を double 型に定義します。

通常は、 ファンカルク 式コードが追加されます ファンカルク 行処理ループ。 可能です
このコードを特別なディレクティブ内に配置することで、プログラムの他の部分にコードを追加します。
フォームの:

[ディレクティブ名]
... ここにコードが入ります ...
end

ディレクティブは次のとおりです。

· 全体的な メイン ルーチンの前に、グローバル空間にコードと宣言を追加します。

· ローカル main のローカル宣言の直後に宣言 (およびコード) を追加します。

· メイン行処理ループに入る直前にコードを追加します。

· After メイン行処理ループを終了した直後にコードを追加します。

したがって、次の ファンカルク 式はグローバル変数を宣言し、サブルーチンを作成します
メイン処理ループの直前と直後に呼び出します。

全体的な
ダブル v1、v2。
ダブル初期化(void);
ダブルフィニッシュ(ダブルv);
end

v1 = 初期化();
end
... v1 を使用した計算で行を処理します ...
After
v2 = 終了(v1);
if( v2 < 0.0 ){
fprintf(stderr, "処理に失敗しました %g -> %g\n", v1, v2);
終了する(1);
}
end

などのルーチン その中に() および フィニッシュ() 上記はリンクのために生成されたプログラムに渡されます
-l [リンク ディレクティブ ...] スイッチ。 このスイッチで指定した文字列は次のようになります。
プログラムのビルドに使用されるリンク行 (funtools ライブラリの前) に追加されます。 のために
たとえば、次のように仮定すると その中に() および フィニッシュ() ライブラリ libmysubs.a にあります。
/opt/special/lib ディレクトリでは、以下を使用します。

funcalc -l "-L/opt/special/lib -lmysubs" ...

ユーザー引数は、文字列引数を使用してコンパイルされた funcalc プログラムに渡すことができます。
「-a」スイッチ。 文字列にはすべてのユーザー引数が含まれている必要があります。 たとえば、パスするには
整数 1 と 2 の場合は、次を使用します。

funcalc -a "1 2" ...

引数は内部配列に保存され、ARGV(n) 経由で文字列としてアクセスされます。
大きい。 たとえば、次の式を考えてみましょう。

ローカル
int pmin、pmax;
end


pmin=アトイ(ARGV(0));
pmax=アトイ(ARGV(1));
end

if( (cur->pha >= pmin) && (cur->pha <= pmax) )
fprintf(stderr, "%d %d %d\n", cur->x, cur->y, cur->pha);

この式は、pha 値が含まれるすべての行の x、y、および pha 値を出力します。
XNUMX つのユーザー入力値の間:

funcalc -a '1 12' -f foo snr.ev'[cir 512 512 .1]'
512 512 6
512 512 8
512 512 5
512 512 5
512 512 8

funcalc -a '5 6' -f foo snr.ev'[cir 512 512 .1]'
512 512 6
512 512 5
512 512 5

引数の数が正しいかどうかを確認するのはユーザーの責任であることに注意してください。
渡されます。 要求された引数が制限外の場合、ARGV(n) マクロは NULL を返します。
引数の実際の数。盲目的に処理すると、通常は SEGV が発生します。 チェックする
引数の数を指定するには、ARGC マクロを使用します。

ローカル
ロング int シード = 1;
二重限界=0.8;
end


if( ARGC >= 1 ) シード = atol(ARGV(0));
if( ARGC >= 2 ) 制限 = atof(ARGV(1));
srand48(シード);
end

if ( drand48() > limit ) 続行;

マクロ WRITE_ROW は次のように展開されます。 FunTableRowPut() 現在の行を書き込む呼び出し。 それ
行を複数回書き込むために使用できます。 さらに、マクロ NROW は次のように展開されます。
現在処理中の行番号。 これら XNUMX つのマクロの使用法を以下に示します。
例:

if( cur->pha:I == cur->pi:I ) 続行;
a = cur->pha;
cur->pha = cur->pi;
cur->pi = a;
cur->AVG:E = (cur->pha+cur->pi)/2.0;
cur->NR:I = NROW;
if( NROW < 10 ) WRITE_ROW;

Status -p 【番組】 スイッチが指定されている場合、式は実行されません。 むしろ、
生成された実行可能ファイルは、後で使用できるように、指定されたプログラム名で保存されます。

Status -n スイッチが指定されている場合、式は実行されません。 むしろ、生成されたコード
標準出力に書き込まれます。 これは、スケルトン ファイルを生成する場合に特に便利です。
独自のコードを追加するか、コンパイル エラーを確認する必要がある場合は、 コメントに注意してください
出力の先頭に、その上にプログラムをビルドするために必要なコンパイラ コマンドが表示されます。
プラットホーム。 (コマンドは、次のコマンドを使用するため、プラットフォームごとに異なる可能性があります。
異なるライブラリ、コンパイラ スイッチなど)

前述したように、 ファンカルク スカラー変数を自動的に宣言します(
double) その変数が使用されているが宣言されていない場合。 この施設が導入されているのは
funcalc.sed という名前の sed スクリプトを使用します。これはコンパイラ出力を処理して、
未宣言変数エラー。 このスクリプトには適切なエラーがシードされています
gcc、および Solaris、DecAlpha、および SGI プラットフォーム上の cc の情報。 それを見つけたら
お使いのプラットフォームではスカラーの自動宣言が機能しません。この sed スクリプトを確認してください。
検出したエラー メッセージの一部を追加または編集する必要がある場合があります。

字句解析を維持するために、 ファンカルク (適度に)シンプルな表現を選びました
C のコメント、スペース、改行の正確な配置に関するいくつかの制限を受け入れる
生成されたプログラム内で。 特に、宣言されたローカル変数に関連付けられたコメント
式の先頭 (つまり、 ローカル...終了 ブロック)は通常は終了します
ローカル宣言ではなく、内側のループ内で:

/* このコメントは間違った場所 (つまり、内部ループ) に配置されてしまいます */
ダブルa; /* 場所も間違っています */
/* これは正しい場所 (内部ループ) に配置されます */
if( cur->x:D == cur->y:D ) 続行; /* これも正しい場所にあります */
a = cur->x;
cur->x = cur->y;
cur->y = a;
cur->avg:E = (cur->x+cur->y)/2.0;

同様に、スペースや改行は、一見すると任意に省略されたり追加されたりすることがあります。
やり方。 もちろん、これらの文体の欠陥はいずれも、
生成されたコード。

なぜなら ファンカルク に渡されたデータ ファイルを使用してユーザー表現を分析する必要があります。
コマンドラインでは、入力ファイルを開いて XNUMX 回読み取る必要があります (プログラム中に XNUMX 回)。
生成時に XNUMX 回、実行中に XNUMX 回。 その結果、標準入力を使用することはできません。
入力ファイル: ファンカルク フィルターとしては使えません。 この制限を解除することを検討します
しばらく経って。

C のコメントとともに、 ファンカルク 式には XNUMX 行の内部コメントを含めることができます。
生成された C プログラムには渡されません。 これらの内部コメントは次で始まります。 #
文字を入力し、改行まで続けます。

ダブルa; # これは生成された C ファイルには渡されません
#これもそうではない
a = cur->x;
cur->x = cur->y;
cur->y = a;
/* このコメントは C ファイルに渡されます */
cur->avg:E = (cur->x+cur->y)/2.0;

前述したように、入力列は通常、内部で使用されているかどうかによって識別されます。
内部イベントループ。 まれに、コラムを読んで、
メインループの外で処理します。 たとえば、qsort はソートに列を使用する場合があります。
内部ループ内で処理されない比較ルーチン (したがって、
読み取られる列として暗黙的に指定されます)。 このような列が確実に読み取られるようにするには、
イベント ループの場合は、 明白な キーワード。 このキーワードの引数は、次の列を指定します。
たとえ記述されていなくても、入力レコード構造に読み込む必要があります。
内側のループ。 例えば:

明示的なパイファ

たとえそうでない場合でも、各行の pi 列と pha 列が確実に読み取られるようにします。
内部イベントループで処理されます。 の 明白な ステートメントはどこにでも配置できます。

最後に、注意してください ファンカルク 現在、FITS バイナリ テーブルを含む式に取り組んでいます。
未加工のイベント ファイル。 画像表現への対応は今後検討していきますので、
コミュニティからそのようなサポートが求められている場合。

onworks.net サービスを使用してオンラインで funcalc を使用する



最新のLinuxおよびWindowsオンラインプログラム