喫茶XRAYトップページ

[スレッド全体
]

[13137] Re:Delphi 雑感返信 削除
2019/11/15 (金) 18:55:52 Mr.XRAY
▼ Mr.XRAYさん
> ポインタ関係と TList の記事とサンプルをかなり修正変更しました.

まだまだ続いています.

[ なんでポインタ演算ができないのよ(しくしく) ]
https://hp.vector.co.jp/authors/VA015850/delphi/tips/etc04.html

こういうことなのかな ?
よくわからんけど.
C のようにはいきませんね.ポインタを移動してから代入となるでしょう.

C の char がポインタ型だからと,Delphi で
   var
     P : ^Char;
とすると Char 型 (1 文字の文字型) のポインタ型の変数になってしまいます.


procedure TForm1.Button1Click(Sender: TObject);
var
  P : PChar;    // char *p 相当
  S : array[0..999] of Char;
begin
  StrCopy(S, 'Hello World');

  p := @S;
  Memo1.Lines.Add(P);

  P[5] := 'W';
  Inc(P, 5);
  Memo1.Lines.Add(P);
end;



[13138] Re2:Delphi 雑感返信 削除
2019/11/16 (土) 10:02:57 福士

[13139] Re3:Delphi 雑感返信 削除
2019/11/16 (土) 14:20:08 Mr.XRAY
▼ 福士さん
> {$POINTERMATH ON} でCっぽくできますね。
> http://docwiki.embarcadero.com/RADStudio/Rio/ja/Pointer_Math_%EF%BC%88Delphi%EF%BC%89


へぇー,こんなのがあるんですね.
知りませんでした.
PChar 型だとこんなことができるんですが.


procedure TForm1.Button1Click(Sender: TObject);
var
  LPChar : PChar;
begin
  Memo1.Lines.Clear;

  LPChar := '日本語テスト文字列';
  LPChar := LPChar + 6;

  Memo1.Lines.Add(LPChar);
end;



[13140] Re2:Delphi 雑感返信 削除
2019/11/16 (土) 14:30:59 Mr.XRAY
> C の char がポインタ型だからと,Delphi で

Delphi だと変数を宣言する時の変数の型の部分 (右側) で決まりますが,
C の場合は「型と変数名」で決まります.

char a       1 バイトの文字の変数
char b[10]   10 バイトの文字列の変数
char c[]      文字列の変数
char *d       ポインタ型の文字列の変数

文字列の最後は Null 終端文字でなければなりません.
ただし,文字列を代入する時にダブルクォーテーションを使用すると,自動的に
Null 終端文字を追加してくれます.
C++ には string 型という文字列の型があります.

PChar 型は Null 終端文字列のポインタ型です.つまり,上の
    char *d
と同じです.
char に P がついていますが,
Char (1 文字の変数型) のポインタ型ではありません.
が,PChar を Char (1 文字) のポインタという見方をすると,
文字列の先頭アドレス (1 文字目のアドレス) という見方もできなくはない ?
かも知れません.

また,変数をポインタ型の変数として使用する際,

  var
   LpValue : ^TAnyType;

のような使用方法はお勧めできません.ポインタ型を宣言して使用した方がいいでしょう.

type
  PAnyType = ^TAnyType;
var
  LpValue : PAnyType;


[13142] Re3:Delphi 雑感返信 削除
2019/11/16 (土) 23:11:09 Mr.XRAY
> PChar 型は Null 終端文字列のポインタ型です.つまり,上の
>     char *d
> と同じです.



まっ,その,あれです.以下のような記事だとこんなくどい説明なしに,
簡単に「素直な移植」で「ベタ移植」なんですけどね.

[ [Delphi] 構造体と文字列とポインタ ]
https://qiita.com/ht_deko/items/87aee1c7aee75aba90a2

char *str;

str: PChar;
となっているわけですから,素直に受け入れてもらいたいですね.

# 先に提示したページは Delphi 4 時代のものです.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82