2016-12-30 85 views
-1

由於無法創建引用(是否存在?)我必須使用指向另一個指針的指針來執行此操作。這給了我一個錯誤:Pascal指針指針SyntaxError和不兼容類型

type 
    PNode = ^TNode; 
    TNode = record 
    char: char; 
    next: PNode; 
    children: PNode; 
    end; 

    PPNode = ^PNode; 
var 
    current_node: PPNode; 
function find_or_insert_peer(var node: PNode; character: char): PNode; 

current_node := @find_or_insert_peer(current_node^, character)^.children; 

x.pas(121,23) Error: Incompatible types: got "<address of function(var PNode;Char):^TNode;Register>" expected "PPNode" 
x.pas(121,43) Fatal: Syntax error, ";" expected but "(" found 
Fatal: Compilation aborted 

我也試過,但它並不能編譯,因爲的SyntaxError

current_node := @(find_or_insert_peer(current_node^, character)^.children); 

編輯

請幫助。我甚至用C++創建了一個演示來向你展示這是合法的。 http://cpp.sh/8mxe

+2

爲什麼你認爲在'current_node'賦值時需要@ @? – MartynA

+1

你試圖將'find_or_insert_peer'函數的地址分配給'PPNode',並且顯然不起作用。實際上**在錯誤信息中讀取單詞**非常重要,它清楚地告訴您問題是什麼以及兩種類型之間爲什麼不兼容。 –

+0

@KenWhite我做到了,這就是爲什麼我試圖添加圓括號來強調我想要記錄的地址(記錄指針由函數返回)的屬性。我只讀了一個SyntaxError – Adam

回答

0

正如在一個機智的文章「Addressing pointers」中提到的鏈接評論@運算符可能無法正常工作與更復雜的表達式。它的等效addr()將做的伎倆。

current_node := addr(find_or_insert_peer(current_node^, character)^.children);