構造体の配列をポインタ変数を利用してアクセスするには?


メロン  2004-10-14 20:47:30  No: 11388

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)^;
//ではダメでした。どうするのでしょう?


メロン  2004-10-14 21:03:19  No: 11389

追加発言です。
pTbl := @Test1Tbl;
とした後に
Inc(pTbl);
とすれば、2番目の要素にアクセスできました。
順番にアクセスする場合には問題なさそうですが、
0番目の次に3番目にアクセスしたいなんていう場合はどうするのでしょうか?


メロン  2004-10-14 21:07:59  No: 11390

度々すみません、
Inc()を使ってしまうと結構使いづらいので、
やっぱり+○○のような簡単な方法があったら教えてください。


bob  2004-10-15 03:15:07  No: 11391

放置プレイにしようかと思ったけど、
質問がなんなのか、わからないです。
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;


にしの  2004-10-15 19:40:56  No: 11392

ポインタを使っても配列をそのまま使っても、速度は変わりません。
昔のコンパイラは、ポインタを使用することで高速化を図ることができましたが、今のコンパイラは配列もポインタもほぼ同じコードを出力します。
下手にポインタにして計算量を増やすより、コンパイラに任せた方が早いです。
# 全てアセンブラで記述するなら別ですが

勉強のためポインタを使用するというのであれば、
var
  p: PFuncTbl;
begin
  P := @Test1Tbl;
  ShowMessage(PFuncTbl(Cardinal(p)+SizeOf(TFuncTbl)*0)^.sText);
  ShowMessage(PFuncTbl(Cardinal(p)+SizeOf(TFuncTbl)*1)^.sText);
end;
こんな感じでできます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加