Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使函数在C+中接收任意大小的多维数组+;? 我试图用矩阵作为输入,并在C++中输出它的一些函数。但我希望它能在任意大小的mxn矩阵上工作。i、 e.我不能在函数的参数中指定n(双矩阵[][n])的值。因为n是任意的。 是否有任何方法可以将任意mxn二维数组传递给函数? 先谢谢你。 -indiajoe模板 template <typename T, size_t W, size_t H> void foo(T (&array)[W][H]) { // Do stuff with array here } void foo(T&数组)[W][H]){ //在这里使用数组进行操作 } > p>使用标准C++库,可以这样做: typedef std::vector<double> Dim; typedef std::vector<Dim> Matrix; void workOnMatrix(Matrix& matrix) { } typedef std::vector Dim; 向量矩阵; 无效作业矩阵(矩阵和矩阵) { } < >编辑:我删除了对“强”> STL的引用,因为SGI的“强> STL标准C++库< /强>不是同一回事。它们之间的差别如此之大,似乎不应该相互取舍。_C++_Function_Multidimensional Array_Arguments - Fatal编程技术网

如何使函数在C+中接收任意大小的多维数组+;? 我试图用矩阵作为输入,并在C++中输出它的一些函数。但我希望它能在任意大小的mxn矩阵上工作。i、 e.我不能在函数的参数中指定n(双矩阵[][n])的值。因为n是任意的。 是否有任何方法可以将任意mxn二维数组传递给函数? 先谢谢你。 -indiajoe模板 template <typename T, size_t W, size_t H> void foo(T (&array)[W][H]) { // Do stuff with array here } void foo(T&数组)[W][H]){ //在这里使用数组进行操作 } > p>使用标准C++库,可以这样做: typedef std::vector<double> Dim; typedef std::vector<Dim> Matrix; void workOnMatrix(Matrix& matrix) { } typedef std::vector Dim; 向量矩阵; 无效作业矩阵(矩阵和矩阵) { } < >编辑:我删除了对“强”> STL的引用,因为SGI的“强> STL标准C++库< /强>不是同一回事。它们之间的差别如此之大,似乎不应该相互取舍。

如何使函数在C+中接收任意大小的多维数组+;? 我试图用矩阵作为输入,并在C++中输出它的一些函数。但我希望它能在任意大小的mxn矩阵上工作。i、 e.我不能在函数的参数中指定n(双矩阵[][n])的值。因为n是任意的。 是否有任何方法可以将任意mxn二维数组传递给函数? 先谢谢你。 -indiajoe模板 template <typename T, size_t W, size_t H> void foo(T (&array)[W][H]) { // Do stuff with array here } void foo(T&数组)[W][H]){ //在这里使用数组进行操作 } > p>使用标准C++库,可以这样做: typedef std::vector<double> Dim; typedef std::vector<Dim> Matrix; void workOnMatrix(Matrix& matrix) { } typedef std::vector Dim; 向量矩阵; 无效作业矩阵(矩阵和矩阵) { } < >编辑:我删除了对“强”> STL的引用,因为SGI的“强> STL标准C++库< /强>不是同一回事。它们之间的差别如此之大,似乎不应该相互取舍。,c++,function,multidimensional-array,arguments,C++,Function,Multidimensional Array,Arguments,实现这一点的方法不止一种。最好的方法可能是定义一个矩阵类并将常量引用传递给实例 class matrix { double* values; size_t m; size_t n; public: matrix(size_t m_, size_t n_) : m(m_), n_(n) { values = new double[m * n]; } ~matrix() { delete[] v

实现这一点的方法不止一种。最好的方法可能是定义一个矩阵类并将常量引用传递给实例

class matrix
{
    double* values;
    size_t m;
    size_t n;
public:
    matrix(size_t m_, size_t n_)
    : m(m_), n_(n)
    {
        values = new double[m * n];
    }

    ~matrix()
    {
        delete[] values;
    }

    double& operator(size_t i, size_t j)
    {
        assert(i < m);
        assert(j < n);
        return values[i + m * j];
    }

    const double& operator(size_t i, size_t j) const
    {
        assert(i < m);
        assert(j < n);
        return values[i + m * j];
    }
private:
    matrix(const matrix&);
    matrix& operator =(const matrix&);
};

void function(const matrix& matrix);
如果您确实想使用double[m][n]并使函数接受任何矩阵大小,您可以手动将其转换为double**,方法如下:

void function(double** lines, size_t m, size_t n);

void client()
{
    const size_t m = ...;
    const size_t n = ...;
    double matrix[m][n];

    double* temporary[m];
    for (size_t i = 0; i < m; ++ i) {
        temporary[i] = &matrix[i][0];
    }

    function(temporary, m, n);
}
void函数(双**行,大小为m,大小为n);
无效客户端()
{
常量大小_t m=。。。;
常数大小n=。。。;
双矩阵[m][n];
双*临时[m];
对于(尺寸i=0;i
或者,使用模板函数进行转换:

void function(double** array, size_t m, size_t n);

template < size_t M, size_t N >
void function(double array[M][N]) {
    double* temporary[M];
    for (size_t i = 0; i < M; ++ i) {
        temporary[i] = &array[i][0];
    }
    function(temporary, M, N);
}
void函数(双**数组,大小为m,大小为n);
模板
空洞函数(双数组[M][N]){
双*临时[M];
对于(尺寸i=0;i

这是因为数组只能对指针衰减一次(即从双[n]衰减到双*但从双[m][n]衰减到双*[n])。

你可以用Tomalak的方法来做,但我当然不推荐这样做。如果数组是通过参数传递的,则永远不能从另一个不是模板的函数中调用该函数。这意味着几乎整个程序都必须是模板化代码。理论上可以,但通常是不切实际的

如您所知,不能使用
double**
界面。您可以强制转换为该类型,但还需要传入大小信息,以便:

my_ptrptr[row * col_size][col];
您必须明确这样的维度,因为编译器不再知道它需要什么

解决你问题的最好办法就是不要那样做。利用STL,这样你就不必处理像这样的胡说八道了。用斯蒂芬的答案

不过,如果要使用模板,您可以做的另一件事是将其编写为通用的:

template < typename Iter >
void fun(Iter begin, Iter end)
{
  // begin[x][y]... (*begin)[y]...++begin, etc...
}
...
double arr[arr_row_count][arr_col_count];
fun(arr, arr+arr_row_count);
模板
无效乐趣(Iter开始,Iter结束)
{
//开始[x][y]…(*begin)[y]…++begin等。。。
}
...
双arr[arr_row_count][arr_col_count];
乐趣(arr,arr+arr_行数);

这一个的主要好处是可以处理任何看起来像数组的东西。这意味着它将成为一种非常好的“临时”方法,您可以使用
double[][]
类型,直到您可以开始使用更好的方法,如
std::vector
和/或
boost::array
。按照Tomalak的方式去做,你以后就无法做出这种改变……这是不使用这种方法的另一个原因。

抵制使用“STL”的冲动,我不喜欢C风格的编码,所以使用STL对我来说没有问题;)这是一个比Toalalk更好的解决方案。我想,这是关于混淆C++标准库和STL STL的一个标准,它是部分地被纳入C++标准库的标准库;它们不是同一件事(尽管使用太普遍)。@Tomalak-“请跳出你的泡泡思考。”动态矩阵分配怎么样?@Eric:为什么?不需要。OP想要一种方法来传递任意维的二维数组,现在就是了!如果函数的代码很大,如果使用大量不同大小的矩阵调用,可能会导致应用程序代码大小的大幅增加。不是每个编译器都足够聪明,可以合并模板函数。@Sylvain:问题中没有指定代码应针对可执行文件大小进行优化。也许应该优化它的易读性、可维护性和易用性,在这种情况下,这就是解决方案。(你喜欢我巧妙的回避吗?:P)@Sylvain-是的,这个代码导致了很多多余的专门化。如果需要使用模板代码,最好使用迭代器方法。它仍将专门用于列计数,但至少不会用于行计数。迭代器方法还有更清晰易读的好处。“如果数组是通过参数传递的,你永远不能从另一个不是模板的函数中调用该函数。”这完全是胡说八道。你到底是怎么想的?您实际上是在谈论仅在运行时才知道其维度的数组吗?因为我的答案当然是关于普通的静态分配数组,并且我的函数可以在代码中的任何上下文中使用。感谢boost库链接。你的第二个建议是将2d矩阵折叠成一维指针数组,这似乎是解决我问题的最简单的方法。非常感谢大家用各种方法来做这件事。
template < typename Iter >
void fun(Iter begin, Iter end)
{
  // begin[x][y]... (*begin)[y]...++begin, etc...
}
...
double arr[arr_row_count][arr_col_count];
fun(arr, arr+arr_row_count);