ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年9月20日(水) 18:22

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 8 件の記事 ] 
作成者 メッセージ
 記事の件名: For~Next構文について
投稿記事Posted: 2007年12月27日(木) 00:49 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
住所: 埼玉県東松山市
ふと、次のように書けたら便利かなと思いました。

(宣言は省略しています。)
before:
コード:
For i=0 To min(a,b)
    ...
Next

Function min(v1 As Long,v2 As Long) As Long
    If v1<=v2 then
        return v1
    Else
        return v2
    End If
End Function
after:
コード:
For i=0 To (a,b)'もちろん、Stepに負数が指定されている場合はmax(a,b)として認識。
'そして引数の個数も3つ4つ指定可。
    ...
Next

ところで、次のように書いてもコンパイルが通るのはバグですか?(in ab423)
コード:
For i=0,25,1'ToやStepをカンマにしても通ってしまう!
    ...
Next

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2007年12月27日(木) 11:14 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 895
住所: 東京都
Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。

結局Min, Maxを明示するのがよいと思います。入力の手間はエディタの補完機能に期待しましょう(前にも書いたばかりの気がしますけど)。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2007年12月27日(木) 18:15 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
住所: 埼玉県東松山市
引用:
Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。
結局Min, Maxを明示するのがよいと思います。
確かに言われてみれば明示したほうが可読性の面でもよさそうに思えます。

#引数の数が不特定なmin関数やmax関数は組み込んで欲しいところですが・・・。

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2008年1月15日(火) 09:08 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
コード:
For i=0 To min(a,b)
    ...
Next
これだとループして先頭に戻るたびに min(a,b) が評価されて非効率的なので(ループの中で a や b が変化するなら話は別)、For の前で c = min(a, b) して For i = 0 To c したいと思ってしまう自分は相当古い頭なのかもしれません...orz


> #引数の数が不特定なmin関数やmax関数は組み込んで欲しいところですが・・・。

そこで cdecl ですよ。たしか cdecl 規約の関数の定義はできるようになってたはず・・・。

あるいは VB6 の ParamArray のような機構があれば、そちらが正統派になるかも。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2008年1月15日(火) 22:07 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
住所: 埼玉県東松山市
cdeclに関して、今確認してきました。
何故かリポジトリの300位からXMLのエラーがどうとかでコンパイルできないため、
とりあえずcp3で試してみました。
コード:
Function cdecl Add(A As Long, ...) As Long
End Function

Add(2,1,1)
引用:
最適化中...
コンパイル中...
1.abp(1) - [警告] "..." 型が指定されていません。Double型として扱います。
1.abp(4) - "Add" のパラメータ指定が間違っています
1.abp(4) - "1" 無効な識別子です

-----------------------------------------------------
コンパイルは中断されました(エラー:2、警告:1)。
文法ミスしていますか?

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2008年1月16日(水) 06:31 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
あれー?

とりあうず cdecl による引数渡しが実装されただけで、可変引数はサポートされていないんですかね?
まあどのみち、最初に引数の数を与えてやらないといけないので、問題大ありなんですが。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2008年1月16日(水) 12:42 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 895
住所: 東京都
可変個引数は,DLL関数へ渡すときにしか使えないですね。
SPrintfでは,追加の引数0個から10個までを多重定義するという力技で乗り切りました。

max, minの場合さらに引数型をジェネリックにしたいのですが,ただの関数にジェネリックってできましたっけ?


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2008年1月16日(水) 21:00 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
住所: 埼玉県東松山市
C++等では、ただの関数にジェネリックを適用する事は許可されているようです。
Wikipedia

ABの場合、引数のどれか一つでもByVal参照で受け取っておけばVarPtrを使って別の引数を容易に取得できるので、
記述「...」を許可すれば最低限の事は出来そうです。
コード:
#console
Sub Test(A As Long,B As Long)
	Dim arg As VoidPtr
	arg=VarPtr(A)
	Print GetDWord(arg-4)'eipも取得できる。
	Print GetDWord(arg) As Long'第一引数
	Print GetDWord(arg+4) As Long'第二引数
	'32bitなら、第n引数へのポインタ=arg+4*(n-1)
End Sub

Test(1,342)
Sleep(-1)
#あとは置換型のマクロでもあればと思ってしまいました。

#minやmaxでは整数型と実数型以外に扱うものがないと思うので、標準libに入れるだけならオーバーロードすればいいだけかもしれません。応急手当みたいで嫌ですが。

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


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

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


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

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