Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

I/O error 998 [D2005, XP]


Чайник ©   (2010-01-27 23:09:00) 

I/O error 998

Как прочитать данные из файла в динамический массив?

Пытаюсь прочитать из файла массив данных:

type  
 TmfTriangle = record
   P1, P2, P3 : Integer;
   S : Extended;
 end;  
TmfArrayTriangles = array of  TmfTriangle;

const
 FILE_NAME = 'E:\Программы\Tmp\tmp.dat';
 COUNT_TRI = 16;

var
 ANew : TmfArrayTriangles;

…………………………………………………………..
procedure TForm1.Button2Click(Sender: TObject);
var  SourceFile: file;
      DataSize: Integer;
begin

  DataSize := COUNT_TRI*SizeOf(TmfTriangle);
  try
      AssignFile(SourceFile, FILE_NAME);
      Reset(SourceFile);
      SetLength(ANew, COUNT_TRI);
      FillMemory(ANew, DataSize, 0);
      Seek(SourceFile, 0);
      BlockRead(SourceFile, ANew, DataSize);
  finally
    CloseFile(SourceFile);

  end;


Выдает :  “I/O error 998”
В windows.pas нашел:
{ Invalid access to memory location. }
 ERROR_NOACCESS = 998;

И как мне этого инвалида обойти?


Германн   (2010-01-28 01:10:00) [1]


> А разве при объявлении ANew : TmfArrayTriangles;
> ANew - не есть УКАЗАТЕЛЬ на дин.массив?
>

Есть. Но для функций подобных BlockRead нужен адрес буфера "приема/передачи", а не "указатель на что-то".


Игорь Шевченко   (2010-01-27 23:59:00) [2]


> А разве при объявлении ANew : TmfArrayTriangles;
> ANew - не есть УКАЗАТЕЛЬ на дин.массив?


Объявление BlockRead посмотри в справке


Чайник   (2010-01-27 23:53:00) [3]


> Это не важно, приведена законченая процедура, где данные
> читаются с нулевым смещением.


ну, это скорее заготовка процедуры, просто я споткнулся на первом же шаге...


> Игорь Шевченко ©   (27.01.10 23:19) [3]
> или BlockRead(SourceFile, ANew[0], DataSize);


Спасибо, заработало!


Anatoly Podgoretsky   (2010-01-27 23:48:00) [4]


> в файле кроме массива TmfTriangle могут быть и другие данные,
>  других типов, поэтому я и объявил его как байтовый.

Это не важно, приведена законченая процедура, где данные читаются с нулевым смещением.


Чайник   (2010-01-27 23:43:00) [5]


> Anatoly Podgoretsky ©   (27.01.10 23:32) [4]
> А почему не file of TmfTriangle


в файле кроме массива TmfTriangle могут быть и другие данные, других типов, поэтому я и объявил его как байтовый.


> Игорь Шевченко ©   (27.01.10 23:18) [2]
>BlockRead(SourceFile,  ANew^, DataSize);


[Pascal Error] TexPassTypesConst.pas(303): E2017 Pointer type required


> Игорь Шевченко ©   (27.01.10 23:19) [3]
> или BlockRead(SourceFile, ANew[0], DataSize);


А разве при объявлении ANew : TmfArrayTriangles;
ANew - не есть УКАЗАТЕЛЬ на дин.массив?


Anatoly Podgoretsky   (2010-01-27 23:32:00) [6]

А почему не file of TmfTriangle


Игорь Шевченко   (2010-01-27 23:19:00) [7]

или
BlockRead(SourceFile, ANew[0], DataSize);


Игорь Шевченко   (2010-01-27 23:18:00) [8]


>    BlockRead(SourceFile, ANew, DataSize);


BlockRead(SourceFile, ANew^, DataSize);

?


Чайник   (2010-01-27 23:17:00) [9]

Пардон:

var  SourceFile: file of byte;


Наверх

Титульная страница Поиск, карта сайта Написать письмо