線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2963
推到 Plurk!
推到 Facebook!

請問如使用MemoryStream將資料存入自訂的記憶體空間?

缺席
anumis
一般會員


發表:25
回覆:27
積分:15
註冊:2006-07-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-13 14:42:51 IP:61.218.xxx.xxx 訂閱

[code delphi]
var
pmem :TMemoryStream
pSpace :Pointer
begin
pmem := TMemoryStream.Create;

pmem.LoadFromFile(...);
pmem.Position := 0;

pSpace := AllocMem(pmem.Size)

//pmem.Read(pSpace, pmem.Size); <- 會出錯
pmem.Read(pSpace, SizeOf(pSpace)); <- 正確

FreeMem(pSpace); <- 會出錯
FreeAndNil(pmem);
end;
[/code]

請問是我的記憶體觀念有錯嗎?

先AllocMem 一個大小為pMem.Size的空間
再使用pMem.Read把串流寫入
最後再使用FreeMem釋放

感謝 m(_ _)m
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-13 15:45:37 IP:61.59.xxx.xxx 訂閱
  1. var
  2. pmem :TMemoryStream
  3. pSpace :Pointer
  4. begin
  5. pmem := TMemoryStream.Create;
  6. pmem.LoadFromFile(...);
  7. pmem.Position := 0;
  8. pSpace := AllocMem(pmem.Size)
  9. //pmem.Read(pSpace, pmem.Size); <- 會出錯
  10. pmem.Read(pSpace, SizeOf(pSpace)); <- 正確 SizeOf(pSpace) =>只有4byte 的長度而已..指標只不是指 MemoryStream 多長多大,它就多長多大,它只有 4byte .是用來記錄 "位址"用的,
  11. FreeMem(pSpace); <- 會出錯
  12. FreeAndNil(pmem);
  13. end;
------
叔叔有練過,初學者不要學。
anumis
一般會員


發表:25
回覆:27
積分:15
註冊:2006-07-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-14 09:31:46 IP:61.218.xxx.xxx 訂閱
指標的地方是我自己搞混了,忘了它就只是個"指標"  <囧"

程式碼也搞定了

var
pmem :TMemoryStream;
pSpace :Pointer;
pSpacePtr :PByteArray;
begin
pmem := TMemoryStream.Create;
pmem.LoadFromFile('C:\a3.bmp');
pmem.Position := 0;
pSpace := AllocMem(pmem.Size);
pSpacePtr := pSpace;

pmem.Read(pSpacePtr[0], pmem.Size);

FreeMem(pSpace);
FreeAndNil(pmem);
end;
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-14 10:03:59 IP:122.116.xxx.xxx 訂閱
用[缺席]結案? 沒有弄錯?
chih_kuan前輩已指出原文的問題,為何是[缺席]
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-14 11:47:21 IP:61.59.xxx.xxx 訂閱
看來得弄一個機制,連續發問,但得分者老是 "缺席" 幾次的..就暫停行使會員相關權利,以杜絕一些老是只想"不勞而獲"的人
------
叔叔有練過,初學者不要學。
anumis
一般會員


發表:25
回覆:27
積分:15
註冊:2006-07-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-14 12:30:45 IP:61.218.xxx.xxx 訂閱
那應該是定義不同吧?

這個問題是問"怎麼把MemoryStream存入自訂的記憶體空間"

而後來我把 "MemoryStream的內容,存到自己Allocmem的記憶體裡"給做出來

也把code 放上來,而chih_kuan前輩給的答案沒有解掉我的問題
(我後來Po的code跟他給的答案沒有關連)

所以我才給缺席

如果不妥,那就把分數給他
===================引 用 taishyang 文 章===================
用[缺席]結案? 沒有弄錯?
chih_kuan前輩已指出原文的問題,為何是[缺席]
編輯記錄
anumis 重新編輯於 2009-08-14 12:47:29, 註解 無‧
anumis 重新編輯於 2009-08-14 12:49:10, 註解 無‧
anumis
一般會員


發表:25
回覆:27
積分:15
註冊:2006-07-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-14 12:35:37 IP:61.218.xxx.xxx 訂閱

