Я читаю сетевые данные из файла .txt, чтобы создать график с помощью библиотеки графов ускорения.
Формат данных:
[num_nodes] [num_edges]
[source_node] [target_node]
[from_node] [to_node] [arc_weight_1] [arc_weight_2]
...
[from_node] [to_node] [arc_weight_1] [arc_weight_2]
Например,
264346 733846
229246 264275
1 2 803 2008
...
259707 261228 389 389
В следующем фрагменте кода я инициализирую массив пар для хранения пары узлов от / до каждого ребра.
Переменные, заканчивающиеся подчеркиванием, являются переменными-членами класса.
std::ifstream infile("USA.txt");
infile >> num_nodes_ >> num_edges_ >> source_ >> target_;
std::pair<int, int> edge_pairs_array[num_edges_];
Тем не менее, последняя строка дает мне эту ошибку:
Я не могу понять, почему. Этого не может быть, потому что 733846 элементов слишком велики для массива.
В качестве проверки работоспособности я написал это в отдельном файле, и он работает без проблем:
int main() {
std::ifstream infile("USA.txt");
int num_nodes, num_edges, source, target, u, v, x, y;
infile >> num_nodes >> num_edges >> source >> target;
std::pair<int, int> edge_pairs_array[num_edges];
for (int i = 0; i < num_edges; i++) {
infile >> u >> v >> x >> y;
edge_pairs_array[i] = std::make_pair(u, v);
}
return 0;
}
Что тут происходит?
Размер edge_pairs_array
вероятно около 5,6 МБ. Это автоматическая переменная, и поэтому она размещается в так называемом «стеке». Размер стека варьируется в зависимости от системы, но обычно составляет от одного до нескольких МБ в настольных системах. Скорее всего, у вас «переполнение стека».
Решение состоит в том, чтобы выделить такие крупные объекты из бесплатного магазина. Самый простой способ выделить массив из свободного хранилища — это использовать std::vector
,
Программа плохо сформирована в стандарте C ++, так как num_edges_
не является постоянной времени компиляции. В качестве размера автоматического массива могут использоваться только константы времени компиляции.
Других решений пока нет …