Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
1-43441
Ivan
2004-03-01 09:24
2004.03.14
Как программно перенести табличку из StringGrid в Excel?


14-43800
NeyroSpace
2004-02-19 13:58
2004.03.14
MicroSoft ISA


14-43749
Nick Demry
2004-02-24 16:18
2004.03.14
Как из под Линукс залесть в чат?


1-43518
rezak
2004-02-28 18:35
2004.03.14
вопрос с лабелом


14-43826
военнообязанный
2004-02-21 20:47
2004.03.14
Идти на военную кафедру или нет?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский