Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с отладкой приложения, вызывающего DLL 
:(
    Опции темы
erslgoeirjh
Дата 25.2.2015, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Есть DLL под названием DLLIntegr, разработанная в Visual Studio 2008 как консольное приложение, помеченное как DLL.
Есть консольное приложение CallDLLIntegr, которая вызывает эту DLL и которая также была разработана в Visual Studio 2008.

И DLL, и консольное приложение компилируются нормально, но в отладчике программа "бьётся".

Вот код:

1) файл CallDLLIntegr.cpp :

/
Код

/ CallDLLIntegr.cpp: определяет точку входа для консольного приложения.
/* 
// для неявного подключения
#ifdef _DEBUG
    #pragma comment(lib,"DLLIntegrdbg.lib")
#else
    #pragma comment(lib,"DLLIntegrrel.lib")
#endif */
#include <math.h>
#include <stdio.h>
#include <io.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include <tchar.h>
#include <math.h>
#include <windows.h>
#include <locale.h>
#include <vector>
#include <list>
#include <string>
#include <iostream>
//#include <sys/mman.h>
#include <sys/types.h>
//#include <unistd.h>
#include <fcntl.h>
#include <WinNT.h>
#include <WinBase.h>
#include <Windows.h>
#include "stdafx.h"
#include "DLLIntegr.h"
#include "CallDLLIntegr.h"

#ifndef WIN32
    static void* hMapping=NULL;
    static int hFile=-1;
#else
    static HANDLE hMapping=0;
    static HANDLE hFile=INVALID_HANDLE_VALUE;
#endif

// для явного подключения
#ifdef _DEBUG
    const char* const dll_name = "DLLIntegrdbg.dll";
#else
    const char* const dll_name = "DLLIntegrrel.dll";
#endif

using namespace std;

Eph  myTph;
//extern Eph Tph;

ISatellite* isat=NULL;
//extern Satellite* sat = NULL;
//extern int NewSatellite(Satellite* sat);
//extern "C" DLLINTEGR_API Eph getTph();
//extern "C" DLLINTEGR_API void DtEph3(LDouble tj);

typedef int (*nsfunc)(ISatellite* isat);
typedef void (*jdfunc)(long, long double, int*, int*, int*, long double*);
typedef void (*djfunc)(long*,long double*,int, int, int, long double);
//typedef void (*setnameconst)(char*);
typedef void (*setnameconst)(char*, char*, char*);
typedef void (*setvars)(planet*, char*, char*, char*, vector<FF_ms>*, nrlmsise_flags*, ap_array*);
typedef void (*dteph3)(long double);
typedef void (*settph)(Eph*);
typedef Eph (*gettph)();
typedef void (*jd2)(long, long double, int*, int*, int*, int*, int*, long double*);

jdfunc  myjdfunc;
djfunc  mydjfunc;
setnameconst  mysetnameconst;
setvars  mysetvars;
settph  mysettph;
gettph  mygettph;
dteph3  mydteph3;
jd2  myjd2;


NewSatInit  st;

HINSTANCE h; // для явного подключения

int  dim, mv_par, porobr, flagutochn, timescaleutochn;
//int dtnum, dtephnum; // неявное подключение
long  filesize, jtutochn;
bool  aprior, iscalciter;
char sdateutochn[9], stimeutochn[20];
long double sigmaD, sigmaV, Sb0, kappa0, jt0, tj0, tjutochn;

struct  planet SUN_MOON;
char  name_pol_eph[80];
char  name_const[80];
char  rab_name[80];
char  *NAme_A;
FF_ms  *F = NULL;
static int  j_atm=0;
static int  j_cost=0;
nrlmsise_flags  flags;
ap_array  aph;
vector<FF_ms> F2;

