For~Next構文について

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: For~Next構文について

by konisi » 2008年1月16日(水) 21:00

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に入れるだけならオーバーロードすればいいだけかもしれません。応急手当みたいで嫌ですが。

by イグトランス » 2008年1月16日(水) 12:42

可変個引数は,DLL関数へ渡すときにしか使えないですね。
SPrintfでは,追加の引数0個から10個までを多重定義するという力技で乗り切りました。

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

by tak » 2008年1月16日(水) 06:31

あれー?

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

by konisi » 2008年1月15日(火) 22:07

cdeclに関して、今確認してきました。
何故かリポジトリの300位からXMLのエラーがどうとかでコンパイルできないため、
とりあえずcp3で試してみました。

コード: 全て選択

Function cdecl Add(A As Long, ...) As Long
End Function

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

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

by tak » 2008年1月15日(火) 09:08

コード: 全て選択

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 のような機構があれば、そちらが正統派になるかも。

by konisi » 2007年12月27日(木) 18:15

Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。
結局Min, Maxを明示するのがよいと思います。
確かに言われてみれば明示したほうが可読性の面でもよさそうに思えます。

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

by イグトランス » 2007年12月27日(木) 11:14

Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。

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

For~Next構文について

by konisi » 2007年12月27日(木) 00:49

ふと、次のように書けたら便利かなと思いました。

(宣言は省略しています。)
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

ページトップ