【问题标题】:Invalid conversion from 'int' to 'int**' [-fpermissive] when printing a 2D int array打印 2D int 数组时从 'int' 到 'int**' [-fpermissive] 的无效转换
【发布时间】:2021-01-05 07:54:26
【问题描述】:

这是我的代码:

void printArray(int **A, int m, int n)
{
    int row = m;
    int col = n;

    int **array;
    array = new int *[row];

    for (int i = 0; i < row; ++i)
    {
        array[i] = new int[col];
    }

    for (int p = 0; p < row; p++)
    {
        for (int l = 0; l < col; l++)
        {
            cout << array[row][col] << " ";
        }
    }
}
int main()
{

    int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    cout << printArray(arr, 3, 3); // error:
    // invalid conversion from 'int' to 'int**' [-fpermissive]|
} 

谁能告诉我我在函数调用中做错了什么?

【问题讨论】:

  • 我没有看到指针A在函数中的使用位置。
  • 请在问题中包含完整的错误消息。它应该包含更多信息,也许您无法破译它,但存在错误消息以帮助您找到代码中的错误
  • 我不确定如何将**A 链接到**array,然后在main 中正确调用该函数。 - 谢谢弗拉德
  • 错误:||=== 构建文件:“无项目”中的“无目标”(编译器:未知)===| C:\Users\tf\Documents\Data Structures and Algorithms in c++\C++ Book\R-1.9.cpp||在函数'int main()'中:| C:\Users\tf\Documents\Data Structures and Algorithms in c++\C++ Book\R-1.9.cpp|42|error: cannot convert 'int ()[3]' to 'int* '| C:\Users\tf\Documents\Data Structures and Algorithms in c++\C++ Book\R-1.9.cpp|4|注意:初始化'void printArray(int**, int, int)'的参数1| ||=== 构建失败:1 个错误,0 个警告(0 分钟,1 秒)===|

标签: c++ multidimensional-array output function-definition


【解决方案1】:

对于初学者来说,函数printArray 声明如下

void printArray(int **A, int m, int n);

没有意义,因为函数中没有使用指针A

此外,参数的类型为int **,而在此调用中传递的参数

printArray(arr, 3, 3);

类型为int ( * )[3]

即指针类型不兼容,编译器报错。

对于不完整类型 void 没有重载运算符

要输出任何二维数组(例如带有 int 类型的元素,尽管元素类型也可以是类型模板参数),您可以按以下方式编写模板函数

template <size_t M, size_t N>
std::ostream & printArray( const int ( &a )[M][N], std::ostream &os = std::cout )
{
    for ( const auto &row : a )
    {
        for ( const auto &item : row )
        {
            os << item << ' ';
        }

        os << '\n';
    }

    return os;
}

并且函数可以像这样调用

printArray( arr ) << '\n';

这是一个演示程序。

#include <iostream>

template <size_t M, size_t N>
std::ostream & printArray( const int ( &a )[M][N], std::ostream &os = std::cout )
{
    for ( const auto &row : a )
    {
        for ( const auto &item : row )
        {
            os << item << ' ';
        }

        os << '\n';
    }

    return os;
}

int main() 
{
    int arr[3][3] = 
    {
        {1, 2, 3}, 
        {4, 5, 6}, 
        {7, 8, 9}
    };
    
    printArray( arr ) << '\n';
    
    return 0;
}

它的输出是

1 2 3 
4 5 6 
7 8 9 

否则,您可以在不使用模板的情况下声明和定义函数,如下面的演示程序所示。

#include <iostream>

const size_t N = 3;

std::ostream & printArray( const int a[][N], size_t m, std::ostream &os = std::cout )
{
    for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            os << a[i][j] << ' ';
        }

        os << '\n';
    }

    return os;
}

int main() 
{
    int arr[][N] = 
    {
        {1, 2, 3}, 
        {4, 5, 6}, 
        {7, 8, 9}
    };
    
    const size_t M = sizeof( arr ) / sizeof( *arr );
    
    printArray( arr, M ) << '\n';
    
    return 0;
}

程序输出又是

1 2 3 
4 5 6 
7 8 9

或者,也可以使用基于范围的 for 循环作为内部循环,通过以下方式定义函数。

std::ostream & printArray( const int a[][N], size_t m, std::ostream &os = std::cout )
{
    for ( size_t i = 0; i < m; i++ )
    {
        for ( const auto &item : a[i] )
        {
            os << item << ' ';
        }

        os << '\n';
    }

    return os;
}

【讨论】:

    【解决方案2】:

    默认情况下,数组是按指针传递的,而整数是按值传递的。您可以简单地将数组以及 col 和 row 传递给函数。另外,请记住,您应该使用cout &lt;&lt; array[i][j] &lt;&lt; " "; 代替cout &lt;&lt; array[row][col] &lt;&lt; " ";(如果您愿意,也可以使用其他变量)。下面是一个例子。另一个问题是,您应该直接调用printArray(arr, 3, 3);,而不是cout &lt;&lt; printArray(arr, 3, 3);

    #include<iostream>
    void printArray(int array[][something], int col, int row) {
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                std::cout << array[i][j] << " ";
            }
            std::cout << '\n';
        }
    }
    int main()
    {
    
        int arr[something][something] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        printArray(arr, 3, 3);
    } 
    

    用你的数组的实际大小替换一些东西

    【讨论】:

    • 这行不通,因为你不能有像int [][] 这样的类型,你只能有一个未绑定的索引,即你可以有int [][3]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多