ISO C ++禁止比较指针和整数[-fpermissive] [c ++]

问题描述

对于C ++和实践一些ds algo问题我是相当陌生的。从过去的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,1,0};
int col[4] = {0,-1,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','X'},{'O','X','M'},'O'},'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,但是现有的问题和解决方案似乎都不能满足我的问题。

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

解决方法

'X' vs "X"

C ++对这两种方法的处理方式不同。
'X'在C ++中被视为char

但是您第二次使用""时,含义会改变。现在将其视为string literal。或者,字符序列。或者,一个char[]

char c = 'X'; ?
char c = "X"; // how dare you

指针如何?

回到我们的示例,为了清楚起见,当我说""表示字符串文字或字符序列时,

char c = "x";

您正在将{strong>字符顺序分配给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'};

然后,它将返回第一个元素的地址f,并将其分配给变量str。因此,str现在指向字符数组中的第一个元素。 因此,您可以假定它将"foo"视为指针。而且由于""暗含字符串文字,因此在您的情况下,它将"O"视为指针。

所以我们做mat[x][y] == "O",您正在比较int == char*
因此,mat[x][y] == "o"[0]将起作用,因为现在您将访问刚构造的数组的第一个元素。

解决方案

解决方案是改用''

if (mat[x][y] == 'O') //...

也可以参考this帖子,尽管它是C语言,但概念是相同的。

,

双引号字符表示一个指向这些字符的零位字符串的指针,无论字符数是多少。

所以“ O”不是一个字符。它是一个零位字符串的指针。

“ O”是一个字符。