但是我不知道如何使用
printMatrix 函数。
该语句包含一些内容,但您似乎在问“我如何将 transpose 函数作为参数传递给 printMatrix 函数,以便 printMatrix 函数打印矩阵(或将根据我传递的函数打印矩阵的任何其他变体)。
本质上,如果这是您所追求的,您只是想传递一个函数,该函数将以某种方式操作您的矩阵作为参数,然后让打印函数应用该函数,然后打印结果。本质上,它与创建转置矩阵然后将转置矩阵作为单个参数传递给printMatrix 相同,但是通过包含另一个对矩阵执行某些操作的参数来改变printMatrix 的行为打印出来有优点。
无论您是先创建转置并传递它,还是传递原始矩阵和转置函数,您都需要第二个矩阵来保存原始的转置,以便可以打印其值。关键区别在于转置矩阵需要在什么范围内可见。从您的indexTranspose 函数来看,这并不重要。您有两个选择(1)您保留返回类型 void 并传入第二个矩阵以填充原始的转置,或者(2)您更改 indexTranspose 函数的返回类型并动态分配矩阵来保存转置并返回一个指向它的指针。
(注意: 作为两者的扩展,您可以传递对现有矩阵的引用,或声明并返回 STL 容器,但是当您使用二维数组时,这些将留到另一天基本类型int)
最简单的方法是传入另一个 3x3 2D 数组来保存转置值。您可以简单地向您的 indexTranspose 函数添加另一个参数来完成此操作,例如
/* Function to find the transpose using indices */
void indexTranspose (int (*transpose)[3], int (*givenMatrix)[3])
{
//Find the transpose of the matrix
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
transpose[i][j] = givenMatrix[j][i];
}
}
}
(注意:无论您传递int transpose[][3] 还是int (*transpose)[3],它们都是等价的。当您将数组作为参数传递给函数时,第一级间接转换为指向第一个元素——在这种情况下指向int[3]数组的指针。上面的第二种形式显示了转换的显式结果)
如果您想将indexTranspose 作为参数传递给printMatrix,您必须了解函数指针的类型。 indexTranspose 的完整形式是:
void (*f)(int (*)[3], int (*)[3]);
(一个函数指针f,返回类型为void,它接受两个指向int数组的指针[3],例如两个3x3 2D数组,作为其参数)
因此,将函数指针作为参数添加到 printMatrix 函数可能是:
void printMatrix (int (*m)[3], void (*f)(int (*)[3], int (*)[3]))
{
int altered[3][3] = {{0}};
f (altered, m); /* apply function to original m, with results in altered */
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
std::cout << " " << std::setw(3) << altered[i][j];
std::cout.put ('\n');
}
}
注意:这里是第二个矩阵的范围来保存将函数应用于第一个矩阵的结果变得很重要。由于您只使用结果进行打印,因此可以将第二个矩阵(上面称为altered)声明为printMatrix 函数的本地以进行打印。在上面,您的printMatrix 函数现在采用原始矩阵m 和一个指向返回void 并接受两个3x3 2D 整数矩阵作为其参数的函数的指针,它使用以下值更新第一个3x3 2D 数组的值转置操作的结果(或函数将执行的任何操作)
然后在您的调用函数中(此处为main()),将原始矩阵连同指向indexTranspose 的指针一起传递给indexTranspose 并在printMatrix 中发生转置,然后输出,您只需要做的是调用:
printMatrix (givenMatrix, indexTranspose);
实际上,您只需将更改后的矩阵作为矩阵参数传递给printMatrix,因为您可能会将该矩阵用于打印以外的用途,但学习如何传递函数以提供操作也是如此(因为您将来可能会将该函数传递给打印函数以外的其他东西)
把它们放在一起,你可以做类似的事情:
#include <iostream>
#include <iomanip>
/* Function to find the transpose using indices */
void indexTranspose (int (*transpose)[3], int (*givenMatrix)[3])
{
//Find the transpose of the matrix
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
transpose[i][j] = givenMatrix[j][i];
}
}
}
void printMatrix (int (*m)[3], void (*f)(int (*)[3], int (*)[3]))
{
int altered[3][3] = {{0}};
f (altered, m);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
std::cout << " " << std::setw(3) << altered[i][j];
std::cout.put ('\n');
}
}
int main (void) {
int givenMatrix[3][3];
std::cout << "Please input matrix values in the order described " << '\n';
for (int i = 0; i < 3; i++) {
std::cout << "Eneter Three Elements for Row: " << i + 1 << '\n';
for (int j=0; j < 3; ++j){
if (!(std::cin >> givenMatrix[i][j])) { /* always VALIDATE input */
std::cerr << "error: invalid integer input.\n";
return 1;
}
}
}
/* pass given & pointer to function */
printMatrix (givenMatrix, indexTranspose);
}
使用/输出示例
$ ./bin/prn_mtrx_by_fn
Please input matrix values in the order described
Eneter Three Elements for Row: 1
1 2 3
Eneter Three Elements for Row: 2
4 5 6
Eneter Three Elements for Row: 3
7 8 9
1 4 7
2 5 8
3 6 9
如果您对将函数指针作为参数传递有任何其他问题,或者如果我误解了您的问题,请告诉我,我很乐意为您提供进一步的帮助。