int _tmain(int argc, _TCHAR* argv[])
// явное подключение
{
    int i, j, timescale, year, month, day, hour, minute, intval, flres;
    long jt;
    long double tj, second, x, y, z, vx, vy, vz, val;
    char s[120], txt[120], syear[5], smonth[3], sday[3], shour[3], sminute[3], ssecond[13], shelp[20];
    T3DVector rv[2];
    nsfunc  mynsfunc;
    NMTMatrix  nmtmatrix(6,6);
    FILE* f1;
    FILE* f2;
    FILE  *fnmt;

    //h = LoadLibrary(L"DLLIntegr.dll");
    h = LoadLibraryA(dll_name);
    //h = LoadLibraryA("DLLIntegrdbg.dll");
    if (!h)
    {
        setlocale(LC_CTYPE,"Russian");
        //printf("Ошибка загрузки DLLIntegr.dll !\n");
        printf("Ошибка загрузки dll интегратора!\n");
        setlocale(LC_ALL,"English_UnitedStates.1252");
        getch();
        exit(0);
    } 
    create_t  create = (create_t)GetProcAddress(h,"create");
    if (!create)
    {
        setlocale(LC_CTYPE,"Russian");
        printf("Ошибка вызова конструктора класса ISatellite !\n");
        setlocale(LC_ALL,"English_UnitedStates.1252");
        getch();
        exit(0);
    }
    ISatellite* isat = create("initdata.txt");
    jtutochn = 2455008;
    tjutochn = 0.40648148148148144;
    timescale = 1;
    isat->GetRV(jtutochn,tjutochn,rv,timescale);
    //начало отладочного варианта
    printf("jt = %ld\n",jtutochn);
    printf("tj = %.17lf\n",tjutochn);
    printf("x = %.16le\n",rv[0].x);
    printf("y = %.16le\n",rv[0].y);
    printf("z = %.16le\n",rv[0].z);
    printf("Vx = %.16le\n",rv[1].x);
    printf("Vy = %.16le\n",rv[1].y);
    printf("Vz = %.16le\n",rv[1].z);
    printf("\n");
    isat->GetMatrix(nmtmatrix);
    tjutochn = 0.40648000000000000;
    isat->GetRV(jtutochn,tjutochn,rv,timescale);
    printf("jt = %ld\n",jtutochn);
    printf("tj = %.17lf\n",tjutochn);
    printf("x = %.16le\n",rv[0].x);
    printf("y = %.16le\n",rv[0].y);
    printf("z = %.16le\n",rv[0].z);
    printf("Vx = %.16le\n",rv[1].x);
    printf("Vy = %.16le\n",rv[1].y);
    printf("Vz = %.16le\n",rv[1].z);
    printf("\n");
    isat->GetMatrix(nmtmatrix);
    tjutochn = 0.40600000000000000;
    isat->GetRV(jtutochn,tjutochn,rv,timescale);
    isat->GetMatrix(nmtmatrix);
    //конец отладочного варианта
    //delete isat;
    //isat = NULL;
    printf("jt = %ld\n",jtutochn);
    printf("tj = %.17lf\n",tjutochn);
    printf("x = %.16le\n",rv[0].x);
    printf("y = %.16le\n",rv[0].y);
    printf("z = %.16le\n",rv[0].z);
    printf("Vx = %.16le\n",rv[1].x);
    printf("Vy = %.16le\n",rv[1].y);
    printf("Vz = %.16le\n",rv[1].z);
    printf("\n");
    x = rv[0].x * AE;
    y = rv[0].y * AE;
    z = rv[0].z * AE;
    vx = rv[1].x * AE / DAY;
    vy = rv[1].y * AE / DAY;
    vz = rv[1].z * AE / DAY;
    //delete isat;
    isat->freeresources();
    isat = NULL;
    /* // записывание полученных данных в файл initdata2.txt
    f1 = fopen("initdata.txt","rt");
    f2 = fopen("initdata2.txt","w+");
    fscanf(f1,"%s",s);
    fprintf(f2,"%s\n",s);
    fscanf(f1,"%s",s);
    fprintf(f2,"%s\n",s);
    fscanf(f1,"%s",s);
    fprintf(f2,"%s\n",s);
    fscanf(f1,"%s",s);
    fprintf(f2,"%s\n",s);
    fscanf(f1,"%s",s);
    fprintf(f2,"%s\n",s);
    fscanf(f1,"%s",s);
    fprintf(f2,"%s\n",s);
    fscanf(f1,"%s",txt);
    //JD2(jtutochn,tjutochn,&year,&month,&day,&hour,&minute,&second);
    myjd2 = (jd2)GetProcAddress(h,"JD2");
    if (!myjd2)
    {
        setlocale(LC_CTYPE,"Russian");
        printf("Ошибка вызова функции JD2 !\n");
        setlocale(LC_ALL,"English_UnitedStates.1252");
        getch();
        exit(0);
    }
    myjd2(jtutochn,tjutochn,&year,&month,&day,&hour,&minute,&second);
    // формирование строки s, содержащей дату
    itoa(year,syear,10);
    itoa(month,smonth,10);
    if (month<10)
    {
        strcpy(shelp,"0");
        strcat(shelp,smonth);
        strcpy(smonth,shelp);
    }
    itoa(day,sday,10);
    if (day<10)
    {
        strcpy(shelp,"0");
        strcat(shelp,sday);
        strcpy(sday,shelp);
    }
    strcpy(s,sday);
    strcat(s,smonth);
    strcat(s,syear);
    fprintf(f2,"%s\n",s);
    fscanf(f1,"%s",txt);
    // формирование строки s, содержащую время
    itoa(hour,shour,10);
    if (hour<10)
    {
        strcpy(shelp,"0");
        strcat(shelp,shour);
        strcpy(shour,shelp);
    }
    itoa(minute,sminute,10);
    if (minute<10)
    {
        strcpy(shelp,"0");
        strcat(shelp,sminute);
        strcpy(sminute,shelp);
    }
    // _gcvt(second,9,ssecond);
    sprintf(ssecond,"%2.9f",second);
    if (second<10)
    {
        strcpy(shelp,"0");
        strcat(shelp,ssecond);
        strcpy(ssecond,shelp);
    }
    strcpy(s,shour);
    strcat(s,sminute);
    strcat(s,ssecond);
    fprintf(f2,"%s\n",s);
    fscanf(f1,"%s",txt);
    // формирование строки s, содержащую систему координат
    //fprintf(f2,"%s\n",s);
    intval = 0; // 0 -- инерциальная система координат
    fprintf(f2,"%d\n",intval);
    //fscanf(f1,"%s",txt);
    fscanf(f1,"%s",s);
    //intval = 0; // 0-- шкала времени et
    // формирование строки s, содержащую шкалу времени
    fprintf(f2,"%s\n",s);
    fscanf(f1,"%s",txt);
    fprintf(f2,"%.16le\n",x); // запись координаты x
    fscanf(f1,"%s",txt);
    fprintf(f2,"%.16le\n",y); // записаь координаты y
    fscanf(f1,"%s",txt);
    fprintf(f2,"%.16le\n",z); // записаь координаты z
    fscanf(f1,"%s",txt);
    fprintf(f2,"%.16le\n",vx); // запись координаты vx
    fscanf(f1,"%s",txt);
    fprintf(f2,"%.16le\n",vy); // запись координаты vy
    fscanf(f1,"%s",txt);
    fprintf(f2,"%.16le\n",vz); // запись координаты vz
    while (!feof(f1))
    {
        fscanf(f1,"%s",s);
        fprintf(f2,"%s\n",s);
    }
    fclose(f1);
    fclose(f2);
    Sleep(2000); // задежка выполнения программы на 2 секунды
    isat = create("initdata2.txt");
    fnmt = fopen("nmtmatr.txt","w+");
    // инициализация jt и tj
    jt = 2455008L;
    tj = 0.28225398147530056L;
    timescale = 0; // шкала времени--ET
    isat->GetRV(jt,tj,rv,timescale);
    printf("jt = %ld\n",jt);
    printf("tj = %.17lf\n",tj);
    printf("x = %.16le\n",rv[0].x);
    printf("y = %.16le\n",rv[0].y);
    printf("z = %.16le\n",rv[0].z);
    printf("Vx = %.16le\n",rv[1].x);
    printf("Vy = %.16le\n",rv[1].y);
    printf("Vz = %.16le\n",rv[1].z);
    printf("\n");
    //isat->GetCurrentMatrix(nmtmatrix);
    isat->GetMatrix(nmtmatrix);
    //fnmt = fopen("nmtmatr.txt","w+");
    for (i=0; i<6; i++)
    {
        for (j=0; j<6; j++)
        {
            val = nmtmatrix(i,j);
            //val = nmtmatrix.data[i*6 + j];
            fprintf(fnmt,"%.16le\n",val);
        }
    }
    fprintf(fnmt,"\n\n");
    // присвоение новых значений jt и tj
    jt = 2455008L;
    tj = 0.28212157407274951L;
    isat->GetRV(jt,tj,rv,timescale);
    printf("jt = %ld\n",jt);
    printf("tj = %.17lf\n",tj);
    printf("x = %.16le\n",rv[0].x);
    printf("y = %.16le\n",rv[0].y);
    printf("z = %.16le\n",rv[0].z);
    printf("Vx = %.16le\n",rv[1].x);
    printf("Vy = %.16le\n",rv[1].y);
    printf("Vz = %.16le\n",rv[1].z);
    //isat->GetCurrentMatrix(nmtmatrix);
    isat->GetMatrix(nmtmatrix);
    for (i=0; i<6; i++)
    {
        for (j=0; j<6; j++)
        {
            val = nmtmatrix(i,j);
            //val = nmtmatrix.data[i*6 + j];
            fprintf(fnmt,"%.16le\n",val);
        }
    }
    fclose(fnmt);
    //isat->freeresources(); // освобождение ресурсов из-под объекта isat класса Satellite
    delete isat;
    isat = NULL; */
    try
    {
    flres = FreeLibrary(h);
    }
    catch(exception& ex1)
    {
        printf("%s\n",ex1.what());
    }
    setlocale(LC_CTYPE,"Russian");
    printf("DLLIntegr.dll успешно завершила свою работу.\n");
    //printf("Нажмите любую клавишу для выхода из программы.\n");
    setlocale(LC_ALL,"English_UnitedStates.1252");
    //getch();
    try
    {
    return 0;
    }
    catch(exception& ex2)
    {
        printf("%s\n",ex2.what());
    }
}



2) файл dllmain.cpp :

Код

// dllmain.cpp: определяет точку входа для приложения DLL.
//#include "stdafx.h"
#include <windows.h>
//#include "Satellite.h"
#include "stdafx.h"

extern bool iscalciter;
extern int dtnum;
extern int dtephnum;
extern planet SUN_MOON;
extern nrlmsise_flags flags;
extern ap_array aph;
extern NewSatInit  st;

//extern "C" __declspec(dllexport) ISatellite* __cdecl create(NewSatInit nst)
//extern "C" DLLINTEGR_API ISatellite* __cdecl create(NewSatInit nst, bool isfirst)
//extern "C" DLLINTEGR_API ISatellite* __cdecl create()
extern "C" DLLINTEGR_API ISatellite* __cdecl create(char* filename)
{
    int i;
    NewSatInit  nst;
    ISatellite* isat=NULL;

    iscalciter = false;
    //if (isfirst==true)
    //{
        dtnum = -1;
        dtephnum = -1;
    //}
    Read_config();
    nst = read_data(filename);
    st = nst;
    //if (isfirst==true)
    //{
        for (i=0; i<11; i++)
        {
            SUN_MOON.a66[i][0].x = SUN_MOON.a66[i][0].y = SUN_MOON.a66[i][0].z = 0.0;
            SUN_MOON.a66[i][1].x = SUN_MOON.a66[i][1].y = SUN_MOON.a66[i][1].z = 0.0;
        }
        SUN_MOON.t = 0.0;
        for (i=0; i<7; i++)  aph.a[i] = 100;
        flags.switches[0] = 0;
        for (i=1; i<24; i++)  flags.switches[i] = 1;
        //
        Start_Dtepol();
        DtEphFromFile();
        DTEPOLFromFile();
    //}
    //return new Satellite(nst);
    isat = new Satellite(nst);
    INewSatellite(isat);
    return isat;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


Добавлено через 1 минуту и 5 секунд
2) файл dllmain.cpp :

