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 是怎么进来的呢?如果你对指针一无所知,这会有点难以理解。

指针只是地址。我可以创建一个指针并给它任何东西的地址,intchardouble..没关系,它只是保存那个对象的内存地址.
同样,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语言,但是概念是一样的