簡體   English   中英

雙指針不一致(鏈接列表)

[英]Inconsistent double pointer (linked list)

我正在開發一個游戲,該游戲使用游戲中實體的鏈接列表。 我發現我認為是某種錯誤。 注意,我正在用C進行編碼。但是在使用C指針遇到這種麻煩之后,我正在考慮嘗試使用C ++技術。

在我的調試測試中,兩個彈丸相撞,炸毀了兩個彈丸。 基本上情況是這樣的:

從實體的移動功能開始:1)射彈實體移動2)遍歷所有實體,檢查在此新位置的碰撞3)如果發生碰撞(在這種情況下,在射彈之間,則將兩者都移除)

我將實體的雙指針傳遞給發生沖突的函數。 該實體可能會被刪除,但是我仍然需要使用它來將實體推進到列表中的下一個實體(在while循環中)。 如果那沒有意義,則將其視為:

    ENTITY *node;

    while (node)
    {
        ...

        entity_do_collision (&node); // <-- node may be removed in this function

        //Debug
        if (node == global_node)
        {
        }
        else
            node = global_node;

        node = node->next; // <-- pass a double pointer above so this works here
    }

因此,我已經遍歷了很多遍代碼,沒有看到任何非法操作。 使我感到困惑的部分是雙指針有時會起作用,有時卻不會。 我使用全局實體指針(始終有效)進行了測試,以比較我的實體移動功能,以測試被刪除的節點是否與在實體刪除功能中設置的節點匹配。

此描述有點抽象,如果需要進一步說明,請告訴我。

有成千上萬的解決方案無法解決您的確切問題。

以下是一些建議:

  1. 請勿在碰撞時從容器中刪除對象,而是將其標記為“已死”。 碰撞檢測完成后,通過單獨的通道清理“死”的物體。
  2. 將它們標記為在碰撞時已死亡,但完全不能刪除。 只是將標記的節點重用於將來的實體。
  3. (2)的改進:對容器進行排序,使“死”實體走到尾部並標記容器的大小,因為它僅包含“活着的”實體
  4. (1),(2),(3)的改進:實現某種“垃圾收集”,因此將清理“死”實體,比如說每秒或一次幀或達到內存閾值時。

等等

旁注 :你不應該在21的世紀使用鏈表(高速緩存層次結構的時代,預取,亂序執行和mutithreading),除非你真的, 真的沒有其他選擇,你知道你在做什么。 默認使用數組,只有在您認為合理的情況下才使用其他數組。

更多信息:

原始代碼:

ENTITY *node;

    while (node)
    {
        ...

        entity_do_collision (&node); // <-- node may be removed in this function
        node = node->next;
        /* the function can have changed node's value
        ** but on the next iteration ( on the **value** of node->next)
        ** the original node->next will not be affected!
        */
    }

使用指針tot指針的示例代碼:

ENTITY **pp;
for (pp = &global_node; *pp; pp = &(*pp)->next)
    {
        ...

        entity_do_collision (pp); // <-- *pp  (= node) may be removed in this function

        ...
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM