首页 > 解决方案 > 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,但现有的问题和解决方案似乎都不能满足我的问题。

我正在使用代码块。如果有人可以帮助我,那将非常有帮助。

标签: c++codeblocks

解决方案


'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语言,但是概念是一样的。


推荐阅读