新着表示
タイトル
記事No
投稿日
投稿者
: Re: idx_search 続き
: 674
: 2015/02/11(Wed) 17:38:04
: JG1MOU浜田
idx_next() を使い、日付が変わるまでループします。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
タイトル
記事No
投稿日
投稿者
: Re: idx_search 続き
: 673
: 2015/02/11(Wed) 11:23:15
: JA2BQX 太田
> 例えば Hamlog.hdb に 日付が "20010203" のデータが
日付を1日づつ加算して行きレコード番号が求められたらそのー1を求める手もありますね。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
タイトル
記事No
投稿日
投稿者
: idx_search 続き
: 672
: 2015/02/11(Wed) 10:34:33
: JA2BQX 太田
こんにちは。お世話になります。
先日の idx_search の続きですが、
例えば Hamlog.hdb に 日付が "20010203" のデータが
レコード番号 100から104までだったとして下記で最初の 100 は求まります。
キー "20010203" の最後の 104 を求めるにはどうすれば良いでしょうか?
100から順番にhdbを読み込み、 Date を求めて行き、"20010203" ではなくなるレコードまで
順次判定して行くしかありませんか?
MakeIndex(hamlogpath, "DATE", "C:\thw2adi\Date.Ndx")
Dim str As String = "20010203"
途中省略
rec_no_1st = idx_search(THindx, search_date, 0)
下記関数の使い方が分かっていないからかも知れませんが。
idx_top() : hdbの最初のレコード番号 1
idx_bottom() : hdbの最終レコード番号
上記では単純過ぎるので、正しい使い方が他にあるのかも?
idx_next() : キーで検索されたレコード番号の次。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
タイトル
記事No
投稿日
投稿者
: Re: idx_search
: 671
: 2015/02/09(Mon) 22:07:21
: JA2BQX 太田
こんばんは。浜田さん、ありがとうございます。
午前中から 同じようなことをしているのですが成功していませんでしたが
今、改めてテストしたら取得出来るようです....。
> 分の数値 or &H80 です。
Dim str As String = "1200"
fp0 = Val(str.Substring(0, 2))
fp1 = Val(str.Substring(2, 2))
search_time_ary(0) = CByte(fp0)
下記のどちらでOKです。
search_time_ary(1) = &H80 Or CByte(fp1)
search_time_ary(1) = CByte(128) Or CByte(fp1)
午前中のテストとコードは変わらないのですがテスト環境 (Hamlog.hdb) が間違えていたのかな....??
次の Date+Time のUTCも取れるようになりました。
的確なアドバイスを何時もありがとうございます。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
タイトル
記事No
投稿日
投稿者
: Re: idx_search
: 670
: 2015/02/09(Mon) 20:28:13
: JG1MOU浜田
> 1200 でサーチすると 12:00 J のレコード番号が求められます。
> 12:00 U のレコード番号を求めるにはどうしたらいいでしょうか?
分の数値 or &H80 です。
分 = 分 or &H80
論理和っていうのでしょうか。
逆に、最上位ビットをカットして分の値を取り出すには、
分の数値 and &H7F です。
分 = 分 and &H7F
論理積っていうのでしょうか。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
タイトル
記事No
投稿日
投稿者
: Re: idx_search
: 669
: 2015/02/09(Mon) 07:50:01
: JA2BQX 太田
こんにちは。
> バイト型の配列の1要素に、文字列?がコピーできてしまうのですか。
例の暗黙的変換?をしてくれているのかも、Hi。
str = "1200"
fp0 = Val(str.Substring(0, 2))
fp1 = Val(str.Substring(2, 2))
search_time_ary(0) = CByte(fp0)
search_time_ary(1) = CByte(fp1)
...とかが良いでしょうね、これで動きます。
1200 でサーチすると 12:00 J のレコード番号が求められます。
12:00 U のレコード番号を求めるにはどうしたらいいでしょうか?
Hamlog50.txt には 分の最上位ビットが1であればUTC とあります。
1000 0000 は 16進数で 80 なので10進数の128を加算して
12 と 128+0 をバイト配列に入れてテストしていますが間違いのようです。
どのように処理すれば良いのでしょうか?
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
タイトル
記事No
投稿日
投稿者
: Re: idx_search
: 668
: 2015/02/08(Sun) 22:53:51
: JG1MOU浜田
> Dim search_date As String
> Dim search_date_ary(4) As Byte
>
> search_date_ary(0) = "20"
> search_date_ary(1) = "15"
> search_date_ary(2) = "01"
> search_date_ary(3) = "05"
バイト型の配列の1要素に、文字列?がコピーできてしまうのですか。
また、エンコードルーチンを呼び出す必要があるのですね。
いずれにしても、インデックスルーチンを使うと、検索がめちゃくちゃ
高速になります。
ハムログにおける、コールサインのサフィックス・サーチやワイルドカ
ード・サーチでは、HAMLOG.DX0からサーチしてますので20万件以上の
データから任意の100件くらいを探し出すのでも、瞬時に表示して
くれます。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
タイトル
記事No
投稿日
投稿者
: Re: idx_search
: 667
: 2015/02/08(Sun) 18:16:29
: JA2BQX 太田
浜田さん、何回もありがとうございました。
下記のように修正したら目的のレコード番号が取得出来ました。
Dim search_date As String
Dim search_date_ary(4) As Byte
search_date_ary(0) = "20"
search_date_ary(1) = "15"
search_date_ary(2) = "01"
search_date_ary(3) = "05"
MakeIndex(hamlogpath, "DATE", "C:\thw2adi\Date.Ndx")
Ret = idx_open("C:\thw2adi\Date.Ndx", THindx)
search_date = System.Text.Encoding.GetEncoding(932).GetString(search_date_ary)
rec_no_1st = idx_search(THindx, search_date, 0)
Call idx_close(THindx)
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
タイトル
記事No
投稿日
投稿者
: Re: idx_search
: 666
: 2015/02/08(Sun) 16:33:38
: JG1MOU浜田
> Function idx_search(p As TIDXh, ByVal s As String, ByVal l As Long) As Long
> これを見るとキーは String ですが?
VBの場合はそのように宣言するしか思いつきませんでした。
C言語やPascalではchar型のポインタ、又はcharの配列です。
> Date.Ndx のファイルサイズとレコード件数の帳尻が合わないみたいなので
> データ構造の調べが間違えているように思っています。
> 出来ればデータ構造を教えていただけますか?
ファイルサイズとレコード件数は、釣り合わないはずです。
そんな単純な構造ではありません。
ですが、参考文献も処分してしまって・・・。
自分でもほとんど忘れてます。
データ構造を理解しなくても使えると思いますけど。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
タイトル
記事No
投稿日
投稿者
: Re: 時間表示をUTCに固定化したい
: 665
: 2015/02/08(Sun) 12:05:16
: JG1MOU浜田
> 時間表示を 国内&海外ともにUTCにしたいのですが 何か方法ありませんか、現在 DXに印しを付けておけば UTCになるのですが 国内の局はUTCにするのに作業が必要になりますここはプログラム開発(C、パスカル、VB言語等、又はDLL)についての
専用BBSです。
プログラム言語に関する投稿以外は通常のHAMLOG相談室に投稿して下さい。
常にUTCにする方法は、こちらをご覧ください。
http://hamlog.no.coocan.jp/html/HID00045.html
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!