Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.25;
Скачать: CL | DM;

Вниз

Считывание BlockRead`ом в вариантный массив   Найти похожие ветки 

 
K   (2008-04-23 12:28) [0]

Такое возможно? Программа вылетает на втором BlockRead:


type TEtkData = record ES,SF,NE,NV,KX : Integer; DE,DV,X0,Y0,ROT : real; ZBASE,ZMult : real; end;

var F : file;
   etkData : TEtkData; buf : variant;
   BufSize : integer;

begin
 AssignFile(F,Filename); reset(F,1);

 BlockRead(F,etkData,76,code);

 BufSize := etkData.NE*etkData.NV;

 case etkData.SF of
 0 : buf := VarArrayCreate([0,BufSize-1], varByte);
 1 : buf := VarArrayCreate([0,BufSize-1], varWord);
 3 : buf := VarArrayCreate([0,BufSize-1], varInteger);
 4 : buf := VarArrayCreate([0,BufSize-1], varSingle);
 end;

 BlockRead(F,buf,etkData.ES*BufSize,code);
 
 CloseFile(F);
 ...
end;


Посоветуйте, плз...


 
Palladin ©   (2008-04-23 12:34) [1]

VarArrayLock + F1


 
ZENsan ©   (2008-04-23 16:31) [2]

Используй packed record....


 
ZENsan ©   (2008-04-23 16:33) [3]

Hotja eto mozhet i ne pomoch... tut vpravdu nado VarArrayLock..


 
Alarm ©   (2008-04-23 16:37) [4]

По мне, так BlockRead-у все равно куда считывать, не вижу проблем, хотя не проверял


 
Palladin ©   (2008-04-23 17:04) [5]


> Alarm ©   (23.04.08 16:37) [4]

подрастешь увидишь


 
Palladin ©   (2008-04-23 17:35) [6]

Удалено модератором
Примечание: дубль


 
Ёжик   (2008-04-23 17:40) [7]

> Palladin ©   (23.04.08 17:04) [5]
> Palladin ©   (23.04.08 17:35) [6]
Почти полчаса...
Опять похоже не допил:(


 
K   (2008-04-24 10:26) [8]

Сделала так:

type TEtkData = record ES,SF,NE,NV,KX : Integer; DE,DV,X0,Y0,ROT : real; ZBASE,ZMult : real; end;
    TDataArray = array of byte; PDataArray = ^TDataArray;

var F : file;
  etkData : TEtkData; buf : variant; bufByte : PDataArray;
  BufSize : integer;

begin
AssignFile(F,Filename); reset(F,1);

BlockRead(F,etkData,76,code);

BufSize := etkData.NE*etkData.NV;

case etkData.SF of
0 : buf := VarArrayCreate([0,BufSize-1], varByte);
1 : buf := VarArrayCreate([0,BufSize-1], varWord);
3 : buf := VarArrayCreate([0,BufSize-1], varInteger);
4 : buf := VarArrayCreate([0,BufSize-1], varSingle);
end;

New(BufByte); SetLength(BufByte^,BufSize*etkData.ES);
try
  BufByte := VarArrayLock(buf);
  BlockRead(F,buf,etkData.ES*BufSize,code);
  ...
finally
 VarArrayLock(buf);
end;

Dispose(BufByte);  
CloseFile(F);
end;

На втором BlockRead`е выдает ошибку: типа "массив заперт"


 
K   (2008-04-24 10:28) [9]

Сорри, конечно же, так:
type TEtkData = record ES,SF,NE,NV,KX : Integer; DE,DV,X0,Y0,ROT : real; ZBASE,ZMult : real; end;
   TDataArray = array of byte; PDataArray = ^TDataArray;

var F : file;
 etkData : TEtkData; buf : variant; bufByte : PDataArray;
 BufSize : integer;

begin
AssignFile(F,Filename); reset(F,1);

BlockRead(F,etkData,76,code);

BufSize := etkData.NE*etkData.NV;

case etkData.SF of
0 : buf := VarArrayCreate([0,BufSize-1], varByte);
1 : buf := VarArrayCreate([0,BufSize-1], varWord);
3 : buf := VarArrayCreate([0,BufSize-1], varInteger);
4 : buf := VarArrayCreate([0,BufSize-1], varSingle);
end;

New(BufByte); SetLength(BufByte^,BufSize*etkData.ES);
try
 BufByte := VarArrayLock(buf);
 BlockRead(F,bufbyte^[0],etkData.ES*BufSize,code);
 ...
finally
VarArrayLock(buf);
end;

Dispose(BufByte);  
CloseFile(F);
end;


 
han_malign ©   (2008-04-24 10:35) [10]

Lock/Unlock

> New(BufByte); SetLength(BufByte^,BufSize*etkData.ES);
- а вот нахрена выделять два буфера, ссылку на которые потом теряешь???

Темна вода в облацех...


 
icWasya ©   (2008-04-24 10:36) [11]

//New(BufByte); SetLength(BufByte^,BufSize*etkData.ES); Выкинуть
try
BufByte := VarArrayLock(buf);
BlockRead(F,bufbyte^[0],etkData.ES*BufSize,code);
...
finally
 VarArrayUnLock(buf);
end;

//Dispose(BufByte);   и это выкинуть
CloseFile(F);
end;


 
K   (2008-04-24 11:18) [12]

finally
VarArrayUnLock(buf);
end;

Так и есть в программе, я неправильно написала в посте. Все равно вылетает


 
Сергей М. ©   (2008-04-24 12:53) [13]


> K   (24.04.08 11:18) [12]


Нафих тебе этот вариантный массив сдался - ума не приложить)

Чем плох тот же GetMem ?


 
han_malign ©   (2008-04-24 13:41) [14]


> Все равно вылетает

- птому и вылетает, что пытаешься внутренний буфер варианта убить...
поэтому смотри:  
> icWasya ©   (24.04.08 10:36) [11]
> //Dispose(BufByte);   и это выкинуть


 
Palladin ©   (2008-04-24 13:43) [15]


> Ёжик   (23.04.08 17:40) [7]

причем тут недопил, у меня в IE кукисы сломались, отвечал на вопрос в Основной, спросили пароль на авторизацию из страницы из кеша прокси, соответсвенно и пост взялся из прокси и продублировался


 
Ёжик   (2008-04-24 13:48) [16]

>Palladin ©   (24.04.08 13:43) [15]
Меня смутила разница во времени (полчаса) двух одинаковых постов. Прошу извинить, если был не прав.



Страницы: 1 вся ветка

Текущий архив: 2008.05.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
2-1209224503
No_Dead
2008-04-26 19:41
2008.05.25
Почему выдается не правильный размер файла:(


2-1209004477
Petya
2008-04-24 06:34
2008.05.25
Создание запроса в MS SQL


2-1208972960
Alexey
2008-04-23 21:49
2008.05.25
Собственное окно отчёта в Delphi


2-1209537222
MZG
2008-04-30 10:33
2008.05.25
Ведение лога


2-1209897634
AndrewG
2008-05-04 14:40
2008.05.25
Excel