ab.com コミュニティ https://www.activebasic.com/forum/ |
|
For~Next構文について https://www.activebasic.com/forum/viewtopic.php?t=2203 |
ページ 1 / 1 |
作成者: | konisi [ 2007年12月27日(木) 00:49 ] |
記事の件名: | For~Next構文について |
ふと、次のように書けたら便利かなと思いました。 (宣言は省略しています。) 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 Functionafter: コード: For i=0 To (a,b)'もちろん、Stepに負数が指定されている場合はmax(a,b)として認識。 'そして引数の個数も3つ4つ指定可。 ... Next ところで、次のように書いてもコンパイルが通るのはバグですか?(in ab423) コード: For i=0,25,1'ToやStepをカンマにしても通ってしまう! ... Next |
作成者: | イグトランス [ 2007年12月27日(木) 11:14 ] |
記事の件名: | |
Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。 結局Min, Maxを明示するのがよいと思います。入力の手間はエディタの補完機能に期待しましょう(前にも書いたばかりの気がしますけど)。 |
作成者: | konisi [ 2007年12月27日(木) 18:15 ] |
記事の件名: | |
引用: Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。 確かに言われてみれば明示したほうが可読性の面でもよさそうに思えます。結局Min, Maxを明示するのがよいと思います。 #引数の数が不特定なmin関数やmax関数は組み込んで欲しいところですが・・・。 |
作成者: | 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 のような機構があれば、そちらが正統派になるかも。 |
作成者: | konisi [ 2008年1月15日(火) 22:07 ] |
記事の件名: | |
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)。 |
作成者: | tak [ 2008年1月16日(水) 06:31 ] |
記事の件名: | |
あれー? とりあうず cdecl による引数渡しが実装されただけで、可変引数はサポートされていないんですかね? まあどのみち、最初に引数の数を与えてやらないといけないので、問題大ありなんですが。 |
作成者: | イグトランス [ 2008年1月16日(水) 12:42 ] |
記事の件名: | |
可変個引数は,DLL関数へ渡すときにしか使えないですね。 SPrintfでは,追加の引数0個から10個までを多重定義するという力技で乗り切りました。 max, minの場合さらに引数型をジェネリックにしたいのですが,ただの関数にジェネリックってできましたっけ? |
作成者: | 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に入れるだけならオーバーロードすればいいだけかもしれません。応急手当みたいで嫌ですが。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |