1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

Тема в разделе "С и С++", создана пользователем ApocalipsisNN, 25 июл 2008.

  1. ApocalipsisNN

    ApocalipsisNN Гость

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

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    2
    Результат функции в DLL - 0 если выполнение успешно, иначе код ошибки. Чем не подходит?
     
  3. ApocalipsisNN

    ApocalipsisNN Гость

    Репутация:
    0
    Чуть чуть не правильно объяснил, сорри! Суть вот в чем например есть функция такая вот:
    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[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... Вот вопрос в том какой механизм выбрать... Точнее как грамотнее всего реализовать его![/i][/i][/u][/i][/u][/i][/i][/u][/i][/i]
     
  4. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    2
    "return код_ошибки" в месте где возникла ошибка с подчисткой ресурсов
     
  5. Dimmuborgir

    Dimmuborgir Гость

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

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    Dimmuborgir уж лучше с помощью эксептиона.
     
  7. ApocalipsisNN

    ApocalipsisNN Гость

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

Поделиться этой страницей