c++ - ISO C++ 禁止指针和整数之间的比较 [-fpermissive][c++]
问题描述
我对 c++ 相当陌生,并且正在解决一些 ds 算法问题。从过去的 24 小时开始,我一直坚持这一点。
/*Find shortest distance of every cell from landmine in a maze*/
#include <iostream>
#include <algorithm>
#include <queue>
#include <climits>
struct cell{
int x, y;
};
const int M = 6, N = 5;
int row[4] = {-1, 0, 1, 0};
int col[4] = {0, -1, 0, 1};
bool isValidandSafeObject(int x, int y, char mat[][N], int minDist[][N]){
if ((x >= 0 && x < M) && (y >= 0 && y < N) ){
if (mat[x][y] == "O") && (minDist[x][y] == -1){
return true;
}
}
return false;
}
int[][N] updateDistance( char field[][N]){
int minDist[M][N];
queue<cell> Q;
for (int i = 0; i < M ; i++){
for ( int j = 0; j < N; j++){
if (field[i][j] == "M"){
Q.push({i, j})
minDist[i][j] = 0;
}
else{
minDist[i][j] = -1;
}
}
}
while (!Q.empty()){
int x = Q.front().x;
int y = Q.front().y;
Q.pop();
for( int k = 0; k < 4; k++){
i = x + row[k];
j = y + col[k];
if isValidandSafeObject( i, j, field, minDist){
Q.push({i, j});
minDist[i][j] += 1;
}
}
}
return minDist;
}
void main(){
char mat[][N] =
{
{'O', 'M', 'O', 'O', 'X'},
{'O', 'X', 'X', 'O', 'M'},
{'O', 'O', 'O', 'O', 'O'},
{'O', 'X', 'X', 'X', 'O'},
{'O', 'O', 'M', 'O', 'O'},
{'O', 'X', 'X', 'M', 'O'}
};
int minDist[M][N];
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
std::cout << std::setw(5) << updateDistance(mat);;
std::cout << '\n';
}
}
在第 20 行,if (mat[x][y] == "O") && (minDist[x][y] == -1){
我收到错误消息ISO C++ forbids comparison between pointer and integer [-fpermissive]
。我已经搜索过stackoverflow,但现有的问题和解决方案似乎都不能满足我的问题。
我正在使用代码块。如果有人可以帮助我,那将非常有帮助。
解决方案
'X' vs "X"
C++ 不会以同样的方式对待这两者。在 C++ 中
'X'
被视为 a 。char
但是你使用的第二个""
,意思就改变了。现在它被视为字符串文字。或者,一个字符序列。或者,一个char[]
.
char c = 'X';
char c = "X"; // how dare you
怎么指点?
回到我们的例子,为了清楚起见,当我说""
暗示一个字符串文字或一个字符序列时,所以当你这样做时
char c = "x";
您正在将一系列字符分配给char
. 相当于做
char c = "Hello, World!"
那么指针是怎么进来的呢?如果您对指针一无所知,这将有点难以理解。
指针只是地址。我可以创建一个指针并给它任何地址,一个int
, char
, double
.. 没关系,它只是保存该对象的内存地址。
同样, achar*
将指向可以解释为 a 的东西char
。
int a = 5;
int ptr_to_a = &a; // ptr_t_a now holds the address of a
但是有一些奇怪的东西,以这段代码为例
const char* str = "foo"; // valid!
如果指针存储地址,它如何存储字符序列?C++ 会偷偷地,或者隐式地将下面的代码转换成这个。
char sequence[] = {'f','o','o'};
在此之后,它将返回第一个元素的地址,即f
,并将其分配给变量str
。所以现在str
指向字符数组中的第一个元素。因此,您可以假设它将"foo"
视为指针。由于""
is 暗示了一个字符串文字,在你的情况下它被视为"O"
一个指针。
所以我们你做mat[x][y] == "O"
,你在比较int == char*
。
因此,mat[x][y] == "o"[0]
它将起作用,因为现在您将访问刚刚构建的数组的第一个元素。
解决方案
解决方案是''
改用。
if (mat[x][y] == 'O') //...
也可以参考这个帖子,虽然是C语言,但是概念是一样的。
推荐阅读
- vb.net - 间隔小于 1 秒的 WQL 查询
- c++ - 模板类中非模板(但类型特定)函数的 C++ 使用
- javascript - 哪些因素决定了 Javascript 应用程序的内存使用情况?
- javascript - Multer TypeError:无法读取未定义的属性“文件名”
- reactjs - 我如何在 React rsuite 库中重置表单?
- ssl - 对带有 www 的子域使用 Cloudflare SSL 证书
- sql - distinct 和 Over 分区
- javascript - 如何在Firefox的浏览器控制台中定期/按键执行js代码而无需打开它?
- java - GoogleMaps CancelableCallback 不会改变我的相机角度和位置。我究竟做错了什么?
- swift - 使用不同的 iCloud/CloudKit 用户运行 macOS 11 应用程序