簡體   English   中英

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] 我已經搜索過stackoverflow,但現有的問題和解決方案似乎都不能滿足我的問題。

我正在使用代碼塊。 如果有人可以幫助我,那將非常有幫助。

'X' vs "X"

C++ 不會以相同的方式對待這兩者。
'X'在 C++ 中被視為char

但是第二次使用"" ,含義發生了變化。 現在它被視為字符串文字 或者,一個字符序列 或者,一個char[]

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

怎么指點?

回到我們的例子,為了清楚起見,當我說""意味着一個字符串文字或一個字符序列,所以當你這樣做時

char c = "x";

您正在將一個字符序列分配給一個char 相當於做

char c = "Hello, World!"

那么指針是怎么進來的呢? 如果您對指針一無所知,這將有點難以理解。

指針只是地址。 我可以創建一個指針並給它任何東西的地址,一個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') //...

也參考這個帖子,雖然是C語言,但是概念是一樣的。

雙引號中的字符表示指向這些字符的零結尾字符串的指針,無論字符數是多少。

所以“O”不是一個字符。它是一個指向零結尾的字符串的指針。

'O' 是一個字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM