したがって、理解を助けるために練習用にこれを実行しようとしています。しかし、test.cppにコードスニペットがあり、プログラムで「CONST N = 10」のように1行を変更したい場合は変更されます。 N値他の値に対してbashスクリプトのループを介してどのように値を取得しますか?私の初期の推測は次のとおりです。
for x in 10 20
do
sed -i -e 's/const int N = 10;/const int N = '$x';/g' test.cpp
g++ test.cpp -o test.o
./test.o
sed -i -e 's/const int N = '$x';/const int N = 10;/g' test.cpp
done
ここで x は 10 と 20 を実行し、その値をプログラムの変数値に入力します。どんな助けでも大変感謝します。
答え1
より良いアプローチは、コンパイルラインで定義するプリプロセッサマクロを使用することです。したがって、コードを次のように変更します。
#ifndef N_MAC
#define N_MAC 10
#endif
const int N = N_MAC;
次に、次のようにコンパイルします。
g++ test.cpp -DN_MAC=$x -o test.o
$ifndef
このブロックは、オーバーライドしないときの-DN_MAC
デフォルト値を提供します。
答え2
あなたのループは正常に動作しているように見え、プログラムを再コンパイルしてsumN
と同じ値を取得します。10
20
しかし。
1)10から20の間の11個の値がすべて必要な場合、または同じものを使用する必要がありますfor x in {10..20}
。for ((x = 10 ; x <= 20 ; x++))
2)ソースコードを2回変更するのは少し役に立たないようです。変更されていない基本バージョンを維持し、必要に応じて変更する方がきれいになる可能性があります。
sed -e 's/const int N = 10;/const int N = '"$x"';/g' base.cpp > test.cpp
g++ -Wall test.cpp -o test
./test
rm test.cpp test
あるいは、sed -Ee 's/^(const int N =)[^;]*;/\1 '"$x"';/g'
課題の値を完全に無視することもできます。
3)実行ファイルには使用しないでくださいtest.o
。拡張子.o
は 。gcc -c test.c
x
つまり、各値を再コンパイルするのではなく、コマンドラインから数字を読み取るようにプログラムを変更することはそれほど難しくありません。これは最初の引数を割り当ててN
印刷します(Cで書かれていますが、引数はmain
C ++でも同様に機能します)。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int N = 10;
if (argc > 1) N = atoi(argv[1]);
printf("N: %d\n", N);
return 0;
}