将二维数组传递给 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章