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

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

Считывание BlockRead`ом в вариантный массив [D5, D7, WinXP]


K ©   (2008-04-23 12:28:00) 

Такое возможно? Программа вылетает на втором 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;


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


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

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


Palladin   (2008-04-24 13:43:00) [2]


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

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


han_malign   (2008-04-24 13:41:00) [3]


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

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


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


> K   (24.04.08 11:18) [12]


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

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


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

finally
VarArrayUnLock(buf);
end;

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


icWasya   (2008-04-24 10:36:00) [6]

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

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


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

Lock/ Unlock

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

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


K   (2008-04-24 10:28:00) [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, bufbyte^[0],etkData.ES*BufSize,code);
 ...
finally
VarArrayLock(buf);
end;

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


K   (2008-04-24 10:26:00) [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,buf,etkData.ES*BufSize,code);
  ...
finally
 VarArrayLock(buf);
end;

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

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


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

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


Palladin   (2008-04-23 17:35:00) [11]

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


Palladin   (2008-04-23 17:04:00) [12]


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

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


Alarm   (2008-04-23 16:37:00) [13]

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


ZENsan   (2008-04-23 16:33:00) [14]

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


ZENsan   (2008-04-23 16:31:00) [15]

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


Palladin   (2008-04-23 12:34:00) [16]

VarArrayLock + F1


Наверх

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