// dllmain.cpp: определяет точку входа для приложения DLL.
//#include "stdafx.h"
#include <windows.h>
//#include "Satellite.h"
#include "stdafx.h"

extern bool iscalciter;
extern int dtnum;
extern int dtephnum;
extern planet SUN_MOON;
extern nrlmsise_flags flags;
extern ap_array aph;
extern NewSatInit  st;

//extern "C" __declspec(dllexport) ISatellite* __cdecl create(NewSatInit nst)
//extern "C" DLLINTEGR_API ISatellite* __cdecl create(NewSatInit nst, bool isfirst)
//extern "C" DLLINTEGR_API ISatellite* __cdecl create()
extern "C" DLLINTEGR_API ISatellite* __cdecl create(char* filename)
{
    int i;
    NewSatInit  nst;
    ISatellite* isat=NULL;

    iscalciter = false;
    //if (isfirst==true)
    //{
        dtnum = -1;
        dtephnum = -1;
    //}
    Read_config();
    nst = read_data(filename);
    st = nst;
    //if (isfirst==true)
    //{
        for (i=0; i<11; i++)
        {
            SUN_MOON.a66[i][0].x = SUN_MOON.a66[i][0].y = SUN_MOON.a66[i][0].z = 0.0;
            SUN_MOON.a66[i][1].x = SUN_MOON.a66[i][1].y = SUN_MOON.a66[i][1].z = 0.0;
        }
        SUN_MOON.t = 0.0;
        for (i=0; i<7; i++)  aph.a[i] = 100;
        flags.switches[0] = 0;
        for (i=1; i<24; i++)  flags.switches[i] = 1;
        //
        Start_Dtepol();
        DtEphFromFile();
        DTEPOLFromFile();
    //}
    //return new Satellite(nst);
    isat = new Satellite(nst);
    INewSatellite(isat);
    return isat;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Добавлено через 5 минут и 46 секунд
3) файл DLLIntegr.cpp (фрагмент кода):

Код

void  Read_config()
{
    int  i, j, n, n2, FF_mslen, fnlength, pos;
    char c, curDir[80], curDir2[80];
    FILE* Read;
    FILE* FAF_file;

    NAme_A = new char[80];
    if ((Read = fopen("config.dat","r"))!=NULL)
    {
        char a[80];
        i = fscanf(Read, "%s\n",a);
        i = fscanf(Read, "%s\n",a);
        i = fscanf(Read, "%s\n",name_const);
        i = fscanf(Read, "%s\n",name_pol_eph);
        fclose(Read);
        NAme_A = strcpy(rab_name,name_const);
        NAme_A = strcat(rab_name,"\\fafw.dat");
    }
    else
    {
        //printf("Error of opening file config.dat .\n");
        //exit(1);
        memset(&curDir[0],0,80);
        fnlength = GetModuleFileNameA(GetModuleHandle(NULL),&curDir[0],80);
        for (i=(fnlength-1); i>=0; i--)
        {
            c = curDir[i];
            if (c=='\\')
            {
                pos = i;
                break;
            }
        }
        strncpy(curDir2,curDir,pos);
        curDir2[pos] = '\0';
        //strcpy(name_const, "F:\\Roman\\Roman\\CallDLLIntegr\\CallDLLIntegr\\Const"); 
        strcpy(name_const,curDir2);
        strcat(name_const,"\\Const");
        //strcpy(name_pol_eph, "F:\\Roman\\Roman\\CallDLLIntegr\\CallDLLIntegr\\DE403"); 
        strcpy(name_pol_eph,curDir2);
        strcat(name_pol_eph,"\\DE403");
        NAme_A = strcpy(rab_name, name_const);
        NAme_A = strcat(rab_name, "\\fafw.dat");
    }
    // чтение информации из файла fafw.dat
    F2.clear();
    /*if ((hFile = open(NAme_A, O_RDWR)) == -1)
    {
        fprintf(stderr, "File %s not found", NAme_A);
        exit(1);
    }
    filesize = lseek(hFile, 0, SEEK_END);
    close(hFile); */
    FAF_file = fopen(NAme_A, "rb");
    if (FAF_file==NULL)
    {
        fprintf(stderr,"File %s not found", NAme_A);
        exit(1);
    }
    fseek(FAF_file, 0 , SEEK_END);
    filesize = ftell(FAF_file);
    fclose(FAF_file);
    FF_mslen = (int)(filesize / 32); 
    //FF_mslen = (int)(filesize / (8 * sizeof(long double))); 
    /* F = new FF_ms[FF_mslen]; */
    n = FF_mslen / 1000;
    if (FF_mslen==(n*1000))
    {
        n2 = n;
    }
    else
    {
        n2 = n + 1;
    }
    F2.reserve(n2*1000);
    F2.resize(FF_mslen);
    DWORD dwNum = MultiByteToWideChar(CP_ACP,0,NAme_A,-1,NULL,0);
    WCHAR* pwText = new WCHAR[dwNum];
    MultiByteToWideChar(CP_ACP,0,NAme_A,-1,pwText,dwNum);
    /* static */ HANDLE hFile = CreateFile(pwText,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if (hFile!=INVALID_HANDLE_VALUE)
    {
        hMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
        if (hMapping !=NULL)
        {
            CloseHandle(hFile);
            F = (FF_ms*)MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0);
            if (F)
            {
                CloseHandle(hMapping);
                j = 1;
                for (i=0; i<FF_mslen; i++)  F2[i] = F[i];
            }
        }
    }
    UnmapViewOfFile(F);
    F = NULL;
} // конец функции Read_config


PM MAIL   Вверх
erslgoeirjh
Дата 25.2.2015, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Код

NewSatInit  read_data(char* filename)
// чтение данных из файла initdata.txt, содержащих информацию об исходных начальных условиях и о модели действующих сил,
// и помещение этой информации в структуру st типа NewSatInit
{
    int  intaprior, id, NU, numvit, SK, iT, powr, Grav, Atm, Sun, Moon, SunPr, n0, ntes, Flags, flag_atm;
    int  Flag_integr, vpowr, vGrav, vAtm, vSun, vMoon, vSunPr, vnz, vnt;
    int year, month, day, hour, minute, year2, month2, day2, hour2, minute2, slen;
    int  len, pos;
    long  jt, jt2;
    LDouble  x, y, z, vx, vy, vz, tj, tj2, eps, myu, Sb, m_kappa, veps, vMu, vSb, vkappa, second, second2, partDay, partDay2;
    //NewSatInit  st;
    FILE* datafile;
    //char datafilename[80], name[80], /* sNameMod[20], */ pol[120], /* svNameMod[20], */ sdate[20], stime[20], syear[5], smonth[3], sday[3], shour[3], sminute[3], ssecond[20],
        // syear2[5], smonth2[3], sday2[3], shour2[3], sminute2[3], ssecond2[20];
    //char name[80], pol[120];
    //char pol[120];
    std::string  sname, spol, mystr1, mystr2, mystr3, mystr4;
    std::string  syear, smonth, sday, shour, sminute, ssecond;

    Flag_integr = 1;
    mystr1.reserve(20);    mystr2.reserve(20);    mystr3.reserve(8);    mystr4.reserve(20);
    sname.reserve(20);    spol.reserve(120);
    syear.reserve(4);  smonth.reserve(2);  sday.reserve(2);
    shour.reserve(2);  sminute.reserve(2);  ssecond.reserve(12);
    //datafile = fopen(datafilename, "rt");
    datafile = fopen(filename,"rt");
    if (datafile==NULL)
    {
        setlocale(LC_CTYPE,"Russian");
        printf("Ошибка открытия файла %s\n",filename);
        printf("Нажмите любую клавишу для выхода из программы.\n");
        setlocale(LC_ALL,"English.United States.1252");
        getch();
        return st;
    }
    fscanf(datafile, "%d", &intaprior); // признак учёта априорной информации
    fscanf(datafile, "%d", &dim); // размерность вектора начальных условий
    fscanf(datafile, "%d", &id); // номер объекта
    //fscanf(datafile, "%s", name); // имя объекта
    fscanf(datafile,"%s",sname.c_str());
    fscanf(datafile, "%d", &NU); // номер начальных условий
    fscanf(datafile, "%d", &numvit); // номер витка
    //fscanf(datafile, "%ld", &jt); // целая часть юлианской даты
    //fscanf(datafile, "%s", sdate); // дата
    fscanf(datafile,"%s",mystr3.c_str());
    //fscanf(datafile, "%lf", &tj); // дробная часть юлианской даты
    //fscanf(datafile, "%s", stime); // время
    fscanf(datafile,"%s",mystr4.c_str());
    fscanf(datafile, "%d", &SK); // система координат
    fscanf(datafile, "%d", &iT); // шкала времени
    fscanf(datafile, "%le", &x); // координата x
    fscanf(datafile, "%le", &y); // координата y
    fscanf(datafile, "%le", &z); // координата z
    fscanf(datafile, "%le", &vx); // координата Vx
    fscanf(datafile, "%le", &vy); // координата Vy
    fscanf(datafile, "%le", &vz); // координата Vz
    fscanf(datafile, "%le", &eps); // epsilon при интегрировании
    fscanf(datafile, "%d", &powr); // степень интегрирования
    //fscanf(datafile, "%s", sNameMod); // имя модели действующих сил
    fscanf(datafile,"%s",mystr1.c_str());
    //strcpy(sNameMod,mystr1.c_str());
    fscanf(datafile, "%d", &Grav); // показатель учёта гравитационного поля Земли
    fscanf(datafile, "%d", &Atm); // показатель учёта атмосферы 
    fscanf(datafile, "%d", &Sun); // показатель учёта Солнца
    fscanf(datafile, "%d", &Moon); // показатель учёта Луны
    fscanf(datafile, "%d", &SunPr); // показатель учёта светового давления
    fscanf(datafile, "%le", &myu); // гравитационная постоянная myu
    fscanf(datafile, "%le", &Sb); // баллистический коэффициент
    fscanf(datafile, "%le", &m_kappa); // коэффициент светового давления
    fscanf(datafile, "%d", &n0); // количество зональных гармоник
    fscanf(datafile, "%d", &ntes); // количество тессеральных гармоник
    //fscanf(datafile, "%s", pol); // имя файла с разложением гравитации по полиному
    fscanf(datafile,"%s",spol.c_str());
    fscanf(datafile, "%d", &Flags); // параметр Flags
    fscanf(datafile, "%d", &flag_atm); // параметр flag_atm--признак учёта атмосферы и гравитационного поля
    fscanf(datafile, "%le", &veps); // epsilon при интегрировании уравнений в вариациях
    fscanf(datafile, "%d", &vpowr); // степень интегрирования для уравнений в вариациях
    //fscanf(datafile, "%s", svNameMod); // имя модели действующих сил для уравнений в вариациях
    fscanf(datafile,"%s",mystr2.c_str());
    //strcpy(svNameMod,mystr2.c_str());
    fscanf(datafile, "%d", &vGrav); // показатель учёта гравитационного поля Земли для уравнений в вариациях
    fscanf(datafile, "%d", &vAtm); // показатель учёта атмосферы для уравнений в вариациях 
    fscanf(datafile, "%d", &vSun); // показатель учёта Солнца для уравнений в вариациях
    fscanf(datafile, "%d", &vMoon); // показатель учёта Луны для уравнений в вариациях
    fscanf(datafile, "%d", &vSunPr); // показатель учёта светового давления для уравнений в вариациях
    fscanf(datafile, "%le", &vMu); // гравитационная постоянная myu для уравнений в вариациях
    fscanf(datafile, "%le", &vSb); // баллистический коэффициент для уравнений в вариациях
    fscanf(datafile, "%le", &vkappa); // коэффициент светового давления для уравнений в вариациях
    fscanf(datafile, "%d", &vnz); // количество зональных гармоник для уравнений в вариациях
    fscanf(datafile, "%d", &vnt); // количество тессеральных гармоник для уравнений в вариациях
    //fscanf(datafile, "%d", &porobr); // порядок обработки измерений (1--прямой, 2--обратный)
    //fscanf(datafile, "%d", &flagutochn); // на какое время уточнять: 1--на время исходных НУ, 2--на время первого измерения, 3--на время последнего измерения, 4--на заданное время
    //fscanf(datafile, "%s", sdateutochn); // дата уточнения
    //fscanf(datafile, "%s", stimeutochn); // время уточнения
    //fscanf(datafile, "%d", &timescaleutochn); // шкала времени уточнения
    fclose(datafile); // закрытие файла
    // действия для отладки--получение строки, содержащей DDMMYYYY и HHMMSS.SSSSS
    //ltoa(jt, sdate, 10);
    //_gcvt(tj, 12, stime);
    /* if (iscalciter==false)
    { */
    //strcpy(sdate,mystr3.c_str());
    //strcpy(stime,mystr4.c_str());
    //strcpy(sNameMod,mystr1.c_str());
    //strcpy(svNameMod,mystr2.c_str());
    if (intaprior==1)
    {
        aprior = true;
    }
    else
    {
        aprior = false;
    }
    x = x / AE;
    y = y / AE;
    z = z / AE;
    vx = vx / AE * DAY;
    vy = vy / AE * DAY;
    vz = vz / AE * DAY;


Добавлено через 3 минуты и 30 секунд
Код

//strncpy(sday, sdate, 2);
    //sday[2] = '\0';
    sday = mystr3.substr(0,2);
    //strncpy(smonth, sdate+2, 2);
    //smonth[2] = '\0';
    smonth = mystr3.substr(2,2);
    //strncpy(syear, sdate+4, 4);
    //syear[4] = '\0';
    syear = mystr3.substr(4,4);
    //strncpy(shour, stime, 2);
    //shour[2] = '\0';
    shour = mystr4.substr(0,2);
    //strncpy(sminute, stime+2, 2);
    //sminute[2] = '\0';
    sminute = mystr4.substr(2,4);
    //slen = strlen(stime);
    //strncpy(ssecond,stime+4,slen-4);
    //ssecond[slen-4] = '\0';
    len = mystr4.length();
    pos = len - 4;
    ssecond = mystr4.substr(4,pos);
    //day = atoi(sday);
    day = atoi(sday.c_str());
    //month = atoi(smonth);
    month = atoi(smonth.c_str());
    //year = atoi(syear);
    year = atoi(syear.c_str());
    //hour = atoi(shour);
    hour = atoi(shour.c_str());
    //minute = atoi(sminute);
    minute = atoi(sminute.c_str());
    //second = atof(ssecond);
    second = atof(ssecond.c_str());
    partDay = ((LDouble)hour * 3600.0 + (LDouble)minute * 60.0 + second) / 86400.0;
    jt = 0;
    tj = 0.0;
    DJ(&jt, &tj, year, month, day, partDay);
    /* }
    else
    {
        jt = atol(sdate);
        tj = atof(stime);
    } */
    // конец действий для отладки 
    // RV[0].x = x;    RV[0].y = y;    RV[0].z = z;    RV[1].x = vx;   RV[1].y = vy;    RV[1].z = vz; // начальный вектор состояния
    //Sb0 = Sb; // начальное значение баллистического коэффициента 
    //kappa0 = m_kappa; // начальное значение коэффициента светового давления
    jt0 = jt; // начальное значение целой части юлианской даты
    tj0 = tj; // начальное значение дробной части юлианской даты
    /* if (iscalciter==false)
    { */
    /* strncpy(sday2, sdateutochn, 2);
    sday2[2] = '\0';
    strncpy(smonth2, sdateutochn+2, 2);
    smonth2[2] = '\0';
    strncpy(syear2, sdateutochn+4, 4);
    syear2[4] = '\0';
    strncpy(shour2, stimeutochn, 2);
    shour2[2] = '\0';
    strncpy(sminute2, stimeutochn+2, 2);
    sminute2[2] = '\0';
    //strncpy(ssecond2, stimeutochn+4, 8);
    slen = strlen(stimeutochn);
    strncpy(ssecond2,stimeutochn+4,slen-4);
    ssecond2[slen-4] = '\0';
    day2 = atoi(sday2);
    month2 = atoi(smonth2);
    year2 = atoi(syear2);
    hour2 = atoi(shour2);
    minute2 = atoi(sminute2);
    second2 = atof(ssecond2);
    partDay2 = ((LDouble)hour2 * 3600.0 + (LDouble)minute2 * 60.0 + second2) / 86400.0;
    jt2 = 0;
    tj2 = 0.0;
    DJ(&jt2, &tj2, year2, month2, day2, partDay2); */
    /* }
    else
    {
        jt2 = atol(sdateutochn);
        tj2 = atof(stimeutochn);
    } */
    //jtutochn = jt2;
    //tjutochn = tj2;
    //Pr_atm = Flags * 10 + flag_atm;
    // присвоение этих значений полях структуры st типа NewSatInit
    st.id = id;
    //strcpy(st.Nameobj, name);
    strcpy(st.Nameobj, sname.c_str());
    st.mu = myu;
    st.Nvit = numvit;
    st.refSysCodeIn = SK;
    st.TimeIn = iT;
    st.jt0 = jt;
    st.tj0 = tj;
    st.PowerIntegr = powr;
    st.epsTime = eps;
    st.rv0[0].x = x;
    st.rv0[0].y = y;
    st.rv0[0].z = z;
    st.rv0[1].x = vx;
    st.rv0[1].y = vy;
    st.rv0[1].z = vz;
    st.mfe.Sun = Sun;
    st.mfe.Moon = Moon;
    st.mfe.SunPr = SunPr;
    st.mfe.Grav = Grav;
    st.mfe.Atm = Atm;
    st.mfe.m_Kappa = m_kappa;
    //if (dim==6)  st.mfe.m_Kappa = 0.0;
    //st.mfe.m_MEF.flag = Flags * 10 + flag_atm;
    st.mfe.m_MEF.flag = flag_atm * 10 + Flags; // так правильно
    //st.mfe.m_MEF.flag = Grav * 10 + flag_atm;
    st.mfe.m_MEF.n0 = n0;
    //st.mfe.m_MEF.NAMEpol = new char[80];
    st.mfe.m_MEF.NAMEpol = new char[120];
    //strcpy(st.mfe.m_MEF.NAMEpol, "pz90");
    //strcpy(st.mfe.m_MEF.NAMEpol,pol);
    strcpy(st.mfe.m_MEF.NAMEpol,spol.c_str());
    st.mfe.m_MEF.ntes = ntes;
    //st.mfe.m_MEF.PR_atm = Flags * 10 + flag_atm;
    st.mfe.m_MEF.PR_atm = flag_atm;
    st.mfe.m_MEF.Sb = Sb;
    //if (dim==6)  st.mfe.m_MEF.Sb = 0.0;
    st.Flag_integr = 1;
    st.v_epsTime = veps;
    st.v_PowerIntegr = vpowr;
    st.var = new ModelForc_Var();
    st.var->Sun = vSun;
    st.var->SunPr = vSunPr;
    st.var->Moon = vMoon;
    st.var->Grav = vGrav;
    st.var->Atm = vAtm;
    st.var->n_z = vnz;
    st.var->n_t = vnt;
    st.v_q = new q_Var();
    st.v_q->k = 0;
    st.v_q->Sb = vSb;
    if (vAtm>0)  st.v_q->k++;
    st.v_q->Kappa = vkappa;
    if (vSunPr>0)  st.v_q->k++;
    if (dim==6)  st.v_q->k = 0;
    mv_par = 6 + st.v_q->k;
    // конец присвоения значений полям структуры st типа NewSatInit
    mystr1.clear();
    mystr2.clear();
    mystr3.clear();
    mystr4.clear();
    syear.clear();  smonth.clear();  sday.clear();
    shour.clear();  sminute.clear();  ssecond.clear();
    sname.clear();  spol.clear();
    return st;
} // конец функции read_data


