Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Ошибка. что делать?


Автор: MaxSSimus 17.1.2008, 06:56
Код

procedure TForm1.ReDraw;
var
  OutputdUFile,OutputRhoFile,
  OutputSTIsFile,OutputStauEpFile                           :textfile;
  OutputFileName                                            :string;
  ii                                                        :integer;
begin
 {============Считываем файл RhoTau / t ================}
 Path:=ProgrammPath+'\1D\';
// Path:='D:\SGS\TEM\Model1\1D\';
 OutputFileName := Path+'UZHZ1DR.dat';
 AssignFile(OutputRhoFile,OutputFileName);
 Reset(OutputRhoFile);
  for ii:=1 to 3 do ReadLn(OutputRhoFile);
  for ii:=1 to NTimes  do
  begin
     ReadLn(OutputRhoFile, ModTime[ii],ModRho[ii]);  
   end;
  CloseFile(OutputRhoFile);
  Chart1.Series[0].Clear;
  for ii:=1 to NTimes  do
  begin
    Chart1.Series[0].AddXY(ModTime[ii], ModRho[ii], '');
  end;
end;



ReadLn(OutputRhoFile, ModTime[ii],ModRho[ii]);    raised exception class EINOUTERROR with mesage 'Invalid numeric input'. Process stoped/ Use Step or Run to continue


тут выдаёт ошибку. что делать?


M
Alexeis
Модератор: Название темы должно отражать ее суть!

Автор: MetalFan 17.1.2008, 09:10
не подавать на ввод инвалидное значение.

Автор: gambit 17.1.2008, 13:52
Код

 for ii:=1 to 3 do ReadLn(OutputRhoFile);

Что делает эта строка???

Какие типы переменных ModTime[ii]  ModRho[ii]  
дай пример файла.

Ну я так подозреваю что переменные эти string и по этому попробуй 
вместо
Код

for ii:=1 to NTimes  do
  begin
     ReadLn(OutputRhoFile, ModTime[ii],ModRho[ii]);  
   end;


сделать
Код

for ii:=1 to NTimes  do
  begin
     ReadLn(OutputRhoFile, ModTime[ii]);
ModRho[ii]:= ModTime[ii]; 
   end;

Может я конечно глупость сморозил, строго не судите. (Спать хочется и delphi под рукой нет)

Автор: remax 18.1.2008, 01:40
Цитата(gambit @  17.1.2008,  13:52 Найти цитируемый пост)
Может я конечно глупость сморозил, строго не судите.

Глупость-не глупость, но что-то загадочное точно.  smile 
Самое интересное, что Ваше предположение 
Цитата(gambit @  17.1.2008,  13:52 Найти цитируемый пост)
Ну я так подозреваю что переменные эти string

очень логичное и весьма вероятное.  smile  Но чем поможет присвоение Y:=X   - не знаю.  smile 

Подождем, когда MaxSSimus уточнит тип этих массивов. И если они строковые, а значения в серии вещественные, то -  
Код

Chart1.Series[0].AddXY(StrToFloat(ModTime[ii]), StrToFloat(ModRho[ii]), '');


Если в серии значения другого типа, то соответствующее преобразование.

Хотя, мне кажется эти промежуточные массивы вообще не  нужны. Достаточно использовать две переменные. И цикл чтения из файла объединить с добавлением данных в серию. Побочным положительным эффектом будет то, что тогда не будет ограничения на размер серии данных.  smile  

Автор: gambit 18.1.2008, 10:13
Код

ReadLn(OutputRhoFile, ModTime[ii],ModRho[ii]);

Цитата

Но чем поможет присвоение Y:=X   - не знаю

Может я ошибаюсь delphi под рукой нет, но мне кажется если они string то переменная 
ModTime[ii] прочитает всю строку и поставит курсор в конец строки, а переменной ModRho[ii] читать нечего. Может в этом ошибка?

Автор: remax 19.1.2008, 01:58
Цитата(gambit @  18.1.2008,  10:13 Найти цитируемый пост)
ModTime[ii] прочитает всю строку и поставит курсор в конец строки, а переменной ModRho[ii] читать нечего. Может в этом ошибка? 

Ну, если переменная объявлена как string, то ты прав - ничего хорошего не получится. Но, если в файле форматированные значения (скажем, столбцы фиксированной ширины, на 8 символов каждый), а тип данных с ограничением размера (Например, string[8]), то все пучком. 

Я бы, в любом случае не использовал строковые переменные. А если бы и был вынужден это делать, то читал бы построчно и каждую строку тогда бы парсил. Но это, только в том случае, когда надо подстроиться под разные текстовые форматы.

Автор: MaxSSimus 20.1.2008, 16:01
Дело в том, что ModRho и ModTime не что иное, как переменная в массиве (вроде бы так)
Код

ModRho, ModTime : array [1..5000] of double


после запуска программы я ввожу данные и пытаюсь считать прямую задачу геофизики при помощи ещё одной (DOS) программки
вот часть кода
    
Код

//Path:='D:\SGS\TEM\Model1\1D\';
 Path:=ProgrammPath+'\1D\';
  DeleteFile(Path+'UZHZ1D.REZ');
{================Прямая задача 1D==================}
// if not ExecuteFile(MainForm,Path,'UZHZ1D.EXE') then
 // exit;
  CreateProcess(NIL,PChar(Path+'UZHZ1D.EXE'),NIL,NIL,false,NORMAL_PRIORITY_CLASS,
                NIL,PChar(Path), TSI, TPI);
 
 //CalcDone1D:=true;
// SpeedButton9Click(Sender);
 //CalcModelStau1D;
 ReDraw;
end;



потом она пишет, что ([Warning] Inter_TEM.pas(728): Unsafe type 'PChar') вот тут (выделено жирным) косяк.
и кидает в том место, где я ранее описал.

Файл для чтения я приклеил

Автор: MaxSSimus 21.1.2008, 06:46
Спасибо всем, кто откликнулся. Я уже разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)