参考文献 | TOP |
"裏目小僧の個人的な情報提供->プログラミングの事(いちぶ古い)->C2DELPHI.TXT(リンクが切れています)"をぱくったページ"Project D.E.V - Study Memo - ->Delphi->CとDelphiの対比データ" をパクリました。
C,Delphi対応表 | TOP |
C | Delphi | 解説 |
---|---|---|
sizeof wk | SizeOf(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 p | p.Free | クラスの場合の開放 |
&ptr | @ptr 又は Addr(ptr) | 変数のアドレスを得る。手続きの時に意味が違う |
int *temp | temp:^Integer | ポインタ変数の定義 |
*temp | temp^ | ポインタ変数の示す中身 |
this | Self | クラス自身を示すポインタ |
(int)dt | Integer(dt) | 型キャスト(Delphiでは構造体にキャスト可) |
/ | div | 整数割算(実数の場合は同じ) |
NULL | nil | ヌルポインタ |
func(&a) | func(var a) | aが参照渡である=aで値を関数から返せる |
~a | not a | ビット反転 |
!(論理式) | not (論理型) | 論理反転 |
& | ^ | and or xor | ビット毎の論理式 |
&& || | and or | 論理式(DELPHIには論理型有の為) |
<< >> | shl shr | ビットシフト |
= | := | 代入 |
== != < > <= | = <> < > <= >= | 比較 |
++p | Inc(p) | pは数値かPCHAR。マニュアルにないが^DWORD可 |
a+=10; | Inc(a,10); | インクリメント代入 |
/* */ | { } | 挟んだ範囲をコメントにする |
// | // | //以降をコメントにする |
0xff | $ff | 16進。Delphiに8進数はなし |
\"abc\" | 'abc' | 文字列 |
\"abc\n\" | 'abc'#13#10 | 制御文字を文字列に入れる場合 |
'a' | ord('a') | 文字を数字として扱う場合 |
*p=0x20 | p^:=chr($20) | 数字で文字コードを表現したい場合 |
/= *= <<= >>= | <対応なし> | DELPHIでは代入演算子は:=だけ |
<対応なし> | 集合型への+-* | 集合型の和と差と積はDelphiだけ |
<対応なし?> | in | 集合型に値が含まれているかどうか |
<対応なし?> | is | そのクラスに属するならtrue |
<対応なし?> | as | nilかクラスに属しなければ例外発生 |
C,Delphi対応表(制御系) | TOP |
C | Delphi | 解説 |
---|---|---|
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 |
C | Delphi | 解説 |
---|---|---|
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 |
C | Delphi | 解説 |
---|---|---|
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 |
C | Delphi | 解説 |
---|---|---|
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 |
* | C | Delphi |
---|---|---|
ラベル | 文中に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と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; |
EOF | TOP |