3

bash は明らかに整数演算以外の処理を実行できないため (またはそれを行うことさえできるのでしょうか?)、スクリプトに対していくつかの数学関数を実行するための回避策を考え出そうとしています。

私が考えているスクリプトは、最終的にシミュレーション プログラムに使用される一連のマクロを記述する必要があります。現在、マクロのパラメータとして使用されるパーティクル ソースの位置を出力しようとしています。

私が書いた C++ プログラムは非常に単純で、i を取り込んで x と y をそのまま出力します。

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
  double i;
  double theta = 11 * (3.1415926535897932384626/180);

  cin >> i;

  double b = 24.370;

  double y = (b/i)*sin(theta);
  double x = (b/i)*cos(theta);

  cout << x << " " <<  y << endl;

  return 0;
}

私が書いているスクリプトは、私が作成しようとしているマクロに関係するものを出力しますが、私が立ち往生している行 ( (1) とラベル付けされています) は、このようなことをする必要があります...

for i in {1..100}
do
  echo "./a.out" #calling the C program
  echo "$i" #entering i as input

  x = first output of a.out, y = second output a.out #(1) Confused on how to do this part!

  echo -n "/gps/position $x $y 0 27.7 cm" > mymacro.mac

終わり

これを行うには本当に簡単な方法が必要であることは知っていますが、何をすべきか正確にはわかりません。基本的には、ac プログラムの出力をスクリプト内の変数として使用するだけです。

4

3 に答える 3

3

$iおそらく、C++ プログラムに変数として渡し、それを使用argvして読み込むことを検討する必要があります (これは役立つかもしれません)。それがおそらく「適切な」方法です。次に、これを bash に使用できます。

#!/bin/bash
IFS=' ';
for i in {1..100}
do
    read -ra values <<< `./a.out $i`
    x=${values[0]}
    y=${values[1]}
    echo -n "/gps/position $x $y 0 27.7 cm" > mymacro.mac
done

(前者がループ内にある場合、最後の値のみがファイルに書き込ま> mymacro.macれます。>> mymacro.macmymacro.mac

于 2012-07-20T01:33:01.777 に答える
1

cegfault の答え、またはもっと簡単に使用できます。

read val1 val2 <<< $(./a.out $i)

と の 2 つの数値を実行a.outして格納します。$val1$val2

awk浮動小数点数とほとんどの数学関数を処理する を使用すると、さらに簡単に使用できます。任意の例を次に示します。

bash> read x y <<< $(echo 5 | awk '{ printf "%f %f\n", cos($1), sin($1) }')
bash> echo $x
0.283662
bash> echo $y
-0.957824
于 2012-07-20T01:39:11.523 に答える
0

スクリプトの寿命が長いか、処理するデータが多い場合、特に機能の一部を C++ プログラムで記述している場合は、すべてを C++ で記述した方がよいでしょう。 、そして最終的な結果は、はるかに高速になります...そして、より集中化され、何が起こっているのかを簡単に確認できます.

#include <iostream>
#include <math.h>
#include <sstream>
#include <fstream>

int main()
{
  const double theta = 11 * (3.1415926535897932384626/180);
  const double b = 24.370;

  for (int n=1; n<=100; ++n)
  {
    double i = n;
    double y = (b/i)*sin(theta);
    double x = (b/i)*cos(theta);

    // Two ways of sending the output to mymacro.mac......

    // 1. Via the system() call.....
    std::stringstream ss;
    ss << "echo -n \"/gps/position " << x << ' ' << y << " 0 27.7 cm\" > mymacro.mac";
    system(ss.str().c_str());

    // 2. Via C++ file I/O.....
    std::ofstream ofile("mymacro.mac");
    ofile << "/gps/position " << x << ' ' << y << " 0 27.7 cm";
    ofile.close(); //...not technically necessary; ofile will close when it goes out of scope.
  }
}

このソリューションは、ループの反復ごとにファイル「mymacro.mac」を上書きする部分を含め、例を非常に忠実に複製することに注意してください。

于 2012-07-20T01:50:26.673 に答える