全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2749
推到 Plurk!
推到 Facebook!

取记录Record的问题

答題得分者是:littlestone08
own_delphi
一般會員


發表:1
回覆:6
積分:1
註冊:2008-05-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-05 21:37:40 IP:114.85.xxx.xxx 訂閱
记录类型为 delphi
SegmentContentInfoTag = record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : array[0..1024-1] of char;
end;
pSegmentContentInfoTag = ^SegmentContentInfoTag;

C 原型结构
typedef struct SegmentContentInfoTag
{
unsigned int nSegmentIndex;
int nConentId;
int nNoteIndex;
int nDataLen;
char *pdata;
} SegmentContentInfo;


我写的循环取数据如下:
第一个取出没有问题,但是下一个就无法获取
function GetSegment(aContentID : integer): Boolean;
var
SegInfo : pSegmentContentInfoTag;
nSegmentNumber : pinteger;
iNumber,i,j,iSeg : integer;
bSeg : Boolean;
s,sall : String;
seg : pchar;
iDataLen : integer;
begin
new(nSegmentNumber);
SegInfo := AllocMem (1024*2);
iDataLen := 0;
bSeg := GetContentInfo(aContentID,nSegmentNumber,SegInfo);//Dll中C的方法,
if (bSeg) then
begin
iNumber := nSegmentNumber^;
for i:= 1 to iNumber do
begin
iSeg := SegInfo^.nDataLen;
for j :=0 to iSeg-1 do
begin
s := SegInfo^.pdata[j];
sall := sall s;
end;
sall := Copy(sall,1,iSeg);

inc(SegInfo,4);//这里有问题
end;

end;
Dec(SegInfo, iNumber*4);
FreeMem(SegInfo, 1024*2);
dispose(nSegmentNumber);
end;
編輯記錄
own_delphi 重新編輯於 2009-05-05 21:39:16, 註解 無‧
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-11 19:40:10 IP:203.186.xxx.xxx 訂閱
請問GetContentInfo需要uses什麼
根據原意,簡化為
SegmentContentInfoTag = record
nSegmentIndex,nConentId,nNoteIndex,nDataLen : integer;
pdata : array[0..1024-1] of char;
end;
pSegmentContentInfoTag = ^SegmentContentInfoTag;
//我寫的循環取數據如下:
//第一個取出沒有問題,但是下一個就無法獲取
function GetSegment(aContentID : integer): Boolean;
var
SegInfo : pSegmentContentInfoTag;
iNumber,i : integer;
sall : String;
seg : pchar;
begin
SegInfo := AllocMem (1024*2);
if GetContentInfo(aContentID,@iNumber,SegInfo) then //Dll中C的方法,
for i:= 1 to iNumber do
begin
sall := Copy(sall string(pchar(SegInfo^.pdata)),1,SegInfo^.nDataLen);
inc(SegInfo,4);//這裡有問題
end;
Dec(SegInfo, iNumber*4);
FreeMem(SegInfo, 1024*2);
end;


(完全相等於樓主代碼,雖然我不知道能否執行=])

首先,最大的問題是
SegInfo := AllocMem (1024*2);
在delphi中,很怪,可能在c中是很平常
你是想寫 new(SegInfo); 對吧~

而然,何謂inc(SegInfo,4); 請問你想做什麼?我推斷你想取得下一個integer的值,應該是ok的
但這樣,程式就會很奇怪了

你能否解釋一下原理?
編輯記錄
roviury 重新編輯於 2009-05-11 19:55:58, 註解 無‧
roviury 重新編輯於 2009-05-11 19:56:56, 註解 無‧
pcplayer99
尊榮會員


發表:142
回覆:738
積分:591
註冊:2003-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-15 11:24:28 IP:58.60.xxx.xxx 訂閱
inc(SegInfo,4);//这里有问题 ---- 这句是什么意思?把指针指向下一个 RECORD ?那为什么是 4 呢?
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-15 16:00:26 IP:60.250.xxx.xxx 訂閱
Hello own_delphi

1.你可以看看 Delphi 如何設定 【函式回傳值】的方法
我看你的 GetSegment 函式似乎沒有回傳值
2.GetContentInfo 的函式意義為何??? ,是你自訂的 dll 函式嗎??
3.事實上 delphi 會自動回收記憶體,若大量運算下,如幾十萬筆資料,手動回收、配置記憶體是顯得有效率,相對地撰寫、維護的時間就增長
===================引 用 own_delphi 文 章===================
记录类型为 delphi
SegmentContentInfoTag = record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : array[0..1024-1] of char;
end;
pSegmentContentInfoTag = ^SegmentContentInfoTag;

