type
TFunc = function:integer;
type
PFuncTbl = ^TFuncTbl;
TFuncTbl = record
sTest:string;
end;
var
Test1Tbl:array [0..2-1] of TFunc = (
('sample1'),
('sample2')
);
pTbl:PFuncTbl;
--------------------------------------
pTbl := @Test1Tbl; //テーブル1をセット
//Test1Tbl[0]にアクセスするには、
ShowMessage(pTbl^.sTest);
//とする。
//Test1Tbl[1]にアクセスする方法がわかりません。
//(pTbl+1)^;
//ではダメでした。どうするのでしょう?
追加発言です。
pTbl := @Test1Tbl;
とした後に
Inc(pTbl);
とすれば、2番目の要素にアクセスできました。
順番にアクセスする場合には問題なさそうですが、
0番目の次に3番目にアクセスしたいなんていう場合はどうするのでしょうか?
度々すみません、
Inc()を使ってしまうと結構使いづらいので、
やっぱり+○○のような簡単な方法があったら教えてください。
放置プレイにしようかと思ったけど、
質問がなんなのか、わからないです。
Delphiのバージョンなども書かれていなし。
D7で最初の発言をコピペしましたが、
> Test1Tbl:array [0..2-1] of TFunc = (
> ('sample1'),
> ('sample2')
> );
ここでエラーになりました。
推測ですけど、レコード配列のランダムアクセスがしたい
って事でよければポインタ云々って考えなくていいです。
Type
PFuncTbl = ^TFuncTbl;
TFuncTbl = record
sTest:string;
end;
Var
Test1Tbl:array [0..2] of TFuncTbl = (
(sTest:'sample0'),
(sTest:'sample1'),
(sTest:'sample2')
);
procedure TForm1.Button1Click(Sender: TObject);
Var
I: Integer;
begin
//Test1Tbl[0]にアクセスするには、
I := 0;
ShowMessage(Test1Tbl[i].sTest);
//Test1Tbl[2]にアクセスするには、
Inc(i, 2);
ShowMessage(Test1Tbl[i].sTest);
end;
ポインタを使っても配列をそのまま使っても、速度は変わりません。
昔のコンパイラは、ポインタを使用することで高速化を図ることができましたが、今のコンパイラは配列もポインタもほぼ同じコードを出力します。
下手にポインタにして計算量を増やすより、コンパイラに任せた方が早いです。
# 全てアセンブラで記述するなら別ですが
勉強のためポインタを使用するというのであれば、
var
p: PFuncTbl;
begin
P := @Test1Tbl;
ShowMessage(PFuncTbl(Cardinal(p)+SizeOf(TFuncTbl)*0)^.sText);
ShowMessage(PFuncTbl(Cardinal(p)+SizeOf(TFuncTbl)*1)^.sText);
end;
こんな感じでできます。
ツイート | ![]() |