C++,ANTLR and VECTORS
C++,ANTLR and VECTORS
我有一个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 输出的解析文件并删除了 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
有什么帮助吗?
我想你想做这样的事情:
main returns [std::vector<int> *v]
:
@init { v = new std::vector<int>(); }
( rule content, using *v in actions );
然后,ANTLR 可以将您的返回值初始化为 NULL,我认为它总是这样做。 @init块创建一个空向量供您使用。
当然,您还需要实际使用像shared_ptr这样的智能指针来避免潜在的内存泄漏。
您可以通过以下方式初始化向量:
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 个零。
相关文章:
- Codecademy - Vectors: Operations
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- C++,ANTLR and VECTORS
- c++ vectors and push_back
- visual studio 2010 - C++ Vectors and OpenGL