【问题标题】:How can a function acces a matrix?函数如何访问矩阵?
【发布时间】:2020-12-26 16:58:45
【问题描述】:

我有一个函数,并在它上面声明了一个矩阵。

int M[100][100];
int function(int row , int col)
{
 if (M[row][col] == 1)return 1;
 return 0;
}

我的问题是,如果我不将它作为参数传递,函数如何访问矩阵,例如:

int function(int row , int col , int X[][100])

谢谢。

【问题讨论】:

  • 如果变量M 声明在全局命名空间范围内(在函数、类或其他命名空间之外),那么它对所有函数都可用。全局变量虽然被看不起,但应该避免。
  • @CosminAndrei 函数访问矩阵是因为矩阵在函数的块范围内是可见的,因为它在函数定义之前的声明。
  • 这还不行吗?
  • @Someprogrammerdude 请在回答部分回答:)
  • 您是否想知道它“为什么”起作用而不是“如何”?你的代码已经可以做到了

标签: c++ scope namespaces name-lookup function-definition


【解决方案1】:

您可以使矩阵成为全局变量(不推荐),以便能够在函数中访问它而无需将其作为参数传递。有关具有文件范围全局访问权限的变量与具有进程范围全局访问权限的变量,请参阅 this 答案。

【讨论】:

    【解决方案2】:

    我有一个函数,并在它上面声明了一个矩阵

    矩阵和函数都在同一个声明区域中声明(似乎在全局命名空间中)。因此,由于矩阵是在函数定义之前声明的,所以矩阵声明在函数体中是可见的。

    即根据非限定名查找(The C++ 17 Standard, 6.4.1 Unqualified name lookup)

    6 在作为命名空间 N 成员的函数的定义中, 在函数的 declarator-id 之后使用的名称应在之前声明 它在使用它的块中或在其中一个封闭的块中的使用 块(9.3)或应在其在命名空间 N 中使用之前声明,或者,如果 N 是一个嵌套命名空间,应在其使用之前声明 N 的封闭命名空间。

    如果要交换矩阵声明和函数定义之类的

    int function(int row , int col)
    {
     if (M[row][col] == 1)return 1;
     return 0;
    }
    
    int M[100][100];
    

    那么编译器会报错,因为函数体中使用的名称M在使用之前不会被发现。

    【讨论】:

      【解决方案3】:

      您已将矩阵设为全局变量,这意味着它可用于其下定义的所有函数(并且,通过适当的extern 声明,其他函数也可以使用它!)。

      全局变量并不是最广泛推荐使用的东西,因为它使数据流更难跟踪和证明。

      你可以考虑把矩阵做成一个(数组是类的数据成员),那么function可以是一个成员函数(“方法") 这个类。这使所有东西都整齐地包装在一起。成员函数自动访问其他成员。

      【讨论】:

        猜你喜欢
        • 2014-10-13
        • 1970-01-01
        • 2019-04-08
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        • 2011-02-18
        • 2014-08-28
        相关资源
        最近更新 更多