Constに対する要望:Cの#defineと同様にできませんか?

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

Constに対する要望:Cの#defineと同様にできませんか?

#1 投稿記事 by Sinryow »

Constによる定数・関数宣言の扱いを,Cの#defineと同様(すなわち,コードが当該部分に埋め込まれた状態になる)にできないでしょうか?

RGB関数とかで変数を引数に取れないのは辛いです。

それにそうしておけばConstの幅が広がりますし,また高速化にも役立てることができそうですし。
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

#2 投稿記事 by 山本 »

Const定義の右辺値やDim定義の配列要素指定を除けば、RGBなどのマクロ関数(Const定義されたもの)であっても、パラメータに変数を渡すことはできます。

http://www.discoversoft.net/help_center ... /Const.htm
「マクロ関数の呼び出しは通常の関数呼び出しと同様に行うことができます。arglistで指定する引数がすべてリテラル値または定数値の場合に限り、そのマクロ関数を定数の代入値expressionとして利用することができます。」
言語仕様はこのようになっています。

#N88BASIC
Dim a As Long
Dim b As Long
Dim c As Long

b=&H12
c=&H34
a=RGB(&H56,c,b)
Print Hex$(a)


#includeと同様、#defineの導入も考えたことがあるんですが、万が一、#defineを多重したプログラムが作成されたとすると、エラーの突き止めが難しくなるという意見がありました。そこで、演算にのみ特化したステートメントとしてConstを取り入れたというワケです。
個人的には#defineを多用してエラー個所がわからなくなってしまったことはあまりないので、必要であれば、、、という感じです…。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#3 投稿記事 by NoWest »

> Const定義の右辺値やDim定義の配列要素指定を除けば、RGBなどのマクロ関数(Const定義されたもの)であっても、パラメータに変数を渡すことはできます。

Const RGB(r As Byte, g As Byte, b As Byte)
型を指定できるとありがたいです。

> #includeと同様、#defineの導入も考えたことがあるんですが、万が一、#defineを多重したプログラムが作成されたとすると、エラーの突き止めが難しくなるという意見がありました。そこで、演算にのみ特化したステートメントとしてConstを取り入れたというワケです。
> 個人的には#defineを多用してエラー個所がわからなくなってしまったことはあまりないので、必要であれば、、、という感じです…。

#defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
#ifdefとかがほしいですね。
API定義ファイルを作っていて「定義済みです。」というエラーを見るのは結構辛いです。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#4 投稿記事 by tak »

> 型を指定できるとありがたいです。

マクロ関数とは、コンパイル時に、関数が定義した式に置き換えられるアレですよね。
ということは、関数とは名ばかりで、どちらかというと式に近い物だと思います。
ABでは式に型を持たせる、C言語でいうところの型キャストのような機構がないので、無理だと思います。


> #defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
> #ifdefとかがほしいですね。

そうですね。条件付きコンパイルが可能になれば開発工程での柔軟性も増しますし。
僕の場合、デバッグ時専用コードを条件付きコンパイルで埋め込んだりするので、#ifdefがあるのなら#defineは必須となります。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#5 投稿記事 by イグトランス »

> > #defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
> > #ifdefとかがほしいですね。
>
> そうですね。条件付きコンパイルが可能になれば開発工程での柔軟性も増しますし。
> 僕の場合、デバッグ時専用コードを条件付きコンパイルで埋め込んだりするので、#ifdefがあるのなら#defineは必須となります。

私はその場合も#defineは#ifdef/#ifndef専用にしてマクロ置き換えには使えないようにする方が良いと思います。

それに現在、C++やそれよりもさらに後に作られた言語では#~の類は廃止しようとする方向へ進んでいるようです。
(const定数やinline/template関数などへ)

高速化なんてのもABのコンパイラがConst関数を機械語レベルでインライン展開するように改良すれば済むのではないでしょうか。
(もちろんそう簡単に出来ることではないのはわかっていますが)
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#6 投稿記事 by Sinryow »

なるほど,inlineですか。
単に「Function Inline RGB(r As Long, g As Long, b As Long) As Long」のようにできるようにしてもいいかもしれませんね。
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

#7 投稿記事 by 山本 »

確かに、#define、#ifdefはあったほうがいいですね。開発スケジュールを調整して、時間ができ次第、検討していこうと思います。

Constで定義するマクロ関数についてですが、以下の2種類の演算方法をとっています。

・Constステートメントの右辺値、Dimステートメントの配列要素 … コンパイルの段階で演算が行われる。
・変数への代入演算、または関数パラメータ … マクロ関数の演算内容が機械語レベルでインライン展開される。演算が行われるのは実行時。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

バグかもしれません

#8 投稿記事 by Sinryow »

どうやら,ただのConstのバグのような気が・・・。

最初実験した時は,こんなコードを使っていました。

コード: 全て選択

#N88BASIC
Dim u As Long
u=255
Print RGB(0, 0, u)
これだと「"RGB(0,0,u)" 無効な識別子です」となるので今回の質問をしたわけです。ところが

コード: 全て選択

#N88BASIC
Dim u As Long
u=255
Print (RGB(0, 0, u))
とすると,正常に動作しました。
また,実際に描画のプログラムを作ってみたときも正常に動作しました。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

#9 投稿記事 by 山本 »

ご報告ありがとうございます。
詳細は、バグ報告の板に書きましたので、ご覧下さい。
返信する