複数の数字を比較
コード: 全て選択
#console
Const cmp=11
Dim i As Long,j As Long,k As Long
Dim nums[4]=[2,4,10,13,-4] As Long
k=&H7FFFFFFF
For i=0 To 4
If k>Abs(nums-cmp) then'差の絶対値でどれだけ近いか調べる
k=Abs(nums-cmp)
j=i
End If
Next i
Print nums[j]
Sleep(-1)
こんなかんじでどうでしょうか?
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
Loopの回数を指定しないようには
konisiさん、ありがとうございます。
Dim root As String
root="32,543,10,-21・・・"
となっていて、Loopの回数を自動で調節したいのですが、
この場合はどのようにすればよいのですか、教えてください。
Dim root As String
root="32,543,10,-21・・・"
となっていて、Loopの回数を自動で調節したいのですが、
この場合はどのようにすればよいのですか、教えてください。
コード: 全て選択
Dim nums[4]=[2,4,10,13,-4] As Long
コード: 全て選択
Dim root As String,nums As *Long,t1 As Long,t2 As Long
t1=1
t2=0
root=""'適当な値に初期化しておくこと。
Do
t1=InStr(root,",",t1)
If t1<>0 then
t2=t2+1
Else
Exit Do
End If
Loop
nums=calloc(t2*4)
t1=1
t2=0
Do
nums(t2)=Val(Mid$(root,t1,InStr(root,",",t1))) As Long
t1=InStr(root,",",t1)+1
If InStr(root,",",t1)=0 then Exit Do
t2=t2+1
Loop
今ここで思いつくままに書いたのできちんと動くかどうかはやってみないと分かりませんが。
そうそう、alloc系の命令を使っているので、処理の最後に
コード: 全て選択
free(nums)
つまり、上のコードがきちんと動く事を仮定した場合の全ソースは次のようになります。
コード: 全て選択
#console
Const cmp=11
Dim i As Long,j As Long,k As Long
Dim root As String,nums As *Long,t1 As Long,t2 As Long
t1=1
t2=0
root=""
Do
t1=InStr(root,",",t1)
If t1<>0 then
t2=t2+1
Else
Exit Do
End If
Loop
nums=calloc(t2*4)
t1=1
t2=0
Do
nums(t2)=Val(Mid$(root,t1,InStr(root,",",t1))) As Long
t1=InStr(root,",",t1)+1
If InStr(root,",",t1)=0 then Exit Do
t2=t2+1
Loop
k=&H7FFFFFFF
For i=0 To t2
If k>Abs(nums-cmp) then
k=Abs(nums-cmp)
j=i
End If
Next i
Print nums[j]
free(nums)
Sleep(-1)
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
こんな感じ
あとはPrint tokの所に数字をカウントする処理を書けば可能なはず
そこは御自分でお願いします
わかる人用のおまけ
コード: 全て選択
Dim str As BytePtr
str = "3,7,5,9,8,7,5,1"
Dim tok As Long
Dim i As Long,j As Long
i = 1
j = InStr(i,str,",")
While j<>0
If j>i Then
tok = Val(Mid$(str,i,j-i))
'tokに数字が入ってるのでカウント処理を書く
Print tok
End If
i = j+1
j = InStr(i,str,",")
Wend
j = lstrlen(str)+1
If j>i Then
tok = Val(Mid$(str,i,j-i))
'ここでもtokに数字が入ってるのでカウント処理を書く
Print tok
End If
そこは御自分でお願いします
わかる人用のおまけ
[ここをクリックすると内容が表示されます]
/*
EnumToken
文字列からトークンを取り出してコールバック関数を呼ぶ
エラー処理してませんので使うならして下さい
引数
str = トークン列挙する文字列
del = デリミタ
cbfunc = コールバックアドレス(ENUMTOKEN_CALLBACK)
param = コールバック関数へ渡す値
戻り値
トークンの数
*/
Function EnumToken(str As BytePtr,del As BytePtr,cbfunc As ENUMTOKEN_CALLBACK,param As DWord) As Long
Dim i As Long
Dim j As Long
i = 1
j = InStr(i,str,del)
While j<>0
If j>i Then
EnumToken = EnumToken+1
'//ここにトークンに対する処理を書く
If cbfunc(str+i-1,j-i,EnumToken,param)<>TRUE Then Exit Function
'//ここまで
End If
i = j+lstrlen(del)
j = InStr(i,str,del)
Wend
j = lstrlen(str)+1
If j>i Then
EnumToken = EnumToken+1
'//ここにもトークンに対する処理を書く
cbfunc(str+i-1,j-i,EnumToken,param)
'//ここまで
End If
End Function
TypeDef ENUMTOKEN_CALLBACK = *Function(start As BytePtr,size As Long,count As Long,param As DWord) As Long
/*
ENUMTOKEN_CALLBACK
EnumTakenからコールされる関数
引数
start = トークンの開始アドレス
size = トークンのサイズ
count = 先頭を1として何番目のトークンか
param = EnumTokenの第四引数
戻り値
列挙を続ける場合はTRUE
'プロトタイプ
Function et_cb(start As BytePtr,size As Long,count As Long,param As DWord) As Long
et_cb = TRUE
End Function
*/
EnumToken
文字列からトークンを取り出してコールバック関数を呼ぶ
エラー処理してませんので使うならして下さい
引数
str = トークン列挙する文字列
del = デリミタ
cbfunc = コールバックアドレス(ENUMTOKEN_CALLBACK)
param = コールバック関数へ渡す値
戻り値
トークンの数
*/
Function EnumToken(str As BytePtr,del As BytePtr,cbfunc As ENUMTOKEN_CALLBACK,param As DWord) As Long
Dim i As Long
Dim j As Long
i = 1
j = InStr(i,str,del)
While j<>0
If j>i Then
EnumToken = EnumToken+1
'//ここにトークンに対する処理を書く
If cbfunc(str+i-1,j-i,EnumToken,param)<>TRUE Then Exit Function
'//ここまで
End If
i = j+lstrlen(del)
j = InStr(i,str,del)
Wend
j = lstrlen(str)+1
If j>i Then
EnumToken = EnumToken+1
'//ここにもトークンに対する処理を書く
cbfunc(str+i-1,j-i,EnumToken,param)
'//ここまで
End If
End Function
TypeDef ENUMTOKEN_CALLBACK = *Function(start As BytePtr,size As Long,count As Long,param As DWord) As Long
/*
ENUMTOKEN_CALLBACK
EnumTakenからコールされる関数
引数
start = トークンの開始アドレス
size = トークンのサイズ
count = 先頭を1として何番目のトークンか
param = EnumTokenの第四引数
戻り値
列挙を続ける場合はTRUE
'プロトタイプ
Function et_cb(start As BytePtr,size As Long,count As Long,param As DWord) As Long
et_cb = TRUE
End Function
*/
① 11に一番近い数字を見つけたら、それを表示する
② その数字を消すように、シフトする。あるいはその数字の値を&H7FFFFFFFとかに変更・代入する。
③ ①に戻る
てな感じでどうでしょうか?
簡単そうなので敢えて書きませんが。
② その数字を消すように、シフトする。あるいはその数字の値を&H7FFFFFFFとかに変更・代入する。
③ ①に戻る
てな感じでどうでしょうか?
簡単そうなので敢えて書きませんが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。