Codezineで見つけたタスクシステムを実行してみた結果

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

Codezineで見つけたタスクシステムを実行してみた結果

#1

投稿記事 by 夢幻ノ月夜 » 4年前

今回はCodezineで見つけたコードでタスクシステムを実行させてみたところ(大体何をしているかは分かる)
重大な穴を見つけたような気がしました
まずCodezineの方のリンク貼っておきますね つhttp://codezine.jp/article/detail/297
そして見つけた穴っていうのが
「最初に同じ優先度のタスクを二連続で追加しようとすると固まる」です
動作をチェックして見た限り
オーバーライドされたnewの中でやっている処理に穴があるようで
「タスクリストが空ではないときに
元から入っていたタスクの優先度が全て今追加したい
タスクの優先度と等しいときに末尾に追加する処理が見つからない」んですよ

コード:

// タスクの生成・追加
// タスクは優先度の値が小さい順につなげる
void* Task::operator new(size_t size,float priority)
{
    if(g_buf==NULL) return NULL;  // タスクリストが初期化されていない
    if(m_free+size >= g_buf+MEM_SIZE) return NULL;  // 空き容量不足

    g_size+=(DWORD)size;
    g_count++;

    Task *new_task=(Task*)m_free;
    m_free+=size;

    if(m_active==NULL)    // 現在タスクリストは空
    {
        m_active=(BYTE*)new_task;

        new_task->m_use      = TRUE;
        new_task->m_size     = (DWORD)size;
        new_task->m_pre      = new_task;
        new_task->m_next     = new_task;

        new_task->m_priority = priority;

        return new_task;
    }

    // タスクリストに挿入する

    Task *task,*next;
    for(task=(Task*)m_active;;task=next)
    {
        next=task->m_next;

        if( priority < task->m_priority )   // 同じ優先度なら末尾に挿入←ここで穴があると予想
        {
            if(task==(Task*)m_active)       // 先頭に挿入
            {
                m_active=(BYTE*)new_task;
            }
            new_task->m_pre  = task->m_pre;
            new_task->m_next = task;
            break;
		}

		/*if(next==(Task*)m_active){//←この辺は自分で考えて入れてみたものの予期しない動作しかしませんでした(´・ω・`)
			new_task->m_pre  = task->m_pre;
            new_task->m_next = task;
            break;
		}*/
    }

    new_task->m_use      = TRUE;
    new_task->m_size     = (DWORD)size;
    new_task->m_priority = priority;

    new_task->m_pre->m_next = new_task;
    new_task->m_next->m_pre = new_task;

    return new_task;
}
これは自分が理解が足りないのかそれとも普通にこれ穴なのか…
原因を見つけるためにかなり苦労しましたがこれどうやったら解決すると思いますか?
これが解決できないと今作っているSTGが作れないんですよ
誰か自分と一緒に考えてくれる人はいませんか?
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: Codezineで見つけたタスクシステムを実行してみた結果

#2

投稿記事 by h2so5 » 4年前

たぶんバグだと思います。というか、タスクリスト内の最大のpriority以上のpriorityを持つタスクを追加すると無限ループになります。
いくつか修正すれば直せないことはないですが、コードを変更せずとも応急処置として最初に非常に大きい優先度の数値を持つダミーのタスクを追加すればループを回避できます。

水を差すようで悪いですが、このタスクシステムのサンプルは無駄に複雑なだけで良いものではないので参考にしないほうが良いです。
素直にstd::listとか使ったほうがいいです。

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

Re: Codezineで見つけたタスクシステムを実行してみた結果

#3

投稿記事 by 夢幻ノ月夜 » 4年前

h2so5 さんが書きました:たぶんバグだと思います。というか、タスクリスト内の最大のpriority以上のpriorityを持つタスクを追加すると無限ループになります。
いくつか修正すれば直せないことはないですが、コードを変更せずとも応急処置として最初に非常に大きい優先度の数値を持つダミーのタスクを追加すればループを回避できます。

水を差すようで悪いですが、このタスクシステムのサンプルは無駄に複雑なだけで良いものではないので参考にしないほうが良いです。
素直にstd::listとか使ったほうがいいです。
ダミー作戦決行してみます
std::listってサイズ可変でしたっけ?
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: Codezineで見つけたタスクシステムを実行してみた結果

#4

投稿記事 by h2so5 » 4年前

std::listはサイズ可変です。std::sortと組み合わせれば優先度でソートできます。

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

Re: Codezineで見つけたタスクシステムを実行してみた結果

#5

投稿記事 by 夢幻ノ月夜 » 4年前

h2so5 さんが書きました:std::listはサイズ可変です。std::sortと組み合わせれば優先度でソートできます。
ありがとうございます
それ使いますわ
毎回ゲーム作ろうとするたびに壁にぶち当たる

閉鎖

“C言語何でも質問掲示板” へ戻る