ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 06:00

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年5月31日(火) 09:42 
オフライン

登録日時: 2005年5月31日(火) 09:34
記事: 141
お住まい: 北海道
Constによる定数・関数宣言の扱いを,Cの#defineと同様(すなわち,コードが当該部分に埋め込まれた状態になる)にできないでしょうか?

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

それにそうしておけばConstの幅が広がりますし,また高速化にも役立てることができそうですし。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年5月31日(火) 11:34 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
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を多用してエラー個所がわからなくなってしまったことはあまりないので、必要であれば、、、という感じです…。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年5月31日(火) 14:58 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
> Const定義の右辺値やDim定義の配列要素指定を除けば、RGBなどのマクロ関数(Const定義されたもの)であっても、パラメータに変数を渡すことはできます。

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

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

#defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
#ifdefとかがほしいですね。
API定義ファイルを作っていて「定義済みです。」というエラーを見るのは結構辛いです。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年5月31日(火) 16:12 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
> 型を指定できるとありがたいです。

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


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

そうですね。条件付きコンパイルが可能になれば開発工程での柔軟性も増しますし。
僕の場合、デバッグ時専用コードを条件付きコンパイルで埋め込んだりするので、#ifdefがあるのなら#defineは必須となります。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年5月31日(火) 18:09 
オフライン

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

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

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

高速化なんてのもABのコンパイラがConst関数を機械語レベルでインライン展開するように改良すれば済むのではないでしょうか。
(もちろんそう簡単に出来ることではないのはわかっていますが)


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年6月01日(水) 00:23 
オフライン

登録日時: 2005年5月31日(火) 09:34
記事: 141
お住まい: 北海道
なるほど,inlineですか。
単に「Function Inline RGB(r As Long, g As Long, b As Long) As Long」のようにできるようにしてもいいかもしれませんね。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年6月02日(木) 01:02 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
確かに、#define、#ifdefはあったほうがいいですね。開発スケジュールを調整して、時間ができ次第、検討していこうと思います。

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

・Constステートメントの右辺値、Dimステートメントの配列要素 … コンパイルの段階で演算が行われる。
・変数への代入演算、または関数パラメータ … マクロ関数の演算内容が機械語レベルでインライン展開される。演算が行われるのは実行時。


通報する
ページトップ
 記事の件名: バグかもしれません
投稿記事Posted: 2005年6月04日(土) 10:06 
オフライン

登録日時: 2005年5月31日(火) 09:34
記事: 141
お住まい: 北海道
どうやら,ただの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/
' ============================================================


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年6月04日(土) 11:53 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
ご報告ありがとうございます。
詳細は、バグ報告の板に書きましたので、ご覧下さい。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Google [Bot] & ゲスト[11人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean