Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++_Arrays_Visual Studio 2010_Function_Declaration - Fatal编程技术网

C++ 数组的堆栈溢出数组

C++ 数组的堆栈溢出数组,c++,arrays,visual-studio-2010,function,declaration,C++,Arrays,Visual Studio 2010,Function,Declaration,我正在计算一些值,并使用如下函数将它们存储在变量中: array<array<double,1000>,1000> index; sum(double A, ..., array<array<double, 1000>,1000> & index); 知道如何解决这个问题吗?默认情况下,Win32中的每个线程都有1MB的堆栈空间,一百万个双倍线程将占用8MB的堆栈空间。解决方案是使用new从堆中分配它们。由于没有将指向“index”的指针

我正在计算一些值,并使用如下函数将它们存储在变量中:

array<array<double,1000>,1000> index;
sum(double A, ..., array<array<double, 1000>,1000> & index);

知道如何解决这个问题吗?

默认情况下,Win32中的每个线程都有1MB的堆栈空间,一百万个双倍线程将占用8MB的堆栈空间。解决方案是使用
new

从堆中分配它们。由于没有将指向“index”的指针传递给平均值函数,因此对象(即数组)将在堆栈上重建(复制)。 我不知道默认情况下堆栈的大小是多少,但您仅为阵列使用了~8MB,这是一个坏主意。

以2d方式声明1000 x 1000 double的动态方法(避免堆栈溢出)是

std::vector<std::array<double,1000>> index(1000);
std::向量索引(1000);
-编辑- 正如迈克·西摩在评论中所说的那样。荣誉应该给予的人的荣誉…;)

索引的类型是
std::vector
,因此您需要这样的参数

void average (..., std::vector<std::array<double,1000>> & index, ...)
void average(…,std::vector&index…)

好的,让我们组装所有部件:

  • sizeof(数组,1000>)约为8MB
  • 通常的堆栈较小,所以当
  • 创建这样一个局部变量
  • 按价值传递
如果堆栈剩余空间较少,则未定义行为。在debug build中,您可能幸运地得到了一条相关的消息来解决这个问题。在典型的发布版本中,会进行堆栈检查,这会让您陷入混乱

由于您的对象现在位于名称空间,直接的问题可以通过引用传递来解决。无论如何,什么通常是个好主意

如果无法避免列出的有问题的用法,则必须减小类大小。最简单的解决方案是使用size构造函数创建
vector
,立即获得整个大小

我使用一个对象(
Model Model=newmodel;
)来存储一些向量(数组)

float fc1[input_dim][hidden_layer_dim_1]={0.0};
浮动fc2[隐藏层尺寸1][隐藏层尺寸2]={0.0};
浮点fc3[隐藏层大小2][output大小]={0.0}

我得到这个错误是因为尺寸有点大:)。我用这个变化解决了这个问题:

模型->
型号*型号=新型号

当我使用指针时,问题就解决了。当然,变量也会随之发生变化:


model.hidden\u layer\u dim\u 1
->
model->hidden\u layer\u dim\u 1

因此,解决方案是选择动态数组。在这种情况下,如何使用新的数组编写数组?@MelMed:我建议
向量索引(1000)
直接使用
new
通常是个坏主意。@MelMed:解决方法是改变平均值函数以接收指针。为什么是new?为什么不使用vector?请记住
>
在C++98上不起作用,以防OP使用它。您需要
>
@BalogPal您的意思是平均值采用的是索引(通过值)而不是&index(通过引用,这可能与常量&)有关吗?以及如何在双for循环中访问此类变量?我曾经用数组A[I][j]做过,现在呢?@MelMed使用
操作符[]
将返回一个对
std::array
的引用,该数组反过来可以使用
操作符[]
访问,每个操作符提供一个双元素。因此,您仍然可以使用
索引[i][j]
访问元素。这将继续工作。您甚至可以快速交换()。但您可能会受到意外调整大小()的影响。
std::vector<std::array<double,1000>> index(1000);
void average (..., std::vector<std::array<double,1000>> & index, ...)