C 原型结构
typedef struct SegmentContentInfoTag
{
unsigned int nSegmentIndex;
int nConentId;
int nNoteIndex;
int nDataLen;
char *pdata;
} SegmentContentInfo;


我写的循环取数据如下:
第一个取出没有问题,但是下一个就无法获取
function GetSegment(aContentID : integer): Boolean;
var
SegInfo : pSegmentContentInfoTag;
nSegmentNumber : pinteger;
iNumber,i,j,iSeg : integer;
bSeg : Boolean;
s,sall : String;
seg : pchar;
iDataLen : integer;
begin
new(nSegmentNumber);
SegInfo := AllocMem (1024*2);
iDataLen := 0;
bSeg := GetContentInfo(aContentID,nSegmentNumber,SegInfo);//Dll中C的方法,
if (bSeg) then
begin
iNumber := nSegmentNumber^;
for i:= 1 to iNumber do
begin
iSeg := SegInfo^.nDataLen;
for j :=0 to iSeg-1 do
begin
s := SegInfo^.pdata[j];
sall := sall s;
end;
sall := Copy(sall,1,iSeg);

inc(SegInfo,4);//这里有问题
end;

end;
Dec(SegInfo, iNumber*4);
FreeMem(SegInfo, 1024*2);
dispose(nSegmentNumber);
end;
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-05-15 16:05:02, 註解 無‧
AndrewK 重新編輯於 2009-05-15 16:07:52, 註解 無‧
own_delphi
一般會員


發表:1
回覆:6
積分:1
註冊:2008-05-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-05-17 14:06:47 IP:58.34.xxx.xxx 訂閱
inc(SegInfo,4);//这里有问题
这个的确是取下一个record,每个Record占有4*4个字节,我是这么理解的,
用inc(Seginfo)有问题
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-05-18 09:16:35 IP:60.250.xxx.xxx 訂閱
SegmentContentInfoTag =  record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : array[0..1024-1] of char;
end;

1.此 record 占 1040個 byte
若 inc(seginfo,4) 可執行
試試 inc(seginfo,260 1)

2.若每个Record占有4*4个字节,才是你的需求
試試 inc(seginfo,5) 看看

3.檢查看看 SegInfo := AllocMem (1024*2);

4.是否能提供完整的測試程式下載,GetContentInfo 函式,無法得知相關資訊

===================引 用 own_delphi 文 章===================
inc(SegInfo,4);//这里有问题
这个的确是取下一个record,每个Record占有4*4个字节,我是这么理解的,
用inc(Seginfo)有问题
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
own_delphi
一般會員


發表:1
回覆:6
積分:1
註冊:2008-05-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-05-18 23:28:04 IP:116.225.xxx.xxx 訂閱
非常感谢各位的帮助
SegmentContentInfoTag = record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : array[0..1024-1] of char;
end;
pSegmentContentInfoTag = ^SegmentContentInfoTag;
如果改为
SegmentContentInfoTag = record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : array of char;
end;
pSegmentContentInfoTag = ^SegmentContentInfoTag;
又将如何获取?再次感谢大家
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-05-19 11:23:52 IP:60.250.xxx.xxx 訂閱
Hello 

聽你說話的方式,已可執行兩次沒問題

是否可禮貌性回答大家對你的程式,所問的問題呢??

** array of char 此為動態陣列之宣告方式
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-05-19 13:16:46 IP:203.186.xxx.xxx 訂閱
非常可笑的說
我們沒有人說過問題在於array of char
是在於他本人
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-05-19 15:18:11 IP:60.250.xxx.xxx 訂閱
Hello 

若程式已執行沒有問題
是否可說明 GetContentInfo 函式之意義呢
或是提供範例程式及 dll 檔來了解,亦或是你口述說明一下
對此甚感與趣,此亦為禮貌性回覆~

array of char 為動態 array
你的問題,如何獲取
1.如要獲取下一個 record ,用 設定動態 array 的函式,再依設定的 array 大小重新計算 record 所占的 byte
2.若你要獲取 record 中的 array of char 陣列,相同的使用 【設定動態 array 的函式】後,直接呼叫即可

可以從 ktop 網站中,搜尋到更多有關動態 array 之相關用法

===================引 用 AndrewK 文 章===================
Hello

聽你說話的方式,已可執行兩次沒問題

是否可禮貌性回答大家對你的程式,所問的問題呢??

** array of char 此為動態陣列之宣告方式
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
own_delphi
一般會員


