[英]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
}
因此,我已經遍歷了很多遍代碼,沒有看到任何非法操作。 使我感到困惑的部分是雙指針有時會起作用,有時卻不會。 我使用全局實體指針(始終有效)進行了測試,以比較我的實體移動功能,以測試被刪除的節點是否與在實體刪除功能中設置的節點匹配。
此描述有點抽象,如果需要進一步說明,請告訴我。
有成千上萬的解決方案無法解決您的確切問題。
以下是一些建議:
等等
旁注 :你不應該在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.