从 Z3_ast_vector 创建 Z3_ast 数组时出现段错误
Seg fault while creating an array of Z3_ast from Z3_ast_vector
基本上,我想对许多 expr
进行 OR(多次)。我最终创建了那些 expr
的向量,并从向量创建了一个数组,然后使用 Z3_mk_or
。但是代码抛出段错误。
expr x = c.bool_const("x");
expr y = c.bool_const("y");
expr z = c.bool_const("z");
int s=0;
int size;
Z3_ast* args;
Z3_ast_vector vec;
while(s < 2)
{
Z3_ast_vector_push(c, vec, x);
Z3_ast_vector_push(c, vec, y);
Z3_ast_vector_push(c, vec, z);
std::cout << "size: " << Z3_ast_vector_size(c, vec) << "\n";
size = Z3_ast_vector_size(c, vec);
args = new Z3_ast[size];
for(int i=0; i<size; ++i)
{
args[i] = Z3_ast_vector_get(c, vec, i);
}
expr r = to_expr(c, Z3_mk_or(c, size, args));
s++;
Z3_ast_vector_resize(c, vec, 0);
}
此外,这是解决我的问题的正确方法吗?难道没有更简单的 API 调用 OR 许多 bool 常量吗?
你能试试辅助功能吗:
inline expr or(expr_vector const& args) {
array<Z3_ast> _args(args);
Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
args.check_error();
return expr(args.ctx(), r);
}
为了方便起见,我会添加这个,但是使用 C API 中的函数很容易出错,所以最好坚持使用 z3++.h
中提供的功能
基本上,我想对许多 expr
进行 OR(多次)。我最终创建了那些 expr
的向量,并从向量创建了一个数组,然后使用 Z3_mk_or
。但是代码抛出段错误。
expr x = c.bool_const("x");
expr y = c.bool_const("y");
expr z = c.bool_const("z");
int s=0;
int size;
Z3_ast* args;
Z3_ast_vector vec;
while(s < 2)
{
Z3_ast_vector_push(c, vec, x);
Z3_ast_vector_push(c, vec, y);
Z3_ast_vector_push(c, vec, z);
std::cout << "size: " << Z3_ast_vector_size(c, vec) << "\n";
size = Z3_ast_vector_size(c, vec);
args = new Z3_ast[size];
for(int i=0; i<size; ++i)
{
args[i] = Z3_ast_vector_get(c, vec, i);
}
expr r = to_expr(c, Z3_mk_or(c, size, args));
s++;
Z3_ast_vector_resize(c, vec, 0);
}
此外,这是解决我的问题的正确方法吗?难道没有更简单的 API 调用 OR 许多 bool 常量吗?
你能试试辅助功能吗:
inline expr or(expr_vector const& args) {
array<Z3_ast> _args(args);
Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
args.check_error();
return expr(args.ctx(), r);
}
为了方便起见,我会添加这个,但是使用 C API 中的函数很容易出错,所以最好坚持使用 z3++.h
中提供的功能