2016-01-24 61 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需要longint。 – Malina

+0

寫入像素[0],然後釋放流以確保文件已關閉(操作系統可能仍在緩存)。 16位的東西不是這樣,FPC使用sizeint或longint來做這種事情。 –

回答

1

stream.write的第一個參數是一個所謂的形式參數,比如stream.write(const buf; size:integer)左右。

編譯器將傳遞給它的任何地址都提供給過程。因爲你在第一級使用一個沒有邊界的數組(數組數組),所以它是一個動態數組,因此是一個指針。

如果將數組傳遞給它,實際上會傳遞存儲指針的內存位置。解決方案:傳遞第一個元素,像素[0],這是數據的位置。