Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
Внизошибка при записи в динамический массив Найти похожие ветки
← →
Мыш (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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.012 c