2013-03-12 15 views
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]. Вместо «A» в выводе в строке 5 я хотел бы, чтобы он выводил имя любой переменной, которую я использовал для матрицы в вызова функции.Вывести переменную как строку через функцию передачи

Я использую только A, B и C. Я мог бы просто написать три разные функции, но я чувствую, что должен быть лучший способ сделать это.

Если я говорю out3x3 (B) , он будет показывать только А = | |

Я хотел бы, чтобы это произошло:

out3x3 (B),

0123.

out3x3 (C);

C = | | 

Благодарим за любую помощь.

+0

вы можете передать имя как первый аргумент 'std :: string const & name' и напечатать его вместо' A' – kassak

ответ

6

Имена переменных не существуют во время выполнения. Они просто компилируют временные конструкции. Вы должны были бы сделать что-то подобное изменение функции взять std::string аргумент тоже:

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

Затем вызовите его следующим образом:

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

Затем можно использовать макрос, чтобы сделать это чувствовать как вы не дублируете имя переменной. Однако я вообще этого не рекомендую. Вместо этого я рекомендую просто сделать вашу функцию распечатки содержимого матрицы (между | с), а затем сделать это:

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

Печать имени переменной должны быть полностью независимы от распечатывания содержимое поля матрица. Рассмотрим следующую аналогию:

int x = 5; 
cout << x; 

Это просто выводит значение x, ничего другого. Если я хочу это обозначить, я должен сделать это вручную:

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

И кто знает? Может быть, вы будете обходить перегрузки operator<< для mat3x3 типа и скоро вы будете делать это:

cout << "A = " << A; 

Гораздо красивее.

+0

Это, плюс '#define matrixOut (matrixName) out3x3 (matrixName, #matrixName) 'или тому подобное ... – cHao

+0

@cHao Моя рекомендация заключается в том, что они избегают этого. –

+0

Проблема с печатью имени по отдельности заключается в том, что форматирование будет испорчено, если имя переменной больше одной буквы. – cHao

1

Вы можете использовать макрос как обертка называть его

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

и изменить прототип функции для

void out3x3(mat3x3 &A, string name) 

Вызов будет

OUT3X3(A); 
Смежные вопросы