我有po code出來,並沒有不勞而獲吧 (拉椅子座下)

又不是沒回覆,自己暗幹下來

而且這個問題我是看bmp->Scanline才解掉的...

麻煩用詞可以"溫柔"點嗎?

[修改內容]

http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=99104

我是在這個寫這個程式時找到方法解的



應該是我們之間對"給分"這個動作的定義不同,所以有衝突

===================引 用 chih_kuan 文 章===================
看來得弄一個機制,連續發問,但得分者老是 "缺席" 幾次的..就暫停行使會員相關權利,以杜絕一些老是只想"不勞而獲"的人
編輯記錄
anumis 重新編輯於 2009-08-14 12:45:26, 註解 無‧
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-08-14 13:52:25 IP:61.59.xxx.xxx 訂閱
請問是我的記憶體觀念有錯嗎? ==> 就是因為這一問句,所以我才針對指標的部份,給予我的一些看法,我想..我自認為針對你的問句,有在關鍵點給予最適切的提醒,,剩下的,就由你自己去努力(如同你自己說你是自己想出來的)
只不過你所習得的,似乎是有點繞路的做法
var
pmem :TMemoryStream;
pSpace :Pointer; =>存放位址的指標
pSpacePtr :PByteArray; =存放位址的指標(只不過必須存放 ByteArray type 的位址)
begin
pmem := TMemoryStream.Create;
pmem.LoadFromFile('C:\a3.bmp');
pmem.Position := 0;
pSpace := AllocMem(pmem.Size); ==> 建立一塊記憶體空間,把起始位址記錄在 pSpace 這個指標變數
pSpacePtr := pSpace; => 而 pSpacePtr = pSpace //老實說.我不懂這一句繞路的指令,意義何在 ?

pmem.Read(pSpacePtr[0], pmem.Size); ==>從 MemoryStream 讀取pmem.Size 長度的資料,並將其從pSpacePtr[0]這個位址開始塞入

FreeMem(pSpace);
FreeAndNil(pmem);
end;

不是我不對你的問題做更適切的回應,你也在標題中提及 請問如使用MemoryStream將資料存入自訂的記憶體空間?
那什麼叫 "自訂的記憶體空間".我想是 "自己的貯存結構吧?,那又是什麼咧?...直到你第二次回PO,人家才知道原來是 ByteArray,
又,,用ByteArray 就一定適當嗎??,你可曾想過ByteArray 最大容量多大?,當檔案大過這限制時,會不會有載圖不完全的問題?.該如何克服?
這些是我自己個人純粹經驗上的一些看法,僅供你參考參考,
至於結案給分的事情,,就讓它過去吧,
------
叔叔有練過,初學者不要學。
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-08-14 14:15:17 IP:122.116.xxx.xxx 訂閱
to chih_kuan:
觀察過
anumis的發問,他不是屬於這類的網友 ^_^

to
anumis:
個人覺得至少該對chih_kuan說聲謝謝(良好的互動),不然答題者會有自討沒趣的感覺 ^^|




===================引 用 chih_kuan 文 章===================
看來得弄一個機制,連續發問,但得分者老是 "缺席" 幾次的..就暫停行使會員相關權利,以杜絕一些老是只想"不勞而獲"的人
編輯記錄
taishyang 重新編輯於 2009-08-14 14:19:53, 註解 無‧
anumis
一般會員


發表:25
回覆:27
積分:15
註冊:2006-07-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-08-14 14:31:01 IP:61.218.xxx.xxx 訂閱

會問這個問題是因為我現在在用影像擷取卡,而該卡片沒有批次取像功能

所以我才想自己AllocMem 一塊 Memory來當做暫存,所以才稱做"自訂的記憶體空間" (說結構也算,因為是要拿來存RAW 的row)

其實我對指標跟記憶體的操作,全都是自己邊看文章,邊寫程式學會的

所以一開始您的回答,對我來說,只是知道錯誤發生的原因,而無法聯想到解決的作法

最後還是看Bitmap.Scanline去聯想出來,但是又無法對上您給的提示,所以才沒有給分

