ISO C++ 禁止比较指针和整数 [-fpermissive][c++]
ISO C++ forbids comparison between pointer and integer [-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]
。我搜索了 Whosebug,但 none 的现有问题和解决方案似乎可以满足我的问题。
我正在使用代码块。
如果有人能帮助我,那将是非常有帮助的。
双引号中的字符代表一个指向这些字符的zero-end串的指针,无论字符数是多少。
所以“O”不是 char.It 而是指向 zero-ended 字符串的指针。
'O' 是一个字符。
'X' vs "X"
C++ 对这两者的处理方式不同。
'X'
在 C++ 中被视为 char
。
但是第二次使用 ""
,意思就变了。现在它被视为 string literal。或者,字符序列。或者,char[]
.
char c = 'X';
char c = "X"; // how dare you
怎么指点?
回到我们的例子,为了清楚起见,当我说 ""
意味着字符串文字或字符序列时,所以当你做
char c = "x";
您正在将 字符序列 分配给 char
。相当于做
char c = "Hello, World!"
那么 pointer 是怎么进来的呢?如果你对指针一无所知,这会有点难以理解。
指针只是地址。我可以创建一个指针并给它任何东西的地址,int
、char
、double
..没关系,它只是保存那个对象的内存地址.
同样,char*
将指向可以解释为 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'};
然后将return第一个元素的地址f
赋值给变量str
。所以现在 str
指向字符数组中的第一个元素。
因此,您可以假设它将 "foo"
视为指针。并且由于 ""
表示字符串文字,因此在您的情况下它将 "O"
视为指针。
所以我们你做mat[x][y] == "O"
,你在比较int == char*
。
因此,mat[x][y] == "o"[0]
将起作用,因为现在您将访问刚刚构造的数组的第一个元素。
解决方案
解决方法是改用''
。
if (mat[x][y] == 'O') //...
也参考thispost,虽然是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]
。我搜索了 Whosebug,但 none 的现有问题和解决方案似乎可以满足我的问题。
我正在使用代码块。 如果有人能帮助我,那将是非常有帮助的。
双引号中的字符代表一个指向这些字符的zero-end串的指针,无论字符数是多少。
所以“O”不是 char.It 而是指向 zero-ended 字符串的指针。
'O' 是一个字符。
'X' vs "X"
C++ 对这两者的处理方式不同。
'X'
在 C++ 中被视为 char
。
但是第二次使用 ""
,意思就变了。现在它被视为 string literal。或者,字符序列。或者,char[]
.
char c = 'X';
char c = "X"; // how dare you
怎么指点?
回到我们的例子,为了清楚起见,当我说 ""
意味着字符串文字或字符序列时,所以当你做
char c = "x";
您正在将 字符序列 分配给 char
。相当于做
char c = "Hello, World!"
那么 pointer 是怎么进来的呢?如果你对指针一无所知,这会有点难以理解。
指针只是地址。我可以创建一个指针并给它任何东西的地址,int
、char
、double
..没关系,它只是保存那个对象的内存地址.
同样,char*
将指向可以解释为 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'};
然后将return第一个元素的地址f
赋值给变量str
。所以现在 str
指向字符数组中的第一个元素。
因此,您可以假设它将 "foo"
视为指针。并且由于 ""
表示字符串文字,因此在您的情况下它将 "O"
视为指针。
所以我们你做mat[x][y] == "O"
,你在比较int == char*
。
因此,mat[x][y] == "o"[0]
将起作用,因为现在您将访问刚刚构造的数组的第一个元素。
解决方案
解决方法是改用''
。
if (mat[x][y] == 'O') //...
也参考thispost,虽然是C语言,但是概念是一样的