0
1 void out3x3(mat3x3 &A)
2 { int i, j;
3   for (i=0; i<3; i++)
4   {   if (i==1)
5           cout << "A = | ";
6       else
7           cout << "    | ";
8       for (j=0; j<3; j++)
9           cout << A.n[j][i] << " ";
10      cout << "|" << endl;
11   }
12 }

これは、行列操作を行うために書いているプログラムの関数です。mat3x3 は 3x3 行列の構造体です (An[3][3] として保存されます)。5 行目の出力の 'A' の代わりに、呼び出し機能。

私は A、B、および C しか使用しません。3 つの異なる関数を記述することもできますが、それを行うためのより良い方法があるはずだと感じています。

out3x3(B); と言ったら A = | のみが表示されます。|。

私はこれが起こることを望みます:

out3x3(B);

B = | |

out3x3(C);

C = | |

助けてくれてありがとう。

4

2 に答える 2

6

変数の名前は実行時に存在しません。それらは単にコンパイル時の構成です。std::string引数を取るように関数を変更するようなこともする必要があります。

void out3x3(mat3x3 &A, std::string name)
{
  // ...
  cout << name << " = | ";
  // ...
}

次に、そのように呼び出します。

out3x3(A, "A");
out3x3(B, "B");

次に、マクロを使用して、変数名を複製していないように感じさせることができます。ただし、これはまったくお勧めしません。代わりに、関数にマトリックスの内容(|sの間)を出力させてから、次のようにすることをお勧めします。

cout << "A = ";
out3x3(A);

変数名の印刷は、マトリックスの内容の印刷とは完全に独立している必要があります。次の例えを考えてみましょう。

int x = 5;
cout << x;

これは、の値を出力するだけでx、他には何もありません。ラベルを付けたい場合は、手動で行う必要があります。

int x = 5;
cout << "x = " << x;

そして、誰が知っていますか?たぶん、あなたはoperator<<あなたのmat3x3タイプのオーバーロードに取り掛かるでしょう、そしてすぐにあなたはこれをするでしょう:

cout << "A = " << A;

ずっときれい。

于 2013-03-12T13:16:13.880 に答える
1

マクロをラッパーとして使用して呼び出すことができます

#define OUT3X3(mat)        \
    out3x3(&mat, ##mat);

関数プロトタイプを次のように変更します

void out3x3(mat3x3 &A, string name)

呼び出しは

OUT3X3(A);
于 2013-03-12T13:19:04.247 に答える