将二维数组传递给 double function_name 时出错

Posted

技术标签:

【中文标题】将二维数组传递给 double function_name 时出错【英文标题】:Error in passing 2-D array to double function_name 【发布时间】:2012-03-12 00:15:32 【问题描述】:

我正在开发一个程序,该程序将高度值从文件读取到二维数组、矩阵中,并且我试图将该数组传递给另一个查找最大值的函数。我知道,默认情况下,数组是通过引用传递的,但我并不想在函数中更改数组的值,所以这无关紧要。我已经浏览了几页关于调用数组的页面,但是我无法找到任何提及我在编译代码时遇到的错误类型。问题似乎在于被调用的参数数量或被调用的方式,但我看不出函数的各种外观有任何差异。我的猜测是传递一个二维数组有一些东西,我在课堂上没有被告知,而且我还没有自己学过。任何帮助将不胜感激。 代码是:

#include <fstream>
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

// First instance of function declaration
double find_max(double elevations[][3600], double ilat, double ilon, int nlat, int nlon);

int main(int argc, char *argv[]) 

// Declare program variables
double lat_init, lon_init;
double lat_res, lon_res;
double peak, valley;
int lon_col, lat_row;
string indat, inpoints;
.
.
.
double elevations[lat_row][lon_col];

// Open and read topographic data file
ifstream topo_points;
topo_points.open(inpoints.c_str());

for (int i=0; i<lat_row; i++) 
    for (int j=0; j<lon_col; j++)
        topo_points >> elevations[i][j];


// Call function to find peak in the data
peak = find_max(elevations, lat_init, lon_init, lat_row, lon_col);

return 0;




// ***** Here lie the functions *****

// This function reads in the array of elevations, initial latitude and longitude
// of the data, and the number of data points and uses this information to find
// the latidude and longitude of the highest point on earth
double find_max(double elev[][3600], double ilat, double ilon, int nlat, int nlon) 

double num, max;
double latpos, lonpos;

max = 0;

for (int i=0; i<nlat; i++) 
    for (int j=0; j<nlon; j++) 
    num = elev[i][j];
    if (num > max) 
        max=num;
        latpos= ilat - i;
        lonpos= ilon + j;
    
    


cout << "The tallest peak on earth has an altitude of " << max;
cout << " and is located at " << latpos << "deg latitude and ";
cout << lonpos << "deg longitude";

return max;

但是,当我调用该函数时,我收到以下错误:

错误:无法将参数 'double (*)[(((long unsigned int)(((long int)lon_col) - 1)) + 1u)]' 转换为 'double (*)[3600]' 1' to 'double find_max(double (*)[3600], double, double, int, int)'

【问题讨论】:

【参考方案1】:

从我在代码中看到的,有一些小故障。

您已将数组高程定义为

双海拔[lat_row][lon_col];

这是行不通的,因为 c 样式数组的大小必须在编译时确定。而且由于 lat_row 和 lon_col 是变量,所以这是一个错误。

因此,您既可以使用具有动态内存分配的数组,也可以使用 std::vector,这在大多数情况下更可取。所以,在你的情况下,你可以有类似的东西:

typedef std::vector< std::vector<double> > ElevationsType;
ElevationsType elevations;

然后只使用该数组或双精度数组。 然后,您的 find_max 函数可以声明为:

double find_max(const ElevationsType &elevations, double ilat, double ilon);

请注意,在这种情况下,您不需要传递 nlat 和 nlon,因为您可以这样做:

ElevationsType::size_type nlat, nlon, i, j;
nlat = elevations.size();

for (i = 0; i != nlat; ++i) 
    nlon = elevations[i].size();
    for (j = 0; j != nlon; ++j) 
        const double element = elevations[i][j];
        // do whatever you need to do with the element
    

当然,如果您的数组具有固定大小,您可以在创建 ElevationsType 类型的对象后设置它(std::vector::resize),或者只分配足够的空间(std::vector::reserve)和然后初始化它。如果它很大,可能会提高性能。

但是,如果你选择使用 c 风格的数组,它会是这样的:

double **elevations = (double **)malloc(sizeof(double*) * lat_row);
for (size_t i = 0; i != lat_row; ++i) 
    elevations[i] = (double*)malloc(sizeof(double) * lat_col);

    // initialize the elements
    for (size_t j = 0; j != lat_col; ++j) 
        elevations[i][j] = 100.0; /* your value */
        std::cout << "elevations[" << i << "][" << j << "] = " << elevations[i][j] << std::endl;
    

这对很多人来说更乏味..可以这么说。如果你走那条路,别忘了用 free() 释放所有分配的内存。

你也可以使用c++ new 操作符来分配内存,但原理大同小异。

所以我建议你使用 std::vector。至少在您经验有限的情况下,使用它更容易。它还会处理内存分配/释放,这会导致许多不好的事情、溢出、泄漏等,如果您使用向量,这些事情将被避免。

【讨论】:

非常感谢您的回答!我发现只要我使用整数值而不是程序变量设置数组大小,调用函数就可以正常工作。我对 c++ 还是有点陌生​​,虽然我过去曾尝试过使用向量,但我并不完全熟悉它们。这似乎是一个变得更好的好机会! 是的,坚持使用 "std::vector" 以避免使用 C 样式数组(指针等)时遇到的困难。虽然知道(C 风格的数组)仍然很有用,如果你有时间,有很多关于这个主题的文章。对于初学者,请参阅我在此论坛中最近的两篇帖子:***.com/questions/9583086/… 和 ***.com/questions/9672731/…【参考方案2】:

您正在尝试传递一个大小动态确定(即在运行时)的数组,并将其传递给一个函数,该函数期望该数组在编译时确定其第二维为 3600(这看起来很漂亮合理的抱怨,实际上)。

【讨论】:

以上是关于将二维数组传递给 double function_name 时出错的主要内容,如果未能解决你的问题,请参考以下文章

将智能指针传递给函数

C语言通过指针 将一个二维数组赋值给另一个二维数组

将二维 C 数组传递给 python numpy

将二维数组传递给另一个类 C++

如何将二维数组传递给函数[重复]

无法将二维字符数组传递给函数(C++)