1

ベクトルを返すANTLRルールがあります:

main returns [std::vector<int> v]
        :
        ('ERROR' t3=INT{v.push_back(atoi((const char*)$t3.text->chars));}
        '='t4=INT{v.push_back(atoi((const char*)$t4.text->chars));}
        );

次に、C ++から呼び出して、ベクターデータを取得しようとします。

ただし、私の問題は、ANTLR3がベクトルvをNULLに自動的に初期化することです。これは許可されておらず、エラーが発生します。

antlrのC++出力を生成し、プロジェクトでコンパイルしようとすると、エラーが発生します。

ANTLRが出力するparsedfileに手動で移動し、NULLオプションへの設定を削除して再度コンパイルすると、すべてがうまくいきました。

私はおそらくこの問題の解決策を見ることができます:

1)ANTLRから自分でベクトルを初期化する(ベクトルを初期化する方法を知らない)

2)ANTLRが私のベクターを初期化するのを防ぎます(それができるかどうかわからない)

3)常に手動で初期化を変更します(お勧めできません)

4)ベクトルを返す別の方法を見つけ、配列へのポインターを返そうとすると、次のエラーが発生します。

error: conversion from ‘std::vector<int, std::allocator<int> >*’ to non-scalar type ‘std::vector<int, std::allocator<int> >’ requested

何か助けはありますか?

4

2 に答える 2

3

私はあなたがこのようなことをしたいと思います:

main returns [std::vector<int> *v]
:
@init { v = new std::vector<int>(); }
( rule content, using *v in actions );

その後、ANTLRは戻り値をNULLに初期化できますが、これは常にそうだと思います。@initブロックは、使用する空のベクトルを作成します。

もちろん、潜在的なメモリリークを回避するために、shared_ptrのようなスマートポインタを実際に使用することもできます。

于 2012-12-06T18:29:45.573 に答える
0

次の方法でベクトルを初期化できます。

vector<int> a(2,3); //vector a contains 2 elements: 3 and 3
a[0] = 4;//vector a contains 2 elements: 4 and 3
vector<int> b;
b = a;

そして、ここで確認できる他の方法がいくつかあります:http ://www.cplusplus.com/reference/vector/vector/vector/

編集:

ゼロで初期化する場合:

vector<int> a(2);

作業を行う必要がある場合、ベクトルaには2つのゼロが含まれます。

于 2012-12-02T01:40:53.930 に答える