2016-01-24 4 views
0

Я использую метод записи для прямой записи pixels, который является array of array[(R, G, B)] of byte;. pixels правильно распределена следующим образом: setlength(pixels, 750000); , что я делаю это следующим образом:FileWrite не записывает все байты

f := TFileStream.create(FileName, fmCreate); 
written := f.write(pixels, 750000); 

Проблема заключается в том, что метод записи возвращает 0, а именно его не написать байт из pixels. С некоторых тестов, я обнаружил, что он копирует только до примерно 20000 байт, конечно, не более чем 30000, и момент я дать ему больше писать, это не .. и возвращает 0.


Я новичок в Pascal, но я не могу найти решение этой неприятной проблемы. Так что я делаю неправильно?

+0

Я никогда не использовал компилятор fpc, но я задаюсь вопросом, что такое подпись на tFileStream.Write - можно ли ожидать 16-битного целого? –

+0

@LorenPechtel Я не знаю. FPC заявляет: «Этот класс представляет собой инкапсуляцию системных процедур FileOpen, FileCreate, FileRead, FileWrite, FileSeek и FileClose, которые находятся в модуле SysUtils». Итак, FileWrite занимает много времени. – Malina

+0

пишите пиксели [0], а затем освободите поток, чтобы убедиться, что файл закрыт (ОС все еще может кэшировать). 16-битная вещь не в этом, FPC использует sizeint или longint для таких вещей. –

ответ

1

Первый параметр stream.write - это так называемый формальный параметр, такой как stream.write (const buf; size: integer) или так.

Компилятор передает адрес того, что вы передаете ему, и дает это процедуре. Поскольку вы используете массив без границ для первого уровня (массив массива ..), это динамический массив, поэтому указатель под капотом.

Если вы передадите массив, вы фактически передадите ячейку памяти, в которой хранится указатель. Решение: передать первый элемент, пиксели [0], который является местоположением данных.

Смежные вопросы