3

関数をソートするために参照によって関数に渡す配列ウィッチがあります。ただし、配列はvalによって渡されているようです。誰かが問題を解決できますか?(ソートの回避策も受け入れられます)


1)以下のスクリプトは、並べ替え関数への参照によって配列を渡します。

2)ソート機能は、ソートされた配列値を出力します。

3)スクリプトは、ソートされた配列値を出力します。ただし、それらはソートされていません。


スクリプトの出力:

300、200、100 、、

100、200、300、


'declare variables
mitta(1) = 1
mitta(2) = 2
mitta(3) = 3

sort(mitta)  ' see the function below

' show variables
For i = 1 To 3
    response.write mitta(i) & ","
next

' sort function
function sort(byref a)
    dim num,i,j,temp
    num = ubound(a)+1
    For i = 0 To num - 1
       For j = i + 1 To num - 1
          If a(i) < a(j) Then
             temp = a(i)
             a(i) = a(j)
             a(j) = temp
          End If
       Next
    Next

    ' show sorted variables
    For i = 0 To num - 1
        response.write a(i) & ","
        a(i) = 0
    next
end function
4

3 に答える 3

7

mitta関数呼び出しで括弧で囲むことによりsort(mitta)、関数宣言にもかかわらず、実際には値で渡します。http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspxから:

ルールは

3.1)戻り値に割り当てられた関数呼び出しの引数リストは括弧で囲む必要があります。結果= MyFunc(MyArg)
3.2)呼び出しを使用するサブルーチン呼び出し(または割り当てのない関数呼び出し)の引数リストキーワードは括弧で囲む必要があります。CallMySub(MyArg)
3.3)3.1および3.2が適用されない場合、リストを括弧で囲むことはできません。

そして最後にbyrefルールがあります。引数は可能な場合はbyrefで渡されますが、変数の周りに「余分な」括弧がある場合、変数はbyrefではなくbyvalで渡されます。

これで、ステートメントMySub(MyArg)が有効であるのに、MyOtherSub(MyArg1、MyArg2)が無効である理由が明確になります。最初のケースは、引数リストの周りに親を使用したサブルーチン呼び出しのように見えますが、これはルール3.3に違反します。では、なぜそれは合法なのですか?実際、これは引数リストの周りに親がないサブルーチン呼び出しですが、最初の引数の周りに親があります!これにより、引数が値で渡されます。2番目のケースはルール3.3の明らかな違反であり、それを合法にする方法がないため、エラーを出します。

ByRefおよびByValパラメータのMSDNリファレンスも参照してください。代わりに、次のsortいずれかで呼び出す必要があります。

sort mitta

また:

Call sort(mitta)
于 2011-04-20T05:24:16.447 に答える
3
call sort(mitta)

これで、キーワードを追加するだけcallです。完全なリファレンスはこちらから入手できます

ところで、あなたのコードには問題があります。配列は0ベースです。

于 2011-04-19T11:08:40.493 に答える
0

objectasパラメーターを渡すpointerと、それ自体objectではなく、にaが渡されますobject(これは、私が知っているすべての言語に適用されます)。ByValしたがって、それを渡すか、を渡すかは問題ではありません。ByRef定義上、常にpointer(オブジェクトへの参照)を渡すからです。

于 2011-04-19T12:22:32.777 に答える