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

Вниз

ошибка при записи в динамический массив   Найти похожие ветки 

 
Мыш ©   (2004-02-29 18:27) [0]

Подскажите пожалуйста, почему возникает ошибка в случае использования динамического массива в следующем примере чтения и записи bitmap в файл:
[code]
procedure TLinkStorage.Load(filename: string);
var
f:file;
buff:array [0..4] of byte;
bmpBuff:array [0..65555] of byte;
bmpSize:integer;
m:TMemoryStream;
begin
m:=TMemoryStream.Create;
Assign(f,filename);
FileMode := fmOpenRead;
Reset(F, 1);
blockread(f,buff,4);
bmpSize:=bytestoint(buff);
//setlength(bmpBuff,bmpSize);
blockread(f,bmpBuff,bmpSize);
m.SetSize(bmpSize);
m.Position:=0;
m.Write(bmpBuff,bmpSize);
m.Position:=0;
form1.Image2.Picture.Bitmap.LoadFromStream(m);
CloseFile(F);
m.Free;
end;

procedure TLinkStorage.Save(filename: string);
var
f:file;
PLink:TPLink;
m:TMemoryStream;
buff:array [0..3] of byte;
bmpBuff:array [0..65535] of byte;
bmpSize:integer;
begin
Assign(f,filename);
FileMode := fmOpenWrite;
Rewrite(F, 1);
m:=TMemoryStream.Create;
image.picture.bitmap.SaveToStream(m);
bmpSize:=m.position;
//setlength(bmpBuff,bmpSize);
m.Position:=0;
m.Read(bmpBuff,bmpSize);
inttobytes(bmpSize,buff);
blockwrite(f,buff,4);
blockwrite(f,bmpBuff,bmpSize);
CloseFile(F);
m.Free;
end;
[code]
Если обявить массив bmpBuff без указания длины, а устанвливать длину setlength(bmpBuff,bmpSize), возникает ошибка. Можете проверить у себя, нужно только кинуть две картинки на форму.


 
Anatoly Podgoretsky ©   (2004-02-29 18:31) [1]

Динамических массивов не наблюдается, а об ошибке приходится только догадывать, я конечно понимаю, что это топ-секрет, но не до такой же степени.


 
мыш ©   (2004-02-29 19:50) [2]

Это я уже переделал, динамическим был массив - bmpBuff:array [0..65535] of byte; только без [0..65535] естественно.
А топ секрет в строке blockread(f,bmpBuff,bmpSize); - я сейчас уже не помню, что там было написано, но сложилось впечатление, что setlength не устанавливает размер (хотя это не так, при подведении курсора определялось, что массив есть и размер подходящий.


 
Klev   (2004-02-29 21:30) [3]

Ну может быть надо сделать не Setlength а нечто вроде Getmem.

Type
ARRAY1 = array of Byte;
....
var a:array1;
N:Dword; // число элементов массива
begin
N:=1000;
getmem(a,sizeof(Byte)*N);
Zeromemory(a,sizeof(Byte)*N);
end;

Для изменения длины массива надо сделать примерно следующее:

Function Changesz(a:array1;oldsz,newsz:Dword):bool;
var a1:array1;
begin
getmem(a1,sizeof(Byte)*newsz);
Zeromemory(a1,sizeof(Byte)*newsz);
copymemory(a,a1,oldsz);
freemem(a,oldsz);
getmem(a,sizeof(Byte)*Newsz);
Zeromemory(a,sizeof(Byte)*Newsz);
copymemory(a1,a,oldsz);
freemem(a1,newsz);
if getlasterror<>0 then result:=false else result:=true;
end;

Выше приведенный код теоретически должен работать правильно, но возможны некоторые ошибки.


 
Германн ©   (2004-02-29 21:34) [4]

Вместо m.Read(bmpBuff,bmpSize);
попробуй m.Read(bmpBuff[0],bmpSize);



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

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

Наверх




Память: 0.47 MB
Время: 0.027 c
14-43820
Alex Konshin
2004-02-21 23:10
2004.03.14
Средний класс в Америке


3-43295
ViJen
2004-02-12 10:05
2004.03.14
транзакция и индексы в Dbase


3-43313
orger
2004-02-17 10:46
2004.03.14
Индексные поля


1-43591
Cherepah
2004-02-27 11:15
2004.03.14
Иконка для компонента


1-43568
ghg
2004-01-23 13:25
2004.03.14
matlab и Delphi