2016-12-30 3 views
-1

Refereceを作成する方法はありません(そこにはありますか?)私は別のポインタへのポインタでそれを行う必要があります。これは私にエラーを与える:ポインタへのパスカル構文エラー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'に代入しようとしていますが、これはうまくいきません。実際に**エラーメッセージに**という言葉を読むことは本当に重要です。エラーメッセージには、問題の内容と、2つのタイプが互換性がない理由が明確に分かります。 –

+0

@KenWhite私は、レコードのアドレス(レコードポインタが関数によって返されたもの)のプロパティを必要とすることを強調する括弧を追加しようとしました。私は唯一のSyntaxError – Adam

答えて

0

コメントでリンクされているウィジェット記事 "Addressing pointers"に記載されているように、@オペレータはより複雑な表現では正しく動作しない可能性があります。その同等のaddr()がそのトリックを行います。

current_node := addr(find_or_insert_peer(current_node^, character)^.children); 
関連する問題