|
제시하신 소스 코드로는 원인을 충분히 밝힐 수는 없지만 의심스러운 곳을 살펴보겠습니다.
그리고 참고로 어디에 문제가 있는지 알아보려면 디버깅 옵션을 켜고 프로그램을 전체적으로 다시 컴파일한 후 아래의 자료 적재 부분의 선두에 커서를 둔 상태에서 F4 키를 누르면
프로그램이 실행되어 그 곳에서 일단 멈춥니다. 그런 다음 F8키를 누르면 한 줄씩 실행됩니다. 문제가 있는 부분에서 오류가 발생하며 프로그램 실행이 멈추겠지요.
또한 현재 커서 위치의 코드가 함수를 호출하는 것일 경우 F7키를 누르면 그 함수 코드 부분으로 옮겨갑니다. 그리고 [View] 메뉴의 Watches를 클릭하면 창이 뜨는데 그 곳에서 더블클릭한 후 감시하고자 하는 변수를 지정하면 코드를 실행하며 변하는 값을 볼 수 있습니다.
1. 일단 배열의 개수가 충분한지 확인합니다.(물론 이 문제라면 "out of index" 오류가 발생하겠지만 그래도 한 번 해봅시다.)
데이터 저장 부분의 dat=fopen("c:\\Data\\data.dat","wb+");과
데이터 적재 부분에 while문이 있는 것으로 보아 values형의 구조체 배열에 값을 읽어 들이는 것으로 판단됩니다.
그렇다면 자료에 사용할 values 형의 배열을 충분히 마련해 두어야 겠지요.
보통은 아래와같이 합니다.
#define MAX_DATA 100
struct values *RealData[MAX_DATA];
int DataCount;
로 해두고 파일에서 읽어 들일 때 메모리를 할당하고 동시에 그 카운터도 1증가시켜 주는 식으로 합니다. 물론 읽어 들일 수 있는 자료의 수는 XXX이하겠지요(0에서 XXX-1까지).
2. 그리고 자료를 적재하는 부분의 아래 두 부분이 상당히(가장) 의심스럽습니다.
num_data=StrToInt(real_data.time);
MyDateTime=real_data.date;
real_data.time과 real_data.date은 char 배열인데 이 배열에 자료를 적재한 후 과연 끝에 NULL 종료 문자가 있을 것인가가 의심스럽습니다.
이 것을 알아보려면 자료 저장 부분의 아래 두 곳을 검사해보야 합니다.
strcpy(real_data.date,MyDateTime.c_str());
strcpy(real_data.time,ReactTime.c_str());
MyDateTime과 ReactTime의 길이가 각각 29와 19를 넘지 않아야 합니다.
소영 님이 쓰신 글 :
: 프로그램을 실행하여 (컴파일에런 없습니다.) 파일을 로드할 때 아래의 에러메세지가 나옵니다.
:
: Project Beta.exe raised exception class EAcess Violation with messgae.
: 'Access violation at address 0040294C. Read of address FFFFFFFF'.
: Process Stopped. Use Step or Run to continue.
:
: 코딩을 대략 적으면...
:
: //Struct
:
: struct values
: {
: char date[30];
: char time[20];
: int valvetime[10];
: int injecttime_s;
: float set_rtemp;
: float set_jtemp;
: float temp1;
: float jacket;
: float heating;
:
: };
:
: values real_data;
:
: //Loading data...
:
: Form7->Memo1->Lines->LoadFromFile("c:\\Data\\data.cfg"); //<---- Memo1->Lines->SaveToFile("c:\\Data\\data.cfg"); 이런 식으로 다른폼(Form7)에서 따로 만듦
: dat=fopen("c:\\Data\\data.dat","rb+");
: int flag;
: num_data=0;
: fseek(dat, 0L, SEEK_SET);
:
: while(1)
: {
: flag=fread((values *)&real_data,sizeof(real_data),1,dat);
: if(flag<=0) break;
: // set_point calc.
: sampletime_s=real_data.injecttime_s;
: for(int i=0;i<5;i++)
: soltime[i]=real_data.valvetime[i];
: real_temp1=real_data.temp1;
: real_jacket=real_data.jacket;
: real_control_heat=real_data.heating;
:
: num_data=StrToInt(real_data.time);
: MyDateTime=real_data.date;
: Edit4->Text=IntToStr(sampletime_s);
: Edit1->Text=IntToStr(soltime[0]);
: Edit2->Text=IntToStr(soltime[1]);
: Edit3->Text=IntToStr(soltime[2]);
: Edit5->Text=real_data.set_rtemp;
: Edit6->Text=real_data.set_jtemp;
:
: }
:
: fclose(dat);
:
: //Writing Data...
:
: dat=fopen("c:\\Data\\data.dat","wb+");
: real_data.injecttime_s=sampletime_s;
: for(int i=0;i<5;i++)
: real_data.valvetime[i]=soltime[i];
: real_data.temp1=real_temp1;
: real_data.jacket=real_jacket;
: real_data.heating=real_control_heat;
: real_data.set_rtemp=StrToFloat(Edit5->Text);
: real_data.set_jtemp=StrToFloat(Edit6->Text);
: real_data.set_rtemp=set_rtemp;
: real_data.set_jtemp=set_jtemp;
:
: strcpy(real_data.date,MyDateTime.c_str());
: strcpy(real_data.time,ReactTime.c_str());
: fseek(dat, 0L, SEEK_END);
: fwrite(&real_data,sizeof(real_data),1,dat);
: fclose(dat);
:
: 아직 초보라 그런지 디버깅은 이런 에러는 어렵군요. T.T
: 파일을 Writing할 때 문제가 있는 것 같은데 정확한 원인을 모르겠습니다.
: 같은 타이머내에서 데이타를 읽고(실험장치로부터 읽습니다) 쓰길 같이
: 하는 것도 원인이 될수 있나요?
: 디버깅을 하면 각 변수에 들어가는 값은 정확합니다.
: 고수님들!!
: 답변 꼭 부탁드립니다.
:
|