Что такое Stack overflow ?
От: Orangeaab Россия  
Дата: 30.12.07 10:03
Оценка:
Здравствуйте!
При компилировании программы появляется окошко следующего содержания:

Unhaled exception at 0x0040daf7 in comexcel.exe: 0xC00000FD: Stack overflow

можно нажать Break и Continue.

Подскажите пожалуйста, что это значит? И как с ним бороться ?

Вот код программы:

using namespace Excel;

_ApplicationPtr pXL;

pXL.CreateInstance(L"Excel.Application");

pXL->Visible[0] = VARIANT_FALSE;


WorkbooksPtr pBooks = pXL->Workbooks;
_WorkbookPtr pOtchet, pTable;

_WorksheetPtr pSheet, pShOtch;
RangePtr aCell, aCell1, aCell2, aCell3, aCell4, aCell5, aCell6;

double dWconst;
float M[100000], N[100000], MM[100000], NN[100000],a1, a2, a3, a4, a5, a6, cosf;
float U[11] = {750,500,330,220,110,35,20,15,10,6,0.4};

pBooks->Open("A.xls");
pOtchet = pBooks->GetItem(1);

pBooks->Open("B.xls");
pTable = pBooks->GetItem(2);

for(int z=0, row=6;z<11;z++){
if(z<7 || z==10){row++;}

pSheet = pTable->Worksheets->GetItem(5);
pShOtch = pOtchet->Worksheets->GetItem(3);

aCell1 = pSheet->Cells->Item[2, 1];
a1 = aCell1->Value2;
aCell2 = pSheet->Cells->Item[2, 4]; //N
a2 = aCell2->Value2;
aCell3 = pSheet->Cells->Item[2, 7]; //M
a3 = aCell3->Value2;
for(int j=2;a1 != 0;){
if(a1 == U[z]){
aCell4 = pSheet->Cells->Item[j,9]; //K1
int K1 = aCell4->Value2;
aCell4 = pSheet->Cells->Item[j,11]; //D1
float D1 = aCell4->Value2;
aCell4 = pSheet->Cells->Item[j,13]; //Sg1
float Sg1 = aCell4->Value2;
aCell4 = pSheet->Cells->Item[j,8]; //K3
int K3 = aCell4->Value2;
aCell4 = pSheet->Cells->Item[j,10]; //D3
float D3 = aCell4->Value2;
aCell4 = pSheet->Cells->Item[j,12]; //Sg3
float Sg3 = aCell4->Value2;
aCell4 = pSheet->Cells->Item[j,14]; //Wb
float Wb = aCell4->Value2;

for(int i=0; i<a2; i++){
aCell5 = pSheet->Cells->Item[i+2,4]; // Sgi
M[i]= aCell5->Value2;

aCell6 = pSheet->Cells->Item[i+2,3]; // Di
MM[i]= aCell6->Value2;
}

for(int i=0; i<a3; i++){
aCell4 = pSheet->Cells->Item[i+2,5]; //Sgj
N[i]= aCell4->Value2;

aCell4 = pSheet->Cells->Item[i+2,6]; //Dj
NN[i]= aCell4->Value2;
}

aCell4 = pShOtch->Cells->Item[22,row-4];
a4 = aCell4->Value2;
if(a4 == 0){dWconst = 0;}else{dWconst = aCell4->Value2;}
dWconst = dWpogr(a2, M, MM, a3, N, NN, K1, D1, Sg1, K3, D3, Sg3, Wb);
aCell4->Value2 = dWconst;
}
j+=max(int(a2),int(a3));
aCell1 = pSheet->Cells->Item[j, 1];
a1 = aCell1->Value2;
aCell2 = pSheet->Cells->Item[j, 4];
a2 = aCell2->Value2;
aCell3 = pSheet->Cells->Item[j, 7];
a3 = aCell3->Value2;
}
}



pOtchet->SaveAs("Otchet.xls",xlXMLSpreadsheet, vtMissing, vtMissing, false, false, xlNoChange, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);
pOtchet->Close();
pTable->Close();

pXL->Quit();
Не пинайте бедного ламера =)
Re: Что такое Stack overflow ?
От: alexeiz  
Дата: 30.12.07 10:06
Оценка:
Здравствуйте, Orangeaab, Вы писали:

O>Здравствуйте!

O>При компилировании программы появляется окошко следующего содержания:

O>Unhaled exception at 0x0040daf7 in comexcel.exe: 0xC00000FD: Stack overflow


O>можно нажать Break и Continue.


O>Подскажите пожалуйста, что это значит? И как с ним бороться ?


С ним не нужно бороться. Его нужно принять как должное и научиться с ним жить. Пойми, в жизни есть гораздо большие проблемы, чем этот жалкий stack overflow.
Re[2]: Что такое Stack overflow ?
От: Orangeaab Россия  
Дата: 30.12.07 10:09
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>С ним не нужно бороться. Его нужно принять как должное и научиться с ним жить. Пойми, в жизни есть гораздо большие проблемы, чем этот жалкий stack overflow.


То, что он жалкий я уже понял.... Но программа не запускается =( В чем причина ?
Не пинайте бедного ламера =)
Re[3]: Что такое Stack overflow ?
От: alexeiz  
Дата: 30.12.07 10:12
Оценка:
Здравствуйте, Orangeaab, Вы писали:

O>Здравствуйте, alexeiz, Вы писали:


A>>С ним не нужно бороться. Его нужно принять как должное и научиться с ним жить. Пойми, в жизни есть гораздо большие проблемы, чем этот жалкий stack overflow.


O>То, что он жалкий я уже понял.... Но программа не запускается =( В чем причина ?


Причина в том, что ты даже программу не можешь отформатировать, так чтобы другие ее могли прочитать и понять. Используй таг [ ccode ].
Re[4]: Что такое Stack overflow ?
От: Orangeaab Россия  
Дата: 30.12.07 10:21
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Причина в том, что ты даже программу не можешь отформатировать, так чтобы другие ее могли прочитать и понять. Используй таг [ ccode ].


Да, моя вина.

Вот код программы:
using namespace Excel;

_ApplicationPtr pXL;

pXL.CreateInstance(L"Excel.Application");

pXL->Visible[0] = VARIANT_FALSE;

WorkbooksPtr pBooks = pXL->Workbooks;
_WorkbookPtr pOtchet, pTable;

_WorksheetPtr pSheet, pShOtch;
RangePtr aCell, aCell1, aCell2, aCell3, aCell4, aCell5, aCell6; 

double dWconst;
float M[100000], N[100000], MM[100000], NN[100000],a1, a2, a3, a4, a5, a6, cosf;
float U[11] = {750,500,330,220,110,35,20,15,10,6,0.4};

pBooks->Open("A.xls");
pOtchet = pBooks->GetItem(1);

pBooks->Open("B.xls");
pTable = pBooks->GetItem(2);

for(int z=0, row=6;z<11;z++){
if(z<7 || z==10){row++;}

pSheet = pTable->Worksheets->GetItem(5);
pShOtch = pOtchet->Worksheets->GetItem(3);

aCell1 = pSheet->Cells->Item[2, 1];
a1 = aCell1->Value2;
aCell2 = pSheet->Cells->Item[2, 4]; //N
a2 = aCell2->Value2;
aCell3 = pSheet->Cells->Item[2, 7]; //M
a3 = aCell3->Value2;
for(int j=2;a1 != 0;){
if(a1 == U[z]){
aCell4 = pSheet->Cells->Item[j,9]; //K1
int K1 = aCell4->Value2; 
aCell4 = pSheet->Cells->Item[j,11]; //D1
float D1 = aCell4->Value2; 
aCell4 = pSheet->Cells->Item[j,13]; //Sg1 
float Sg1 = aCell4->Value2; 
aCell4 = pSheet->Cells->Item[j,8]; //K3
int K3 = aCell4->Value2; 
aCell4 = pSheet->Cells->Item[j,10]; //D3
float D3 = aCell4->Value2; 
aCell4 = pSheet->Cells->Item[j,12]; //Sg3
float Sg3 = aCell4->Value2;
aCell4 = pSheet->Cells->Item[j,14]; //Wb
float Wb = aCell4->Value2;

for(int i=0; i<a2; i++){
aCell5 = pSheet->Cells->Item[i+2,4]; // Sgi
M[i]= aCell5->Value2;

aCell6 = pSheet->Cells->Item[i+2,3]; // Di
MM[i]= aCell6->Value2;
}

for(int i=0; i<a3; i++){
aCell4 = pSheet->Cells->Item[i+2,5]; //Sgj
N[i]= aCell4->Value2;

aCell4 = pSheet->Cells->Item[i+2,6]; //Dj
NN[i]= aCell4->Value2;
}

aCell4 = pShOtch->Cells->Item[22,row-4];
a4 = aCell4->Value2;
if(a4 == 0){dWconst = 0;}else{dWconst = aCell4->Value2;}
dWconst = dWpogr(a2, M, MM, a3, N, NN, K1, D1, Sg1, K3, D3, Sg3, Wb);
aCell4->Value2 = dWconst;
}
j+=max(int(a2),int(a3));
aCell1 = pSheet->Cells->Item[j, 1];
a1 = aCell1->Value2;
aCell2 = pSheet->Cells->Item[j, 4];
a2 = aCell2->Value2;
aCell3 = pSheet->Cells->Item[j, 7];
a3 = aCell3->Value2;
}
}



pOtchet->SaveAs("Otchet.xls",xlXMLSpreadsheet, vtMissing, vtMissing, false, false, xlNoChange, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);
pOtchet->Close();
pTable->Close();

pXL->Quit();
Не пинайте бедного ламера =)
Re[5]: Что такое Stack overflow ?
От: alexeiz  
Дата: 30.12.07 10:26
Оценка: -3
Здравствуйте, Orangeaab, Вы писали:

O>Здравствуйте, alexeiz, Вы писали:


A>>Причина в том, что ты даже программу не можешь отформатировать, так чтобы другие ее могли прочитать и понять. Используй таг [ ccode ].


O>Да, моя вина.


O>Вот код программы:


Ну, ты герой! Просто так вставить неотформатированный код в таг [ c ]! Как будто он от этого магическим образом отформатируется. Но, тем не менее, я тебе могу сказать, что в коде, который ты привел, причины для возникновения stack overflow нет.
Re[6]: Как форматировать код ?
От: Orangeaab Россия  
Дата: 30.12.07 10:32
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Ну, ты герой! Просто так вставить неотформатированный код в таг [ c ]! Как будто он от этого магическим образом отформатируется. Но, тем не менее, я тебе могу сказать, что в коде, который ты привел, причины для возникновения stack overflow нет.


Блин, чувствую себя дураком. Где прочитать про форматирование кода ?

И все таки, Что вызывает stack overflow ?
Не пинайте бедного ламера =)
Re[7]: Как форматировать код ?
От: _Ursus_  
Дата: 30.12.07 10:39
Оценка: 2 (1)
Здравствуйте, Orangeaab, Вы писали:

O>И все таки, Что вызывает stack overflow ?


Поставьте breakpoint на первую строку кода, и пройдитесь по нему в пошаговом режиме. Это может многое прояснить
Re: Что такое Stack overflow ?
От: ShaggyOwl Россия http://www.rsdn.org
Дата: 30.12.07 10:42
Оценка: 3 (1)
Здравствуйте, Orangeaab, Вы писали:

O>При компилировании программы появляется окошко следующего содержания:


При компиляции или при выполнении?

Если кратко, причина в том, что закончилось место на стеке.
Подробнее, см. http://en.wikipedia.org/wiki/Stack_overflow
Хорошо там, где мы есть! :)
Re[7]: Как форматировать код ?
От: alexeiz  
Дата: 30.12.07 10:52
Оценка: 3 (1)
Здравствуйте, Orangeaab, Вы писали:

O>Здравствуйте, alexeiz, Вы писали:


A>>Ну, ты герой! Просто так вставить неотформатированный код в таг [ c ]! Как будто он от этого магическим образом отформатируется. Но, тем не менее, я тебе могу сказать, что в коде, который ты привел, причины для возникновения stack overflow нет.


O>Блин, чувствую себя дураком. Где прочитать про форматирование кода ?


O>И все таки, Что вызывает stack overflow ?


В большинстве случаев рекурсивный вызов. Вот простейший пример:

int foo()
{
    return 1 + foo();  // <-- stack overflow! (after a million calls)
}


Когда у тебя случается подобное исключение, посмотри на свой стек.
Re[8]: Как форматировать код ?
От: Orangeaab Россия  
Дата: 30.12.07 11:03
Оценка:
Здравствуйте, _Ursus_, Вы писали:

_U_>Поставьте breakpoint на первую строку кода, и пройдитесь по нему в пошаговом режиме. Это может многое прояснить ;)


Спасибо.
Не пинайте бедного ламера =)
Re[8]: Спасибо
От: Orangeaab Россия  
Дата: 30.12.07 11:05
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>В большинстве случаев рекурсивный вызов. Вот простейший пример:


A>
A>int foo()
A>{
A>    return 1 + foo();  // <-- stack overflow! (after a million calls)
A>}
A>


A>Когда у тебя случается подобное исключение, посмотри на свой стек


Спасибо за объяснение.
Не пинайте бедного ламера =)
Re[5]: Что такое Stack overflow ?
От: Vinick Россия  
Дата: 30.12.07 12:17
Оценка: 4 (2) +3
Здравствуйте, Orangeaab, Вы писали:
...
O>float M[100000], N[100000], MM[100000], NN[100000],a1, a2, a3, a4, a5, a6, cosf;
...
O>dWconst = dWpogr(a2, M, MM, a3, N, NN, K1, D1, Sg1, K3, D3, Sg3, Wb);
...


Во-первых, замените массивы M,N,MM,NN на динамические или на std::vector<float>.
А во-вторых, что происходит в функции dWpogr ?
Re[6]: Что такое Stack overflow ?
От: Quasi  
Дата: 30.12.07 12:58
Оценка: 2 (2) +3
Здравствуйте, alexeiz, Вы писали:

A>Ну, ты герой! Просто так вставить неотформатированный код в таг [ c ]! Как будто он от этого магическим образом отформатируется. Но, тем не менее, я тебе могу сказать, что в коде, который ты привел, причины для возникновения stack overflow нет.



Stack overflow:
float M[100000], N[100000], MM[100000], NN[100000],a1, a2, a3, a4, a5, a6, cosf;
Re[7]: Что такое Stack overflow ?
От: dotidot Россия  
Дата: 31.12.07 20:48
Оценка:
Здравствуйте, Quasi, Вы писали:

Q>Stack overflow:

Q>
Q>float M[100000], N[100000], MM[100000], NN[100000],a1, a2, a3, a4, a5, a6, cosf;
Q>


ну пусь float — 4байта, тогда 4*4*100000 = 1600000 = 1562,5Мб. Обычно стек по больше делают, метров по 8емь. А чтобы сделать меньше, надо особо извращаться.
Re[8]: Что такое Stack overflow ?
От: alexeiz  
Дата: 31.12.07 21:43
Оценка:
Здравствуйте, dotidot, Вы писали:

D>Здравствуйте, Quasi, Вы писали:


Q>>Stack overflow:

Q>>
Q>>float M[100000], N[100000], MM[100000], NN[100000],a1, a2, a3, a4, a5, a6, cosf;
Q>>


D>ну пусь float — 4байта, тогда 4*4*100000 = 1600000 = 1562,5Мб. Обычно стек по больше делают, метров по 8емь. А чтобы сделать меньше, надо особо извращаться.


Зависит от платформы и компилятора. По умолчанию для VC++, например, стек всего 1MB.
Re[6]: Что такое Stack overflow ?
От: Megabyte Россия  
Дата: 03.01.08 10:00
Оценка:
On Sun, 30 Dec 2007 13:26:42 +0500, alexeiz <15955@users.rsdn.ru> wrote:


> Как будто он от этого магическим образом отформатируется. Но, тем не

> менее, я тебе могу сказать, что в коде, который ты привел, причины для
> возникновения stack overflow нет.

скорее всего, код стоит внутри main(), поэтому выделение всяких float
A[10000], B[10000] выделяет память на стеке, которого не хватает.

--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Posted via RSDN NNTP Server 2.0
Re[7]: Как форматировать код ?
От: alzt  
Дата: 09.01.08 08:10
Оценка:
Здравствуйте, Orangeaab, Вы писали:

O>Блин, чувствую себя дураком. Где прочитать про форматирование кода ?


O>И все таки, Что вызывает stack overflow ?


Рекурсия или ну очень много вложенных вызовов функций, объявление больших локальных переменных и т.п. неэкономное расходование стека.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.