Q&A

  • Invalid floating point operation.
Invalid floating point operation.



이게 도데체 무슨 말인지 잘 모르겠군요.

어떨때 발생하는지.



파일을 한줄씩 읽어서 값을 변수에 대입하는 건데요.

어떤 파일은 잘 돌아 가는데 어떤 파일은 위와같은 에러가 나네요.



다음은 소스의 원문인데 이걸 다 검토해 달라고 하면

너무 무리한 요구인것 같군요.

그냥 올려만 봅니다. 그냥 위의 오류메세지가 뭔지 라도 알고싶습니다.



procedure TForm1.Button1Click(Sender: TObject);

var

frw : textfile;

sdir : string ;

SearchRec : TsearchRec; //소스디렉토리를 검색하고자 할때 쓰이는 레코드(파스칼 구조체입니다.);

Result : integer; //찾았는지 못 찾았는지 여부

begin

if SaveDialog1.Execute then

Begin

if findfirst(SaveDialog1.FileName, faanyfile, SearchRec) = 0 then

if MessageDlg('같은이름의 파일이 이미 있습니다.' + #13#10

+ '덮어쓸까요 ?' , mtWarning, [mbYes, mbNo], 0) = mrNo then

exit ; //같은이름이 있고 덮어쓰지 않으면 빠져나감.

//두개의 if 는 단일문장으로 끝남.



AssignFile(frw, SaveDialog1.FileName);

Rewrite(frw); //화일을 쓰기모드로 생성

WriteLn(frw, 'strDay 평균온도 최대온도 평균습도 최대습도 데이터개수');

Closefile(frw); //생성만 하고 바로 닫음. 나중에 Append.



Memo1.Text := '' ;



sdir := DirectoryListBox1.Directory + '';

findfirst(sdir + '*.*', faanyfile, SearchRec); //소스폴더를 검색한다.

Result := 0; //검색결과 여부의 초기화

While Result = 0 do //다음 화일을 찾아 루프를 반복

Begin

if (SearchRec.name = '.') or (SearchRec.name = '..') then

Begin //폴더가 자기자신이거나 상위폴더일 경우

Result := findnext(SearchRec); //검색 결과 화일을 찾으면 1이다.)

continue;

End;

if SearchRec.attr = fadirectory then //발견한 대상이 디렉토리이면

Begin

Memo1.Lines.Append(sdir + SearchRec.name + '');

FindYear(sdir + SearchRec.name + '', 'D*.rpt')

End;

Result := findnext(SearchRec);

End; //of While Result = 0

Memo1.Lines.Append('작업이 끝났습니다.');

End; //of if SaveDialog1.Execute

end;



Procedure TForm1.FindYear(yDir: String; yFile: String);

Var

SearchRec : TsearchRec; //디렉토리를 검색하고자 할때 쓰이는 레코드(파스칼 구조체입니다.);

Result : integer; //찾았는지 못 찾았는지 여부

f1, frw2 : textfile;

s1, srw2 : String ;

iRow, iNum : integer ;

rTval, rHval, rTavg, rTmax, rHavg, rHmax : Real ;

Begin

AssignFile(frw2, SaveDialog1.FileName);

Append(frw2); //화일을 연결하여쓰기모드로 생성



Result := findfirst(yDir + yFile, faanyfile, SearchRec); //처음 폴더를 검색한다.

While Result = 0 do //검색되었을 경우 다음 화일을 찾아 루프를 반복

Begin

iRow := 0;

iNum := 0;

rTavg := 0;

rTmax := -100;

rHavg := 0;

rHmax := 0;

AssignFile(f1, yDir + SearchRec.name);

Reset(f1); //화일을 처음으로 돌림

While Not eof(f1) do

Begin

Readln(f1, s1); //한줄을 읽음

iRow := iRow + 1;

if (length(s1) = 69) then

Try

rTval := strToint(trim(copy(s1, 44, 6))) / 10.0;

rHval := strToint(trim(copy(s1, 50, 6))) / 10.0;

rTavg := rTavg + rTval;

rHavg := rHavg + rHval;

if rTmax < rTval then rTmax := rTval;

if rHmax < rHval then rHmax := rHval;

iNum := iNum + 1;

Except

Memo1.Lines.Append(SearchRec.name + ' (' + intToStr(iRow) + ') 잘못된 줄 ' + s1);

End //of try

Else

Begin

Memo1.Lines.Append(SearchRec.name + ' (' + intToStr(iRow) + ') 너무잛은(긴)줄 ' + s1);

End; // of if (length(s1) = 69)

End; //of While Not eof(f1)

Closefile(f1);

rTavg := rTavg / iNum;

rHavg := rHavg / iNum;

srw2 := Format('%8.3f %8.3f %8.3f %8.3f %d', [rTavg, rTmax, rHavg, rHmax, iNum]);

WriteLn(frw2, Copy(SearchRec.Name, 2, 6) + ' ' + srw2);

// ListBox2.ITems.Add(SearchRec.name);

Result := findnext(SearchRec); //폴더를 검색한다.

End; //of While Result = 0

Closefile(frw2);

End;





여기까지 읽어주시다니 너무나 고맙습니다.

이왕 여기까지 읽었으니, 다음을 봐 주십시오.

년 디렉토리에 월일 파일이 있습니다. 그러니까 보통 365개의 파일이 있죠.

한 데이터파일(월일)에 보통 96개정도의 줄이 있습니다.(아닌것도 있구요.)

그것을 읽어 평균, 최대를 구하는 것이지요.

맨앞에 920319 이것은 파일명(D920319.rpt) 의 일부를 copy(fname,2,6) 한 것입니다.

두번째칸을 평균을 구하기위해 값을 다 더하는 것이고요

세번째는 최대값을 구한 것이고요.

네째 다섯째는 똑같습니다. (2,3칸 온도, 4,5칸 습도)

D920319.rpt 파일에는 전부 23줄의 내용이 있습니다.

그러니까 다음 은 파일은 끝까지 읽었다는 얘기지요.

그리고 온도까지는 평균, 최대를 다 구해놓고,

습도 평균 구하는 과정에서 에러가 나는것 같군요.



파일명일부 온도평균 온도최대 습도평균 습도최대 개수

920319 171.900 10.100 1489.000 84.000 20

920319 180.000 10.100 1553.000 84.000 21

920319 188.100 10.100 1615.000 84.000 22

920319 196.000 10.100 1678.000 84.000 23

920319 8.522 10.100 7



0  COMMENTS