![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Считывание 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