指令繞路的問題,如同前面所說,我都是try and error的方式找解決方法,try到complier能過,跑出來的值又正確,對我來說就可以用了
剩下的,就等case 完成,需要最佳化時再來修

PByteArray的Size,現在處理的case 就固定是1024 8 ,所以就沒去考慮了


因為發文言不及義,導致chih_kuan前輩及副站長出面,感到萬分抱歉 m(_ _)m

===================引 用 chih_kuan 文 章===================
請問是我的記憶體觀念有錯嗎? ==> 就是因為這一問句,所以我才針對指標的部份,給予我的一些看法,我想..我自認為針對你的問句,有在關鍵點給予最適切的提醒,,剩下的,就由你自己去努力(如同你自己說你是自己想出來的)
只不過你所習得的,似乎是有點繞路的做法
var
pmem :TMemoryStream;
pSpace :Pointer; =>存放位址的指標
pSpacePtr :PByteArray; =存放位址的指標(只不過必須存放 ByteArray type 的位址)
begin
pmem := TMemoryStream.Create;
pmem.LoadFromFile('C:\a3.bmp');
pmem.Position := 0;
pSpace := AllocMem(pmem.Size); ==> 建立一塊記憶體空間,把起始位址記錄在 pSpace 這個指標變數
pSpacePtr := pSpace; => 而 pSpacePtr = pSpace //老實說.我不懂這一句繞路的指令,意義何在 ?

pmem.Read(pSpacePtr[0], pmem.Size); ==>從 MemoryStream 讀取pmem.Size 長度的資料,並將其從pSpacePtr[0]這個位址開始塞入

FreeMem(pSpace);
FreeAndNil(pmem);
end;

不是我不對你的問題做更適切的回應,你也在標題中提及 請問如使用MemoryStream將資料存入自訂的記憶體空間?
那什麼叫 "自訂的記憶體空間".我想是 "自己的貯存結構吧?,那又是什麼咧?...直到你第二次回PO,人家才知道原來是 ByteArray,
又,,用ByteArray 就一定適當嗎??,你可曾想過ByteArray 最大容量多大?,當檔案大過這限制時,會不會有載圖不完全的問題?.該如何克服?
這些是我自己個人純粹經驗上的一些看法,僅供你參考參考,
至於結案給分的事情,,就讓它過去吧,
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-10-26 15:05:40 IP:59.125.xxx.xxx 訂閱
就小弟所知,溫文有理的人,就算他人的幫助沒有實質的好處,甚至於幫倒忙時,也仍會說聲謝謝,感謝對方的「這份心」
同時也宣示「我是一個很有禮貌的人」
所以,說聲謝謝,其實好處很多,不只是讚美對方,其實誇耀自己虛懷若古的成分更大

反過來說,因為認為對方沒有助益,而覺得或不願說聲謝的,多半是在宣告世人說自己其實是個「混蛋」
(因為先求助的是自己,可不是別人沒事雞婆而來,更不用說網際網路,誰都可以發表看法,可以接受,也可以不理、若否定,就是想要挑戰,如此,結果莫怪人)

以上是感想沒有特定說是誰

至於不勞而獲,我是覺得 anumis 應該沒有這方面的狀況,因為他已經做過 (將程式寫出來),只是有問題而已
而且他也會說道歉... 之類的,可見禮貌也很好

到是,提供另一種看法,大家參考看看
反正要結案,而且這裡的積分,又不能換現金,多給一點又何妨,給誰也都沒差,要是我,就隨便選一個

沒辦法決定時,那就寫程式亂數選一下吧!還可以順便練習練習 ~

因為討論程式問題,產出有用的資訊,小弟覺得比,討論結案者是誰,有趣也有用多了

小小意見,參考參考

PS. 哪天,積分可以換現金時,可別忘了通知我,我可要好好來衝積分一下,6_< (這是本文重點)



===================引 用 anumis 文 章===================

會問這個問題是因為我現在在用影像擷取卡,而該卡片沒有批次取像功能

所以我才想自己AllocMem 一塊 Memory來當做暫存,所以才稱做"自訂的記憶體空間" (說結構也算,因為是要拿來存RAW 的row)

