呼び出し規約(重要?)

今回の内容は、呼び出し規約です。呼び出し規約とは、関数に引数を渡すとき、どのように渡すかを決めるものです。
詳しい解説は呼出規約 - Wikipediaにあります。
ABで使えるものはstdcallとcdeclになります。しかし自前の関数でcdeclを定義できるのはバージョン5以上になります。

stdcallはWin32API関数の呼び出し規約です。ABも標準はstdcallです。だから問題はありません。
しかしVCランタイムの呼び出し規約はcdeclです。だからABがVCランタイムの関数を呼ぶときはcdeclにしなければいけません。

cdeclな関数の作り方(ver5以上)

cdeclの関数を作るには、Function/Subと関数名の間にcdeclか書くだけです。
Function cdecl Test() As Long とかSub cdecl poke()のように書きます。簡単です。

cdeclの使い方(ver5以上)

VCランタイムの中には自前で関数を定義しなければ使えないものがあります。qsort関数とbsearch関数です。
これらの関数は、当然cdeclです。だから使う側の自前関数もcdeclにしなければなりません。
qsortは配列データの並び替えを行う関数ですが、比較する関数は自前です。
下のプログラムではcmp関数で行っています。cmpの前にcdeclと書くことでcdeclになります。
cdeclの文字を消してからから実行すると、動作が変になると思います。
#console
#include <vcrt71.sbp>

Dim h[9] As Long'0-9の10コ

'qsortの比較関数(cdecl)
Function cdecl cmp(a As *Long, b As *Long) As Long
    cmp = GetDWord(a)-GetDWord(b)
End Function

'配列データの表示(当然stdcall)
Sub Show(a As *Long,nobj As Long)
Dim n As Long
    For n = 0 To nobj -1
        printf(Ex"%d:%d\n", n, a[n])
    Next
End Sub

'配列を乱数で初期化
Sub Shokika(a As *Long,nobj As Long)
Dim n As Long
    For n = 0 To nobj -1
        SetDWord(VarPtr(a[n]), Int(Rnd() * 100) + 1)
    Next
End Sub

Shokika(h,10)
Show(h,10)
qsort(h,10,sizeof(Long), AddressOf(cmp))
Show(h,10)

getchar()'キー入力待ち