YOS G-specの適当なブログ
ゲームやネットが大好きな人のブログ。毎日更新を目指してました。
2017年11月13日 (月) 01:27 | 編集
HSPでScripting Dictionaryを使ってみた。
こちらにある連想配列を連番で抜き出す方法を参考に、
そのままでは手間な部分をマクロに詰め込んでおいた。
マクロであるのは関数だとCOMオブジェクトを扱えなさそうだったため仕方なく。
デバッグに苦労するしあまり複雑なのは書きたくないというのが本音だが仕方ない。

;#cmpopt ppout 1
#runtime "hsp3cl"

#uselib "oleaut32.dll"
#func SafeArrayGetElement@ScriptingDictionary "SafeArrayGetElement" int,int,int
#module ScriptingDictionary
#define getArr(%1,%2,%3) %tgetArr \
dimtype %i,vartype("variant"),1 /*p2*/ :\
%i=dict(%2) /*p1*/ :\
\
repeat %1("Count") :\
%i=cnt /*p0*/ :\
SafeArrayGetElement@ScriptingDictionary %p1("ArrayPtr"),varptr(%p0),varptr(%p2) :\
%3(cnt)=%p2("Value") :\
if cnt=0 { \
%i=%3(0):\
dimtype %3,vartype(%p0),dict("Count") :\
%3(0)=%o \
} \
loop%o0%o0%o0

#define global getKeys(%1,%2) getArr@ScriptingDictionary %1,"Keys",%2
#define global getItems(%1,%2) getArr@ScriptingDictionary %1,"Items",%2
#global

#module Program
#deffunc main
newcom dict,"Scripting.Dictionary"
comres comRef
dict("compareMode")=0

sdim v:input v,,1
;v="Nagato Yukikaze Akagi Kitakami Nagato Akagi Akagi Kitakami"

v=strtrim(v,3,dcCr)
split v," ",v
foreach v
dict->"Exists" v(cnt)
if 1!comRef: dict->"Add" v(cnt),0
dict("Item",v(cnt))=dict("Item",v(cnt))+1
loop

getKeys dict,keys
getItems dict,items
repeat dict("Count")
mes keys(cnt)+" "+items(cnt)
loop
return
#global
main

個人的には先日作ったこっちの方がマシなんじゃないかなぁと思っている。
アクセス速度は知らんけど、実装的にはHSPにあるものしか使ってないのでスマートな気がする。
2017年11月10日 (金) 01:48 | 編集
HSPには連想配列が存在しないため、Dictionaryモジュールを実装した。
ただし、大層なアルゴリズムは組み込んでいないので検索には最大要素数分時間がかかる。
ちなみに要素の消去も未実装。

## モジュール概要
#module Dictionary
#define dcNull
;モジュール用のnull値定義
#const dcCr
;モジュール用のCR(キャリッジリターン)定義
#const dcLf
;モジュール用のLF(ラインフィード)定義
#define new@Dictionary [str type,str defaultValue]
;コンストラクター
;type 型名, defaultValue 辞書文字列
#modcfunc dcCount
;辞書登録数
#modcfunc dcIndexKey int index
;辞書インデックスからキーを取得
;index インデックス
#modcfunc dcIndexItem int index
;辞書のインデックスから値を取得
;index インデックス
#modfunc dcSet str key,var item
;辞書にキーと値を登録
;key キー, item 値
#modcfunc dcItem str key
;辞書からキーで値を取得
#modfunc dcRemove str key
;辞書からキーを削除
;;key キー
#global


## 実装
#module Dictionary keyList,itemList,T
#define global dcNull "__dcNull__"
#const global dcCr $0D
#const global dcLf $0A
#modinit str _T,str _dict
T=vartype(""+_T)
sdim keyList
dimtype itemList,T

if dcNull=_dict: return
dict=_dict
sdim dictKey
sdim dictItem
split dict,",",dict
foreach dict
split dict(cnt),":",dictKey,dictItem
dictKey=strtrim(dictKey,3,dcCr)
dictKey=strtrim(dictKey,3,dcLf)
dcSet thismod,dictKey,dictItem
loop
return
#define new(%1,%2="str",%3=dcNull) dimtype %1,5: newmod %1,Dictionary,%2,%3

#defcfunc local castType int _T,var item
if _T=2 {return str(item)}
else:if _T=3 {return double(item)}
else:if _T=4 {return int(item)}
return

#modcfunc local getKeyIndex str key
keyIndex=-1
foreach keyList
if keyList(cnt)=key {
keyIndex=cnt
break
}
loop
return keyIndex

#modcfunc dcCount
return length(keyList)

#modcfunc dcIndexKey int index
return keyList(index)

#modcfunc dcIndexItem int index
return itemList(index)

#modfunc local dcSet str key,var item
item=castType@Dictionary(T,item)
keyIndex=getKeyIndex@Dictionary(thismod,key)
if 0<=keyIndex {
itemList(keyIndex)=item
}
else {
len=length(keyList)
if len=1 && keyList(len-1)="": len--
keyList(len)=key
itemList(len)=item
}
return
#define global dcSet(%1,%2,%3) %tdcSet %i=%3 :dcSet@Dictionary %1,%2,%o

#modcfunc dcItem str key
keyIndex=getKeyIndex@Dictionary(thismod,key)
if -1=keyIndex: return dcNull
return itemList(keyIndex)

#modfunc dcRemove str key
keyIndex=getKeyIndex@Dictionary(thismod,key)
keyList(keyIndex)=dcNull
max=length(keyList)-1
sdim keyTmp,,max
dimtype itemTmp,T,max

i=0
j=0
repeat:if 1!(i if keyList(i)=dcNull :j++
keyTmp(i)=keyList(j)
itemTmp(i)=itemList(j)
i++
j++
loop

sdim keyList,,max
dimtype itemList,T,max

foreach keyList
keyList(cnt)=keyTmp(cnt)
itemList(cnt)=itemTmp(cnt)
loop
return
#global

使用例としてpaiza練習問題の単語のカウントを回答する。

#runtime "hsp3cl"
#cmpopt varinit 1
#include"Dictionary.as"

#module Program
#deffunc main
new@Dictionary dict,"int"

sdim v:input v,,1
;v="Nagato Yukikaze Akagi Kitakami Nagato Akagi Akagi Kitakami"

v=strtrim(v,3,dcCr)
split v," ",v
foreach v
if dcNull=dcItem(dict,v(cnt)): dcSet dict,v(cnt),0
dcSet dict,v(cnt),dcItem(dict,v(cnt))+1
loop

repeat dcCount(dict)
mes dcIndexKey(dict,cnt)+" "+dcIndexItem(dict,cnt)
loop
return
#global
main

以上。
簡素だけどざっくりな機能は取り組めたので概ね満足。
あとはリムーブか。
追記: こっそり追加。
2017年11月03日 (金) 22:24 | 編集
Raspberry PI買いました。
本体だけな5000円くらい。
これはマイコンとして見かけることが多いけど、
本体は名刺サイズなのに結構パソコンとしての役割も果たせるのでびっくり。
このLINEの投稿だってRaspberry PIを通して行っている(Choromeアプリ)。

数年前にZorinが久々のLinuxだけど懐かしい。
armプロセッサなのでどうなるかと思っていたけど、
過去Zorinで入れていたものは結構何でも入った。

以外にサブPCとしては悪くない選択なのかもと思った。

そういえば一応Lチカもやりました。
Template by 【投資信託のことなら】投信Web /

Powered by .