Сообщения из Dll

  • Автор темы ApocalipsisNN
  • Дата начала
A

ApocalipsisNN

#1
Суть проблемы - есть Dll написанная в VS 2005 C++. В ней содержится математический движок рассчета. Интерфейс основной программы написан на Delphi. Математический движок тестирует значения приходящие из Delphi и, если есть ошибки, должен вернуть или код ошибки или сам текст ошибки(в принципе не важно) в Delphi. Как лучше всего построить этот механизм?
 
04.09.2006
2 566
3
#2
Результат функции в DLL - 0 если выполнение успешно, иначе код ошибки. Чем не подходит?
 
A

ApocalipsisNN

#3
Чуть чуть не правильно объяснил, сорри! Суть вот в чем например есть функция такая вот:
EXPORT int __stdcall Control_Scheme(int i)
{

int CMsize=0;
int nv,tv,j,u,np,ng;
int *indV;
char ConvBuf[11];
ConvBuf[10]='\0';
double Fsum,eps=1.e-8;
indV= new int[CC.NP];
TSK->LetContinue=true;
nv = 0;
for(u=0; u< CC.NP; u++)
{
tv = 0;
for(j=0; j< CC.NG; j++)
{
if(CC.SS[2*j+0] == u) tv++;
if(CC.SS[2*j+1] == u) tv++;
}
if(tv == 1)
{
indV[nv] = u;
nv++;
}
}
if(nv == 0)
{
Fsum = 0.0;
for(j=0; j< CC.NQ; j++)
Fsum += CC.zQ[j];
if(fabs(Fsum) > eps)
{
// fprintf(pfp,"ФАТАЛЬНАЯ ОШИБКА: SUMMA(Q%d)#0\n",i);
CMsize++;
TSK->CM.resize(CMsize);
//_ltoa_s(i,ConvBuf,11,10);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+"ФАТАЛЬНАЯ ОШИБКА: SUMMA(Q)#0";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
if(CC.NIP > 1)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+"ФАТАЛЬНАЯ ОШИБКА: NPfix>1";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
if(CC.NJZ > 1)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+"ФАТАЛЬНАЯ ОШИБКА: NJfix>1";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
Fsum = 0.0;
for(j=0; j< CC.NIG; j++)
Fsum += CC.zG[j];
if(fabs(Fsum) > eps)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+"ФАТАЛЬНАЯ ОШИБКА: NGist#0";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
else
{
np = ng = 0;
for(u=0; u< nv; u++)
{
tv = 1;
for(j=0; j<CC.NIP; j++)
if(indV == CC.iP[j])
{
tv = 0;
np++;
}
for(j=0; j<CC.NIG; j++)
if(indV == CC.iG[j])
{
tv = 0;
ng++;
}
if(tv)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+", "+TSK->NodeStr;
_ltoa(indV,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->CM[TSK->CM.size()-1].Message+ConvBuf +": не заданы фиксированное давление или источник расхода";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
if(np == 0)
{
Fsum = 0.0;
for(j=0; j< CC.NIG; j++) Fsum += CC.zG[j];
if(fabs(Fsum) > eps)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+": ПРЕДУПРЕЖДЕНИЕ: SUMMA(Gi)#0";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
if(np>0 && CC.NIP > np)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+" ФАТАЛЬНАЯ ОШИБКА: переопределено число заданных давлений в узлах";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
for(u=0; u< nv; u++)
{
tv = 0;
for(j=0; j<CC.NIP; j++)
if(indV == CC.iP[j]) tv++;
for(j=0; j<CC.NIG; j++)
if(indV == CC.iG[j]) tv++;
if(tv > 1)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+", "+TSK->NodeStr;
_ltoa(indV,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->CM[TSK->CM.size()-1].Message+ConvBuf +" ФАТАЛЬНАЯ ОШИБКА: одновременно заданы два граничных условия";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
if(nv==1)
{
Fsum = 0.0;
for(j=0; j< CC.NQ; j++)
Fsum += CC.zQ[j];
if(fabs(Fsum) > eps)
{
CMsize++;
TSK->CM.resize(CMsize);
_ltoa(i,ConvBuf,10);
TSK->CM[TSK->CM.size()-1].Message=TSK->ContStr+ConvBuf+" ФАТАЛЬНАЯ ОШИБКА: обнаружен не баланс источников (стоков) тепла";
TSK->CM[TSK->CM.size()-1].Status=0;//нельзя произвести расчет
}
}
}
delete[] indV;

if(TSK->CM.size()>0) TSK->LetContinue=false;//предупреждния есть
return TSK->LetContinue;
}

-----------------------------------------------------------------------------------------------------------------------------------
Т.е ошибок чисто теоретически даже в этой функции может быть несколько. Я хочу чтобы, как только решатель обнаружил ошибку, то он сразу сообщил о ней в Dll... Вот вопрос в том какой механизм выбрать... Точнее как грамотнее всего реализовать его!
 
04.09.2006
2 566
3
#4
Я хочу чтобы, как только решатель обнаружил ошибку, то он сразу сообщил о ней в Dll... Вот вопрос в том какой механизм выбрать... Точнее как грамотнее всего реализовать его!
"return код_ошибки" в месте где возникла ошибка с подчисткой ресурсов
 
D

Dimmuborgir

#5
в таком случае, возможно стоит прибегнуть к самому нелюбимому мной оператору goto. В месте, где возникла ошибка, goto - в конец функции, где происходит освобождение памяти, ресурсов, затем return
 
A

ApocalipsisNN

#7
Спасибо всем ответившим, но уже нашел выход... Написал callback функцию, которая в момент возникновения ошибки вызывает функцию из Delphi и передает код ошибки. Там эти ошибки и отображаются...