Добавлено через 7 минут и 34 секунды
Программа бьётся внутри функции read_data, на строке
smonth = mystr3.substr(2,2);


При этом отладчик выдаёт окно со следующим сообщением:

Необработанное исключение в "0x7533d36f" в "CallDLLIntegr.exe":
Исключение Microsoft C++:
std::out_of_range по адресу 0x0012e918

Также появляется вкладка с файлом xstring, где внутри функции assign(const _Myt& _Right, size_type _Roff, size_type _Count)
указатель стоит на строке

size_type _Num = _Right.size() - _Roff;


Что всё это значит?
Как сделать так, чтобы функция read_data нормально работала?
Можно ли сделать чтение из файла в функции read_data с помощью std::string ? Если да, то как это сделать--что нужно изменить в моей программе?
Или же мне следует возвратиться к char[] ? Если так, то что мне надо сделать для того, чтобы моя программа нормально работала как .exe-файл, а не только из-под отладчика? (Из-за чего я и перешёл в функции read_data от char[] к std::string).

PM MAIL   Вверх
borisbn
Дата 25.2.2015, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 2
Всего: 135



Цитата(erslgoeirjh @  25.2.2015,  13:16 Найти цитируемый пост)
fscanf(datafile,"%s",mystr3.c_str());

Так делать нельзя. Ты не выделил память под строку, а только зарезервировал на будущее.
В общем, нужно либо прочитать строку в массив char[ N ], а затем присвоить его в mystr3, либо пользоваться ifstream'ами.
Если бы было голосование, я был бы за второй вариант.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0901 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.