[BlueLeaf1336]> PROGRAM>

CとDelphiの対比表

参考文献TOP

"裏目小僧の個人的な情報提供->プログラミングの事(いちぶ古い)->C2DELPHI.TXT(リンクが切れています)"をぱくったページ"Project D.E.V - Study Memo - ->Delphi->CとDelphiの対比データ" をパクリました。

C,Delphi対応表TOP

CDelphi解説
sizeof wkSizeOf(wk)バイト数:Cでは演算子だがDelphiでは関数
p=malloc(size)GetMem(p,size)指定バイト数のメモリ確保
p=new aa;new(p);動的変数の確保(DELPHIクラス型は下)
free(p);Dispose(p);動的変数の解放
p=new xx(a,b)p=クラス名.xx(a,b)constructor xx で定義してある事
delete pp.Freeクラスの場合の開放
&ptr@ptr 又は Addr(ptr)変数のアドレスを得る。手続きの時に意味が違う
int *temptemp:^Integerポインタ変数の定義
*temptemp^ポインタ変数の示す中身
thisSelfクラス自身を示すポインタ
(int)dtInteger(dt)型キャスト(Delphiでは構造体にキャスト可)
/div整数割算(実数の場合は同じ)
NULLnilヌルポインタ
func(&a)func(var a)aが参照渡である=aで値を関数から返せる
~anot aビット反転
!(論理式)not (論理型)論理反転
& | ^and or xorビット毎の論理式
&& ||and or論理式(DELPHIには論理型有の為)
<< >>shl shrビットシフト
=:=代入
== != < > <== <> < > <= >=比較
++pInc(p)pは数値かPCHAR。マニュアルにないが^DWORD可
a+=10;Inc(a,10);インクリメント代入
/* */{ }挟んだ範囲をコメントにする
//////以降をコメントにする
0xff$ff16進。Delphiに8進数はなし
\"abc\"'abc'文字列
\"abc\n\"'abc'#13#10制御文字を文字列に入れる場合
'a'ord('a')文字を数字として扱う場合
*p=0x20p^:=chr($20)数字で文字コードを表現したい場合
/= *= <<= >>=<対応なし>DELPHIでは代入演算子は:=だけ
<対応なし>集合型への+-*集合型の和と差と積はDelphiだけ
<対応なし?>in集合型に値が含まれているかどうか
<対応なし?>isそのクラスに属するならtrue
<対応なし?>asnilかクラスに属しなければ例外発生

C,Delphi対応表(制御系)TOP

CDelphi解説
label:label label,1;
begin
lb:; 1:;
var定義が終わった後のbeginの前でlabel定義
delphiでは数字だけでもラベルに出来る
goto label;goto label;*
return;exit;*
{
複数文;
};
begin
複数文;
end;
*
if(flg) 文;
else 文;
if flg then 文
else 文;
delphiでelseがある時は文の後に;付けない
switch(n){
case 1:
default:
}
case n of
1:
else
end;
delphiの方が高機能,defaultタイプミスがない
1,2,3:のように複数 1..3:のように範囲可
delphiで複数文を書く時はbegin end;
do{...
}while(f)
repeat
begin
...
end
until
not f;
*
while(f){
...}
while f do
begin
...
end;
*
break;continue;delphiもcもほぼ同じ

C,Delphi対応表(型)TOP

CDelphi解説
int a;a:Smallint;16bit
long a;a:longint;32bit
unsigned int a;a:WORD;16bit
unsigned long a;a:DWORD;32bit CでもwindowsならDWORD型が良い
unsigned char a;a:Byte;*
char a;a:Shortint;*
char a;a:AnsiChar;文字として処理する時はこちらの型を使う
char[10] a;a:array [0..9] of Char;*
int * a;a:^Smallint;(本来はtype節で PSmallintと定義して使うらしいが)
double a;a:double;*

C,Delphi対応表(構造体)TOP

CDelphi解説
struct a{
int x;
}
type
a=record
x:Smallint;
end;
*
union a{
char x[2];
int y;
}
type
a=record
case Integer of
0:(x:array[0..1]of Char);
1:(y:Smallint);
end;
Pascalの方が柔軟な分面倒

C,Delphi対応表(似ているが異なる物)TOP

CDelphi解説
func(...)func(array of const)Pascalでは引数を渡す順番から...は不可能
void *Pointer形無しポインタだが少し違う
xx::xx();constructer xx.dd()どちらもコンストラクタだが、Delphiでは事前にゼロクリア済み。
また参照呼び出して普通の関数としても動作可
for(i=0;i<=n;i++)文;for i:=0 to n do 文nが文中で変更された時に異なる

DelphiのポインタTOP

ポインタ変数については、事前に定義しておかなければならない。

