小弟初學BCB,求助~~~我的代碼是從資料庫里讀出表資料存入float型陣列P和EI中,代碼計算出一個新的float型陣列存入SQL Sevrer2008 資料庫中,但是插入2046行后到第2047行開始報錯


pow: DOMAIN error關閉視窗以后繼續報錯 pow:OVERFLOW error,連續彈出十幾個,斷點檢測后發現運行到第2047次時運行到XAJ_HydroModel::Control()函式中的Runoff()函式報錯,求助大神們怎么解決,已經困擾我一個星期了,還有為什么BCB中的float型別資料我輸入的是0.1,在程式中ShowMessage()中輸出的是0.1000000013947。
代碼如下***.cpp
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
void XAJ_HydroModel::Control()
{
//計算順序控制:先計算降雨徑流深,再進行水源劃分,最后匯流
Runoff();//降雨深
Source();//三水源劃分
Infall();//匯流
}
//得到相關資料系列
float* XAJ_HydroModel::getR()
{
return R;
}
float* XAJ_HydroModel::getE()
{
return E;
}
float* XAJ_HydroModel::getW()
{
return W;
}
float* XAJ_HydroModel::getQ()
{
return Q;
}
float* XAJ_HydroModel::getQRS()
{
return QRS;
}
float* XAJ_HydroModel::getQRSS()
{
return QRSS;
}
float* XAJ_HydroModel::getQRG()
{
return QRG;
}
void XAJ_HydroModel::Runoff()
{
float Wmax,A; //流域蓄水容量最大值、初始平均蓄水量相應的縱坐標
float dW;
int i;
Wmax=WM*(1+B)/(1-IMP);
W[0]=WU[0]+WL[0]+WD[0]; //上一時段的初始平均蓄水容量
//開始計算產流量,從時段開始
for(i=1;i<=N;i++)
{
EM[i]=K*EI[i];
//計算蒸發量
if((P[i]+WU[i-1])>=EM[i])
{
EU[i]=EM[i];
EL[i]=0;
ED[i]=0;
}
else
{
EU[i]=P[i]+WU[i-1];
EL[i]=(EM[i]-EU[i])*WL[i-1]/WLM;
ED[i]=0;
if(EL[i]<C*(EM[i]-EU[i]))
{
EL[i]=C*(EM[i]-EU[i]);
if(WL[i-1]<C*(EM[i]-EU[i]))
{
EL[i]=WL[i-1];
ED[i]=C*(EM[i]-EU[i])-EL[i];
}
}
}
E[i]=EU[i]+EL[i]+ED[i];
//蒸發量計算后,可計算凈雨量
PE[i]=P[i]-E[i];
//計算產流量
if(PE[i]<=0)
R[i]=0;
else
{
//WM流域
A=Wmax*(1-pow((1-W[i-1]/WM),1/(1+B)));
if((PE[i]+A)<Wmax)
R[i]=PE[i]-WM+W[i-1]+WM*pow((1-(PE[i]+A)/Wmax),1+B);
else
R[i]=PE[i]-(WM-W[i-1]);
}
//用水量平衡原理計算土壤蓄水量
dW=PE[i]-R[i];
if(dW>0)
{
if((WU[i-1]+dW)<WUM)
{
WU[i]=WU[i-1]+dW;
WL[i]=WL[i-1];
WD[i]=WD[i-1];
}
else
{
WU[i]=WUM;
WL[i]=WL[i-1]+dW-(WUM-WU[i-1]);
WD[i]=WD[i-1];
if(WL[i]>WLM)
{
WL[i]=WLM;
WD[i]=WD[i-1]+dW-(WUM-WU[i-1])-(WLM-WL[i-1]);
}
}
}
else
{
if(WU[i-1]>fabs(dW))
{
WU[i]=WU[i-1]-fabs(dW);
WL[i]=WL[i-1];
WD[i]=WD[i-1];
}
else
{
WU[i]=0;
WL[i]=WU[i-1]-fabs(dW)+WL[i-1];
WD[i]=WD[i-1];
if(WL[i]<0)
{
WL[i]=0;
WD[i]=WU[i-1]+WL[i-1]-fabs(dW)+WD[i-1];
}
}
}
W[i]=WU[i]+WL[i]+WD[i];
}
}
void XAJ_HydroModel::Source()
{
int i;
float FR; //產流面積
float GX,KSSD,KGD; //出流轉化指數,轉化后的壤中流出流系數和地下水出流系數
float AU,Smax; //與自由水蓄水量S對應的蓄水容量曲線的縱標值
float temP,temS;
float RS0,RSS0,RG0;
Smax=(1+EX)*SM; //流域上自由蓄水量最大的某點蓄量值
for(i=1;i<=N;i++)
{
RIMP[i]=PE[i]*IMP; //不透水面積產生的徑流
if(PE[i]<=0) //PE<=0時的產流計算
{
GX=24/dT;
KSSD=(1-pow(1-(KG+KSS),1/GX))/(1+KG/KSS);
KGD=KSSD*KG/KSS;
FR=1-IMP-pow(1-W[i-1]/WM,B/(1+B))*(1-IMP);
RS[i]=0;
RSS[i]=S[i-1]*KSSD*FR;
RG[i]=S[i-1]*KGD*FR;
S[i]=(1-KSSD-KGD)*S[i-1];
}
else //PE>0時的產流計算
{
FR=R[i]/PE[i]-IMP; //透水面積上的產流面積
GX=24/dT*int(PE[i]/5+1);
KSSD=(1-pow(1-(KG+KSS),1/GX))/(1+KG/KSS);
KGD=KSSD*KG/KSS;
temP=PE[i]/int(PE[i]/5+1);
temS=S[i-1];
RS0=0;
RSS0=0;
RG0=0;
//以下處理避免差分引起的誤差
for(int j=1;j<=int(PE[i]/5+1);j++)
{
AU=Smax*(1-pow(1-temS/SM,1/(1+EX)));
if((temP+AU)<Smax)
{
RS0=RS0+(temP-SM+temS+SM*pow(1-(temP+AU)/Smax,1+EX))*FR;
RSS0=RSS0+(SM-SM*pow(1-(temP+AU)/Smax,1+EX))*KSSD*FR;
RG0=RG0+(SM-SM*pow(1-(temP+AU)/Smax,1+EX))*KGD*FR;
temS=(1-KSSD-KGD)*(SM-SM*pow(1-(temP+AU)/Smax,1+EX));
}
else
{
RS0=RS0+(temP-SM+temS)*FR;
RSS0=RSS0+SM*KSSD*FR;
RG0=RG0+SM*KGD*FR;
temS=(1-KSSD-KGD)*SM;
}
}
RS[i]=RS0;
RSS[i]=RSS0;
RG[i]=RG0;
S[i]=temS;
}
}
}
void XAJ_HydroModel::Infall()
{
int i,j;
float KKSSD,KKGD;
float sum;
KKSSD=pow(KKSS,dT/24);
KKGD=pow(KKG,dT/24);
//壤中流、地下水(線性水庫法)
for(i=1;i<=N;i++)
{
QRSS[i]=QRSS[i-1]*KKSSD+RSS[i]*Area/(3.6*dT)*(1-KKSSD);
QRG[i]=QRG[i-1]*KKGD+RG[i]*Area/(3.6*dT)*(1-KKGD);
}
//地表水(單位線法UH)
for(j=1;j<=2*N;j++)
for(i=1;i<=2*N;i++)
qs[i][j]=0;
for(j=1;j<=N;j++)
{
for(i=1;i<=j-1;i++)
qs[i][j]=0;
for(i=j;i<=j+uhN-1;i++)
qs[i][j]=(RS[j]+RIMP[j])*UH[i-j+1]*Area/(3.6*dT);
}
for(i=1;i<=N;i++)
{
sum=0;
for(j=1;j<=N;j++)
sum=sum+qs[i][j];
QRS[i]=sum;
}
for(i=1;i<=N;i++)
Q[i]=QRS[i]+QRSS[i]+QRG[i];
}
//---------------------------------------------------------------------------
uj5u.com熱心網友回復:
代碼太長了 不想看uj5u.com熱心網友回復:
簡單點就是說我輸入2046次資料到float型P和EI陣列,能夠正常運行,但是到2047次的時候輸入報錯為以上兩張圖,搞不明白是什么原因造成的
uj5u.com熱心網友回復:
看起來像是陣列超界了,你那個陣列大小是多少?uj5u.com熱心網友回復:
我定義的是P[25],EI[25],一組24個資料到P,一組24個資料到EI,輸入2046次,帶入函式進行運算沒問題,但是到2047次輸入的時候出錯,我覺得要失敗就一次也執行不了,為什么成功執行兩千多次后才失敗,我的程式要執行13840次才能結束,求教大神
uj5u.com熱心網友回復:
插入時陣列越界了轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137575.html
標籤:數據庫及相關技術
下一篇:C++學習ing遇到的問題