發表:1
回覆:6
積分:1
註冊:2008-05-29

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-05-19 19:54:04 IP:116.225.xxx.xxx 訂閱
感谢各位的回复,
说明一下,我现在主要是研发一个文章读写器,C 用于研发文章的内容格式等保存信息,delphi用于研发客户端的一个展示,我提出的问题其实没有得到解决,呵呵,我用了较为笨的办法,传参数,读取数据而已,array of char,和array of pchar,我只是一时的想法,觉得如果是动态的字符数组可能可以实现文章中段的自动伸展而已,GetContentInfo是我写在VC 中的一个DLL的方法而已,其实不值一提,就是获取文章内容,然后根据文章的内容,逐个获取内容的段而已。
own_delphi
一般會員


發表:1
回覆:6
積分:1
註冊:2008-05-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-05-19 20:00:34 IP:116.225.xxx.xxx 訂閱
我的Record中的声明已经明确表示,关于这个我试一下,主要是要理解里面的意思,因为我对Record还是有点不大理解,原以为record只能表示定长的数据,因此我以为用array of char可能是不可以的。存数据好存,取数据比较困难。
===================引 用 AndrewK 文 章===================
SegmentContentInfoTag = record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : array[0..1024-1] of char;
end;

1.此 record 占 1040個 byte
若 inc(seginfo,4) 可執行
試試 inc(seginfo,260 1)

2.若每个Record占有4*4个字节,才是你的需求
試試 inc(seginfo,5) 看看

3.檢查看看 SegInfo := AllocMem (1024*2);

4.是否能提供完整的測試程式下載,GetContentInfo 函式,無法得知相關資訊

===================引 用 own_delphi 文 章===================
inc(SegInfo,4);//这里有问题
这个的确是取下一个record,每个Record占有4*4个字节,我是这么理解的,
用inc(Seginfo)有问题
littlestone08
一般會員


發表:0
回覆:2
積分:5
註冊:2009-05-29

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-05-29 12:36:40 IP:60.0.xxx.xxx 訂閱

===================引 用 own_delphi 文 章===================
我的Record中的声明已经明确表示,关于这个我试一下,主要是要理解里面的意思,因为我对Record还是有点不大理解,原以为record只能表示定长的数据,因此我以为用array of char可能是不可以的。存数据好存,取数据比较困难。
===================引 用 AndrewK 文 章===================
SegmentContentInfoTag = record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : array[0..1024-1] of char;
end;

1.此 record 占 1040個 byte
若 inc(seginfo,4) 可執行
試試 inc(seginfo,260 1)

2.若每个Record占有4*4个字节,才是你的需求
試試 inc(seginfo,5) 看看

3.檢查看看 SegInfo := AllocMem (1024*2);

4.是否能提供完整的測試程式下載,GetContentInfo 函式,無法得知相關資訊

===================引 用 own_delphi 文 章===================
inc(SegInfo,4);//这里有问题
这个的确是取下一个record,每个Record占有4*4个字节,我是这么理解的,
用inc(Seginfo)有问题
============
你的Record的声明有问题,对于"每个Record占有4*4个字节",你的理解也是错误的
如果你想转成与C相兼容的结构,应该用Array of char来声明。Inc(PRecord, 1),就是将指针移向下一个记录。

SegmentContentInfoTag = record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : array[0..1024-1] of char;
end;


这样的声明实际上占用的内存大小为:SizeOf(Integer) * 4 SizeOf(: array[0..1024-1] of char) = 1024 4 * 4;
要查看记录大小直接用SizeOf(SegmentContentInfoTag)就可以;
要移向下一条记录,用Inc(PRecord)就可以,但是前提是PRecrod是有类型的指针

试声明为


SegmentContentInfoTag = record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : array of Char;
end;

SegmentContentInfoTag = record
nSegmentIndex : integer;
nConentId : integer;
nNoteIndex : integer;
nDataLen : integer;
pdata : String;
end;
因为String类型是自动内存管理的,会方便些,用的时候Setlength为合适的大小就可以了,不用显式释放
下一条记录依然用Inc(PRecord, 1)

編輯記錄
littlestone08 重新編輯於 2009-05-29 12:38:45, 註解 無‧
littlestone08 重新編輯於 2009-05-29 12:39:11, 註解 無‧
own_delphi
一般會員


發表:1
回覆:6
積分:1
註冊:2008-05-29

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-05-30 01:14:39 IP:116.225.xxx.xxx 訂閱
为何只有一个得分人?
系統時間:2017-10-24 9:52:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!