様々なデータタイプを格納できるキューのモジュールです(メモリが許す限りデータを格納できます)
そのままでは配列等は格納できませんが、DataContainerモジュールを変更すれば格納できます
様々なデータタイプを格納できるキューのモジュールです(メモリが許す限りデータを格納できます)
そのままでは配列等は格納できませんが、DataContainerモジュールを変更すれば格納できます
// データを保存するだけのモジュール// 各種データをモジュール変数として扱う用#module DataContainer m_data, m_size, m_rsize#modinit var p_data, int p_size, \local indexif p_size < 0 {delmod thismodreturn -1}m_size = p_sizeif m_size > 0 {dimtype m_data, vartype(p_data), m_sizeswitch vartype(p_data)case vartype("int") : m_rsize = m_size << 2 : swbreakcase vartype("str") : m_rsize = m_size : swbreakcase vartype("double") : m_rsize = m_size << 3 : swbreakcase vartype("label") : m_rsize = m_size << 2 : swbreak // TODO: 64Bit版case vartype("struct") : delmod thismod : return -1 // 未実装default : delmod thismod : return -1 // 実装する気ナシswendmemcpy m_data, p_data, m_rsize} else {dimtype m_data, vartype(p_data), 1m_rsize = 0}mref index, 2return index// 格納されたデータを取得#modfunc local GetData var p_dataif m_size > 0 {dimtype p_data, vartype(m_data), m_sizememcpy p_data, m_data, m_rsize} else {dimtype p_data, vartype(m_data), 1}return// 格納されたデータのサイズを取得#modcfunc local GetSizereturn m_size// 格納されたデータの実サイズを取得#modcfunc local GetRealSizereturn m_rsize#global// キューのモジュール#module Queue m_data, m_index, m_num#modinit \local indexdimtype m_data, vartype("struct"), 1dim m_index, 1dim m_nummref index, 2return index// キューにデータを追加// Enqueue@Queue [VAR]モジュール変数, [VAR]追加するデータ, [INT]データの大きさ// 戻り値:正常終了だと1、処理に失敗すると0#modfunc local Enqueue var p_data, int p_sizenewmod m_data, DataContainer, p_data, p_sizeif stat < 0 : return 0m_index(m_num) = statm_num++return 1// キューからデータを取得// Dequeue@Queue [VAR]モジュール変数, [VAR]出力先変数// 戻り値:正常終了だと1、処理に失敗すると0#modfunc local Dequeue var p_dataif m_num <= 0 : return 0GetData@DataContainer m_data(m_index(0)), p_datam_num--memcpy m_index, m_index, m_num << 2, 0, 4return 1// キューのデータ数を取得// RET = GetDataNum@Queue([VAR]モジュール変数)// 戻り値:データ数#modcfunc local GetDataNumreturn m_num// 次のデータのサイズを取得// RET = GetNextDataSize@Queue([VAR]モジュール変数)// 戻り値:データサイズ、ただしデータがないときは-1#modcfunc local GetNextDataSizeif m_num <= 0 : return -1return GetSize@DataContainer(m_data(m_index(0)))#global// 以下サンプル、#if 0を#if 1にして動作#if 0newmod mod, Queuesdim textobjsize 60, 20pos 0, 0 : input text, 200, 20pos 200, 0 : button "Enqueue", *enqueuepos 260, 0 : button "Dequeue", *dequeuepos 320, 0 : button "Count", *countpos 380, 0 : button "Get Size", *getsizepos 10, 30stop*enqueueif text == "" {mes "No Data Specified"stop}Enqueue@Queue mod, text, strlen(text)mes "Enqueued ["+text+"]"objprm 0, ""sdim textstop*dequeuesdim dataDequeue@Queue mod, dataif stat {mes "Dequeued ["+data+"]"} else {mes "No Data in Queue"}stop*countmes "There are "+GetDataNum@Queue(mod)+" Data in Queue"stop*getsizesize = GetNextDataSize@Queue(mod)if size >= 0 {mes "Next Data is "+size+" Bytes Long"} else {mes "No Data in Queue"}stop#endif