C++中传递布尔一维数组指针时出现类型不兼容错误的问题求助
我来帮你拆解这个问题的核心原因,再一步步告诉你怎么搞定它~
首先,你碰到的编译器错误argument of type "bool **" is incompatible with parameter of type "bool *",本质是你对c_set和o_set的声明完全搞错了类型:
你现在写的bool* c_set[size];,它的真实含义是「一个包含size个bool*指针的数组」(也就是指针数组),类型是bool*[size],当传递给函数时会自动退化为bool**;但你的is_connected函数参数要求的是bool*(指向一维bool数组的指针),这就直接导致了类型不兼容,编译器自然会报错。
另外你误以为能正常运行的测试程序,其实也藏着大问题:测试里的bool* a[size];同样是指针数组,而且你完全没给这些指针分配内存,直接在set函数里写a[i] = true;本质是给野指针赋值,属于未定义行为,只是刚好没崩溃而已,逻辑完全不对。
解决核心问题:修正c_set和o_set的类型
你真正需要的是一维bool数组,用来记录每个节点是否属于闭合/开放集合。根据你的代码风格,有两种靠谱的修正方案:
方案1:用栈上的一维数组(适合编译期固定size的场景)
因为你的size是const int,C++11及以后支持这种常量长度的栈数组,直接把声明改成这样:
int main(){ const int size = 7; // 直接声明为一维bool数组,不用搞指针 bool c_set[size]; bool o_set[size]; // ... 其他代码保持不变 }
这时候你把c_set和o_set传给is_connected时,数组会自动退化为bool*类型,和函数参数的要求完全匹配,编译器报错直接消失。
方案2:用动态分配的一维数组(更灵活,支持运行期size)
如果你以后需要让size变成运行时决定的变量,推荐用动态分配:
int main(){ const int size = 7; // 动态分配size个bool的一维数组,返回的就是bool*类型 bool* c_set = new bool[size]; bool* o_set = new bool[size]; // ... 其他代码 // 记得程序结束前释放内存,避免内存泄漏 delete[] c_set; delete[] o_set; // 别忘了也要释放graph的内存 for(int i=0; i<size; i++){ delete[] graph[i]; } delete[] graph; return 0; }
这种方式下c_set本身就是bool*类型,和is_connected的参数完美匹配,同样能解决类型错误。
额外的两个小坑(提前帮你避开)
prob函数的随机数逻辑错了
你现在的prob返回的是int类型的0或1,所以prob() < 0.19的概率其实是50%(只有返回0时成立),完全达不到你想要的19%概率生成边。改成生成0.0到1.0的浮点数才对:
double prob(){ // 把生成器和分布声明为static,避免每次调用都重新初始化,保证随机性 static std::random_device rand_dev; static std::mt19937 generator(rand_dev()); static std::uniform_real_distribution<double> distr(0.0, 1.0); return distr(generator); }
is_connected的逻辑有明显问题
你当前的连通性检测逻辑会提前错误返回false,建议用标准的BFS或DFS实现:
比如BFS的核心逻辑是:
- 初始化队列(开放集合),把起始节点加入
- 标记起始节点已访问
- 循环取出队列中的节点,遍历所有邻接节点,未访问的就加入队列并标记
- 最后检查所有节点是否都被访问过
先把c_set和o_set的类型问题搞定,解决编译器报错,再调整随机数和连通性检测的逻辑,你的程序就能正常跑起来啦~
内容来源于stack exchange

