Главная страница
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.019 c
14-43772
Beria
2004-02-17 06:49
2004.03.14
С чего начать делать игру? - КОНЕЧНО С ВЫБОРА СРЕДЫ!!


1-43555
Александр1
2004-02-27 16:45
2004.03.14
РАБОТА С StringGrid?????


1-43506
td
2004-02-28 11:42
2004.03.14
Excel Application


1-43611
$tranger
2004-03-02 16:49
2004.03.14
Работа с StringTable


14-43851
Undert
2004-02-19 18:58
2004.03.14
Как в HTML сделать SpinEdit ?