Странный глюк

Модератор: Модераторы разделов

frp
Сообщения: 1445
ОС: Debian Squeeze

Странный глюк

Сообщение frp »

Решил я олимпиадную задачу, все под Linux компилируется, работает идеально.
Если компилировать ту же прогу тем же компилятором под Windows или wine, то возникает переполнение стека. Если объявление массива разместить перед функцией main(), то все работает. Почему изначальный вариант глючит?
Исходный код, который глючит в Windows:

Код:

#include <fstream> using namespace std; int imin(int a,int b) { return a<b ? a : b; } int main() { int g[101][101][101]; int n,k,i,j; ifstream in("input.txt"); ofstream out("output.txt"); in>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) in>>g[0][i][j]; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) g[k][i][j]=imin(g[k-1][i][j],g[k-1][i][k]+g[k-1][k][j]); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) if(j==1)out<<g[n][i][j];else out<<' '<<g[n][i][j]; out<<'\n'; } in.close(); out.close(); return 0; }

Исходный код, который работает под Windows:

Код:

#include <fstream> using namespace std; int imin(int a,int b) { return a<b ? a : b; } int g[101][101][101]; int main() { int n,k,i,j; ifstream in("input.txt"); ofstream out("output.txt"); in>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) in>>g[0][i][j]; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) g[k][i][j]=imin(g[k-1][i][j],g[k-1][i][k]+g[k-1][k][j]); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) if(j==1)out<<g[n][i][j];else out<<' '<<g[n][i][j]; out<<'\n'; } in.close(); out.close(); return 0; }
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5498
ОС: Gentoo

Re: Странный глюк

Сообщение /dev/random »

Видимо, в линуксе программам по-умолчанию выделяется больший по объёму стек, чем в винде. Ваш массив весит ~4MB, я бы на вашем месте поостерёгся его в стеке размещать.
Спасибо сказали:
Аватара пользователя
TuxWare
Сообщения: 637
ОС: Windows 7

Re: Странный глюк

Сообщение TuxWare »

Из справки Visual Studio 2008
Задает размер стека программы в байтах.
/F[ ]number
Без этого параметра размер стека по умолчанию равен 1 МБ

101*101*101*4/(1024*1024)=3.9 МБ
Спасибо сказали:
Аватара пользователя
кодировщик
Сообщения: 974
Статус: зарёган в пятницу 13
ОС: Linux

Re: Странный глюк

Сообщение кодировщик »

offtop:
У меня первый вариант улетает в бесконечный цикл. Второй Segmentation fault, и то через большой промежуток времени.

2frp моно условие задачи.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Странный глюк

Сообщение frp »

Условие - сайт acmp.ru, задача №135. Второй вариант проходит все тесты, первый вызывает переполнение стека (судя по результатам nmap, на сервере Windows 2003).
В бесконечный цикл улетает потому, что, скорее всего, файла input.txt нет, Segmentation fault потому, что улетает в бесконечный цикл и рано или поздно выходит за границу массива.
Спасибо сказали: