自作タスクリストについて

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

自作タスクリストについて

#1

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

ネットで色々調べて自分なりに使いやすいようにアレンジして作ったタスクシステムが
最近になって「優先順位が適用されてない」ことに気づきました…
優先順位は0.0~1.0までで0.0が一番最初に、1.0が一番最後に描画されるようにしたいです

Taskのメンバは
・m_pre,m_next:前に実行されるタスク・次に実行されるタスクのポインタ
・m_size:タスクのサイズ
・m_priority:優先度

使用している変数は
・g_buf:メモリ領域の先頭のポインタ
・m_count:タスクの数
・m_active:一番最初に実行されるタスクのポインタ
・m_free:タスクを追加できる未使用領域の先頭のポインタ

使用している定数は
MEM_SIZE:最初にまとめて確保したメモリの領域サイズ(byte)

以上だと思います

何が原因で優先度通りに並んでいないのか教えてください

コード:

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!=(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;

			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;
        }
	}
	new_task->m_pre  = task->m_next;
	new_task->m_next = task->m_next->m_next;

    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;
}
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
いわん
記事: 30
登録日時: 8年前

Re: 自作タスクリストについて

#2

投稿記事 by いわん » 8年前

29行目 for文の継続条件式が誤ってるような気がします。

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

Re: 自作タスクリストについて

#3

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

いわん さんが書きました:29行目 for文の継続条件式が誤ってるような気がします。
具体的にどう間違っているのでしょうか?
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
いわん
記事: 30
登録日時: 8年前

Re: 自作タスクリストについて

#4

投稿記事 by いわん » 8年前

for文の継続条件式の判定は初期化式実行直後にも行われます。
最初から偽の判定となれば1回もループ処理を行なわないわけです。
初期化式と継続条件式をじっくり見比べてみれば気づくと思いますが・・・

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

Re: 自作タスクリストについて

#5

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

いわん さんが書きました:for文の継続条件式の判定は初期化式実行直後にも行われます。
最初から偽の判定となれば1回もループ処理を行なわないわけです。
初期化式と継続条件式をじっくり見比べてみれば気づくと思いますが・・・
Taskを最初にm_activeにしてその後もう一度Taskがm_activeになるまでループし続けるからまた帰ってくるのではないでしょうか?
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: 自作タスクリストについて

#6

投稿記事 by へにっくす » 8年前

夢幻ノ月夜 さんが書きました:

コード:

for(task=(Task*)m_active;task!=(Task*)m_active;task=next)
1.初期化式:task = (Task*)m_active;
2.継続条件式:task != (Task*)m_active;
3.再初期化式:task = next;

1.のあとの2.は偽になることは分かりますよね?
forの中の処理には全く入らない気がするのですが。
1.→forの中の処理→2.→3.→forの中の処理→・・・ではなく、
1.→2.→forの中の処理→3.→2.→forの中の処理→3.・・・という流れですよ
最初の一回は必ず通したいなら、私だったらforでなくdo~whileを使いますが。

てゆーか、
forの中が実行されてるかprintfとかで調べられないの?
そうすればすぐわかることでは。
written by へにっくす

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

Re: 自作タスクリストについて

#7

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

へにっくす さんが書きました:
夢幻ノ月夜 さんが書きました:

コード:

for(task=(Task*)m_active;task!=(Task*)m_active;task=next)
1.初期化式:task = (Task*)m_active;
2.継続条件式:task != (Task*)m_active;
3.再初期化式:task = next;

1.のあとの2.は偽になることは分かりますよね?
forの中の処理には全く入らない気がするのですが。
1.→forの中の処理→2.→3.→forの中の処理→・・・ではなく、
1.→2.→forの中の処理→3.→2.→forの中の処理→3.・・・という流れですよ
最初の一回は必ず通したいなら、私だったらforでなくdo~whileを使いますが。

てゆーか、
forの中が実行されてるかprintfとかで調べられないの?
そうすればすぐわかることでは。
do~whileですか…やってみます
毎回ゲーム作ろうとするたびに壁にぶち当たる

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

Re: 自作タスクリストについて

#8

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

どうやらこうやったら優先度が有効な順番になったようです
ありがとうございました

コード:

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, *act;
	act=(Task*)m_active;
	int equal=0;
	int dainari=0;
    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;
        }else if(priority == task->m_priority)equal++;
		else dainari++;

		if(equal == g_count){
			new_task->m_pre  = task->m_pre;
            new_task->m_next = task;
			break;
		}
		if(dainari == g_count){
			new_task->m_pre  = act->m_pre;
            new_task->m_next = act;
			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;
}
毎回ゲーム作ろうとするたびに壁にぶち当たる

閉鎖

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