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