c ++对函数执行操作和声明函数

时间:2014-04-23 10:35:21

标签: c++ arrays function variables function-declaration

我想为以下代码声明一个函数,该函数是从文本文件中读取的矩阵。代码可以在下面看到。

if (infile == "A.txt")
    {
        ifstream myfile("A.txt");
    string line;
    int MatA[3][3];
    int i=0;
    while (getline (myfile, line))
    {
        stringstream ss(line);
        for(int j=0; j<3; j++)
            ss >> MatA[i][j]; // load the i-th line in the j-th row of mat
        i++;
    }
    // display the loaded matrix                                    
        for(int i=0; i<3; i++)
            {
                for(int j=0; j<3; j++)
            cout<<MatA[i][j]<<" ";
            cout<<endl;
            }

        }

现在我试图将这个矩阵声明为一个函数,所以当我稍后在我的代码中执行操作时,我可以调用函数而不必重写整个矩阵。但是我在执行此操作时遇到了困难,我将尝试将矩阵声明为函数可以在下面看到。

int display (int MatA)
{
     for(int i=0; i<3; i++)
    {
        for(int j=0; j<3; j++)
           cout<<MatA[i][j]<<" ";
       cout<<endl;
    }
}

但是,如果[i]&#39;表达式必须包含指向对象类型的指针,则会发生错误。

如果有人能提供帮助,那就太棒了!

2 个答案:

答案 0 :(得分:1)

例如,可以通过以下方式定义函数

const size_t N = 3;

void display( const int ( &MatA )[N][N] )
{
    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ ) std::cout << MatA[i][j] << " ";
        std::cout << std::endl;
    }
}

另一种方式是以下

const size_t N = 3;

void display( const int ( *MatA )[N], size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < N; j++ ) std::cout << MatA[i][j] << " ";
        std::cout << std::endl;
    }
}

这些功能可以称为

#include <iostream>

const size_t N = 3;

// the function definitions

int main()
{
   int a[N][N] = {};
   // some code to fill the matrix

   display( a );
   display( a, N );
}

最后你可以通过 @boycy 使用评论中建议的方法,但对于我来说,我不喜欢这种方法。 例如

#include <iostream>

const size_t N = 3;

void display( const int **MatA, size_t m, size_t n )
{
    for ( size_t i = 0; i < m * n; i++ )
    {
        std::cout << MatA[i] << " ";
        if ( ( i + 1 ) % n == 0 ) std::cout << std::endl;
    }
}

int main()
{
   int a[N][N] = {};
   // some code to fill the matrix

   display( reinterpret_cast<const int **>( a ), N, N );
}

答案 1 :(得分:0)

您正在将int MatA传递给显示,但您希望int[][]作为参数。然而,这不起作用。所以你要么传递int**并在其上执行指针算术,要么你必须为这个矩阵创建一些更好的存取器。

我建议您查看类似的OpenCV Mat类型的实现,以解决您的问题。