其實我對指標跟記憶體的操作,全都是自己邊看文章,邊寫程式學會的

所以一開始您的回答,對我來說,只是知道錯誤發生的原因,而無法聯想到解決的作法

最後還是看Bitmap.Scanline去聯想出來,但是又無法對上您給的提示,所以才沒有給分

指令繞路的問題,如同前面所說,我都是try and error的方式找解決方法,try到complier能過,跑出來的值又正確,對我來說就可以用了
剩下的,就等case 完成,需要最佳化時再來修

PByteArray的Size,現在處理的case 就固定是1024 8 ,所以就沒去考慮了


因為發文言不及義,導致chih_kuan前輩及副站長出面,感到萬分抱歉 m(_ _)m

===================引 用 chih_kuan 文 章===================
請問是我的記憶體觀念有錯嗎? ==> 就是因為這一問句,所以我才針對指標的部份,給予我的一些看法,我想..我自認為針對你的問句,有在關鍵點給予最適切的提醒,,剩下的,就由你自己去努力(如同你自己說你是自己想出來的)
只不過你所習得的,似乎是有點繞路的做法
var
pmem :TMemoryStream;
pSpace :Pointer; =>存放位址的指標
pSpacePtr :PByteArray; =存放位址的指標(只不過必須存放 ByteArray type 的位址)
begin
pmem := TMemoryStream.Create;
pmem.LoadFromFile('C:\a3.bmp');
pmem.Position := 0;
pSpace := AllocMem(pmem.Size); ==> 建立一塊記憶體空間,把起始位址記錄在 pSpace 這個指標變數
pSpacePtr := pSpace; => 而 pSpacePtr = pSpace //老實說.我不懂這一句繞路的指令,意義何在 ?

pmem.Read(pSpacePtr[0], pmem.Size); ==>從 MemoryStream 讀取pmem.Size 長度的資料,並將其從pSpacePtr[0]這個位址開始塞入

FreeMem(pSpace);
FreeAndNil(pmem);
end;

不是我不對你的問題做更適切的回應,你也在標題中提及 請問如使用MemoryStream將資料存入自訂的記憶體空間?
那什麼叫 "自訂的記憶體空間".我想是 "自己的貯存結構吧?,那又是什麼咧?...直到你第二次回PO,人家才知道原來是 ByteArray,
又,,用ByteArray 就一定適當嗎??,你可曾想過ByteArray 最大容量多大?,當檔案大過這限制時,會不會有載圖不完全的問題?.該如何克服?
這些是我自己個人純粹經驗上的一些看法,僅供你參考參考,
至於結案給分的事情,,就讓它過去吧,
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2013-01-15 18:50:47 IP:210.66.xxx.xxx 未訂閱
本來是要 搜尋 BYTEARRAY  ..... 無意中看到這篇的對話

感覺很有意思 !!

工程人員的技術固然重要,數據清楚,0 與 1 不可混淆!

但是如果有一天, 您和異性朋友在花前月下賞花/賞月

當有人說 " 今晚的月亮好圓好美 " 時

若有人說........ "那有圓規畫的圓" 之類的,您感覺如何 ?

所以,...唉!

...我要說的是一種生活態度的感覺...

生活要有一點情趣,人生才不會無聊,縱然程式很會寫,但還有其它事情值得關心....對方的感受.

在台灣社會上,大部分人是有禮貌的,這是一種生活的文化資產.

謝謝您


------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
編輯記錄
ANDY8C 重新編輯於 2013-01-15 03:51:54, 註解 無‧
ANDY8C 重新編輯於 2013-01-15 03:54:21, 註解 無‧
ANDY8C 重新編輯於 2013-01-15 03:55:08, 註解 無‧
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#13 引用回覆 回覆 發表時間:2013-01-21 19:37:41 IP:220.134.xxx.xxx 訂閱
哈....三年前的事..就讓它過去吧....當時大家都年輕.....總會有...情緒的時候...總之...問題解決了就好了...^^
------
叔叔有練過,初學者不要學。
系統時間:2017-10-24 2:48:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!