type
    pWord = ^Word;  まずこうやってwordのポインタ型を定義しておいて
var                 その後、
    ip1: pWord;     ポインタ型の変数を定義する
    ip2: ^Word;     でも、マニュアルにはないけど変数ならこう定義出来るみたい

注意:Pointer型の変数には加算減算出来ない。PChar型にすれば可能
関数ポインタ型の定義 (Cでのtypedefのように定義してから使う)
type
    pfunc1=function:Double;                 これらは型の定義でありポインタの定義ではない
    pfunc2=procedure;
    pfunc3=procedure(a:Integer);
    pfunc4=procedure(a:Integer) of object;  メソッド(クラス内)の場合
var
    f: pfunc1;                              ここがポインタの定義となる

DelphiとCとの違い注意TOP

*CDelphi
ラベル 文中にaa: abc:のように書けばそれがラベル定義になります。 cと違い英字だけでなく数字もラベルに出来ますが、最初に使用するラベルを全て定義しなければなりません。 手続,関数,メソッドに続いて
procedure aa;
var
    i:integer;
label
    lab1,111;       // ここで全部定義する
begin
    lab1:;          // 文中ではlab1:のようにする。
    goto lab1:;
    111:;
end;
return 手続きならreturn; 関数ならreturn 帰値; 手続きも関数も途中終了するのはexit;です。関数の帰り値の場合は result:=帰値;とやります。 resultは暗黙のうちに定義される変数なので、代入だけでなく参照も出来ます。
switchとCase default:というのがタイプミスしても単なるラベルになるという重大な欠陥がありました。 また、Breakを忘れると 次のcase n:を実行してしまう欠陥もあり注意しなければなりません。 文1つづつしか指定出来ませんからbegin...endで挟まないといけませんが、セレクタとして複数や範囲を指定出来便利です。
with do 定数を並べると構造体のメンバを設定出来ました 構造体の設定をするには各メンバへの代入しかありません。それを緩和してくれるのがwith xx do 文です。 が、出来るだけ集中して使わないとどの構造体のメンバに代入してるのか判らなくなるので注意 xx.WndProc(var Msg: TMessage); とある引き数 Msgを参照するのにwith Msg do case Msg of 文;とやりますが、caseの後のMsgは実際にはMsg.Msgだったりする
p++ p++; ポインタサイズに応じてINCされる Inc(p) マニュアルにはPCHARの時だけ動作するとあるが、P:DWORDでも期待通り動作するようだ。

配列についてTOP

Cでは配列名はポインタと代入互換があり、配列名=配列の先頭番地というイメージがあります。 int *p;と定義すれば p[3]のようにもアクセス出来ました。
しかしDelphiでは配列名はたんなる変数名の一種でニュアンスが違う為、最初は戸惑います。 ポインタからのデータを配列として扱いたい場合は、

type
    PPWordArry = ^TPWordArry;
    TPWordArry = Array[0..32767] Of PWord;
var
    p :PChar
    q :PPWordArry;
begin
    ...
    q:=PPWordArry(p);
    ...
とすれば、q^[10]のように整数配列として使用出来るようになります。
type
    PPWordArry = ^TPWordArry;
    TPWordArry = Array[0..32767] Of PWord;
var
    p :PChar
    q :PPWordArry absolute p;
とすれば、pとqは同じ変数位置を示すようになりますから、代入しなくとも 配列としてアクセス出来る事になります。
さらに
type
    TPWordArry = Array[0..32767] Of PWord;
var
    p :PChar
    q :^TPWordArry absolute p;
とすればタイプ回数を減らせます。が、これは言語リファレンスにない使い方ですから、将来も動くかどうかは不明。
delphiでの配列は範囲を指定します。範囲はLOW-HIGHで取り出せます。オープン配列では0〜HIGHになります

DelphiとC++との違い注意TOP

*C++Delphi
メソッドのオーバーライドをする時 親でvirtual宣言されていれば自動的に継承される 必ずoverrideが必要(無ければ継承されてない)<結構ミスの元>
virtualとdynamicとmessage 仮想メソッドはvirtualしかありません。 virtualもdynamicでも動作は同じ。
virtualは高速だがメモリを少し食う。
dynamicは遅いが、virtualよりメモリ消費が少ない
messageはwindowsメッセージの為のdynamic宣言
継承後の親呼び出し 親::callという形で遡って親を呼び出せます Inherited callという形で直前の継承元を呼び出します
多重継承 親を2つ以上でも持てます 親は常に1つです。幹はTObjectです。Cのように多重継承の真似をしたい場合はメンバーとして持つしかないです。
抽象メソッド virtual xx(,,,)=0; xx(,,,);virtual;abstract;

EOFTOP