Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.25;
Скачать: [xml.tar.bz2];

Вниз

Считывание 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.007 c
4-1189364060
Rimd
2007-09-09 22:54
2008.05.25
enumWindows & EnumChildWindows


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


2-1209658341
programmer9090
2008-05-01 20:12
2008.05.25
Удаление выделеного текста в RichEdit


2-1209118164
Petya
2008-04-25 14:09
2008.05.25
Вопрос по DBGrid


2-1209555980
ekto
2008-04-30 15:46
2008.05.25
WebBrowser. передача PostData





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский