суббота, 26 мая 2012 г.

error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

Столкнулся с такой непонятной ошибкой при компиляции кода:
error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

Красным выделена строка. где обнаружена ошибка.

int ShowGround(char** GR)
{char **TempGround;
 TempGround=GR;
 for (int i=0;i<10;i++)
   {for (int k=0;k<10;k++)
      {if (TempGround[i][k]=="0") printf(".");
       else printf("X");
      }
    printf("\n");
   }
  return 0;
}

Порылся в нете и понял, что в отличии от PHP, где  и символы и строки можно ограничивать и двойными кавычками и одинарными, в С++ двойные кавычки полагаются только строкам. А символы не доросли еще до двойных. :о) Для них только одинарные допустимы. :о)

Т.е. правильно должно быть так:
if (TempGround[i][k]=='0') printf(".");

Хотя почему в printf проходит "." не совсем понятно. Похоже, что ограничения к кавычкам срабатывают только при сравнении.

2 комментария:

  1. По-моему, всё логично.
    Эррор логичен: обозначенная кавычками строка есть указатель на char, а указатель нельзя сравнить с самим числом-символом char.
    Исправление логично: в апострофах char, и он сравнивается с char.
    Прокат printf тоже логичен: у него первый параметр строго строка, а строка может состоять и из одного эффективного символа, и вообще их не содержать ("").
    Между прочим, в C/C++ строки всегда заканчиваются символом с кодом 0 (нуль-терминатором). Поэтому '.' и "." суть разные вещи. Первая - тупо символ. Вторая - указатель на строку из двух байт: первый - эффективный символ, второй - нуль-терминатор.

    ОтветитьУдалить
  2. Исчерпывающее объяснение. :о)) Большое спасибо. :о)))

    ОтветитьУдалить