Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сообщения из Dll
Форум программистов > Системное программирование > C, С++ и С Builder > MS Visual C++
ApocalipsisNN
Суть проблемы - есть Dll написанная в VS 2005 C++. В ней содержится математический движок рассчета. Интерфейс основной программы написан на Delphi. Математический движок тестирует значения приходящие из Delphi и, если есть ошибки, должен вернуть или код ошибки или сам текст ошибки(в принципе не важно) в Delphi. Как лучше всего построить этот механизм?
European
Результат функции в DLL - 0 если выполнение успешно, иначе код ошибки. Чем не подходит?
ApocalipsisNN
Чуть чуть не правильно объяснил, сорри! Суть вот в чем например есть функция такая вот:
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[i].NP];
TSK->LetContinue=true;
nv = 0;
for(u=0; u< CC[i].NP; u++)
{
tv = 0;
for(j=0; j< CC[i].NG; j++)
{
if(CC[i].SS[2*j+0] == u) tv++;
if(CC[i].SS[2*j+1] == u) tv++;
}
if(tv == 1)
{
indV[nv] = u;
nv++;
}
}
if(nv == 0)
{
Fsum = 0.0;
for(j=0; j< CC[i].NQ; j++)
Fsum += CC[i].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[i].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[i].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[i].NIG; j++)
Fsum += CC[i].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[i].NIP; j++)
if(indV[u] == CC[i].iP[j])
{
tv = 0;
np++;
}
for(j=0; j<CC[i].NIG; j++)
if(indV[u] == CC[i].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[u],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[i].NIG; j++) Fsum += CC[i].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[i].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[i].NIP; j++)
if(indV[u] == CC[i].iP[j]) tv++;
for(j=0; j<CC[i].NIG; j++)
if(indV[u] == CC[i].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[u],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[i].NQ; j++)
Fsum += CC[i].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... Вот вопрос в том какой механизм выбрать... Точнее как грамотнее всего реализовать его!
European
Цитата(ApocalipsisNN @ 25:07:2008 - 14:31) *
Я хочу чтобы, как только решатель обнаружил ошибку, то он сразу сообщил о ней в Dll... Вот вопрос в том какой механизм выбрать... Точнее как грамотнее всего реализовать его!

"return код_ошибки" в месте где возникла ошибка с подчисткой ресурсов
Dimmuborgir
в таком случае, возможно стоит прибегнуть к самому нелюбимому мной оператору goto. В месте, где возникла ошибка, goto - в конец функции, где происходит освобождение памяти, ресурсов, затем return
Kmet
Dimmuborgir уж лучше с помощью эксептиона.
ApocalipsisNN
Спасибо всем ответившим, но уже нашел выход... Написал callback функцию, которая в момент возникновения ошибки вызывает функцию из Delphi и передает код ошибки. Там эти ошибки и отображаются...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.