Главная страница
    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.013 c
1-43657
exp
2004-03-01 20:47
2004.03.14
Передача в процедуру двумерного массива


14-43850
Кен
2004-02-20 05:16
2004.03.14
А не проголосовать ли за Малышкина ? По приколу. Он смешной.


1-43661
European
2004-02-24 19:32
2004.03.14
Метки по оси Y в TChart


6-43743
Scordion
2004-01-03 19:17
2004.03.14
Посоветуйте компонент для скачивания файлов!


14-43864
DCoder
2004-02-21 13:50
2004.03.14
Запись DVD на CD-RW





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