Назначьте минимальное значение для char C ++ - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь присвоить минимальное значение символа для переменной типа char, например, вот так:

char charchar_value[MAX_VARCHAR_LENGTH + 1]= CHAR_MIN;

это дает мне эту ошибку "несовместимые типы при назначении" char "для" char [513] "

Ответы [ 3 ]

1 голос
/ 27 марта 2012

Инициализация объекта массива требует использования списка инициализатора фигурной скобки, то есть что-то вроде

char charchar_value[MAX_VARCHAR_LENGTH + 1] = { val_0, val_1, /*...*/ val_n };

Это приведет к инициализации первых n значений их соответствующими значениями, а всех остальных - к нулю. Это не совсем то, что вы хотите. Единственный способ установить значения в массиве - после его инициализации, например, используя std::fill()

std::fill(std::begin(charchar_value), std::end(charchar_value),
          std::numeric_limits<char>::min());

Так как есть еще одно предложение, рекомендующее использовать по существу подход C:

  • Использование memset() ограничено типами без каких-либо функций C ++ (как, впрочем, и в случае char), а при установке значения, отличного от 0, оно в значительной степени ограничено char (да, я понял, что есть случаи, когда это все равно будет работать). std::fill(), с другой стороны, работает с любым типом, который является CopyAssignable, и с любым значением, присваиваемым объекту соответствующего типа.
  • Хотя использование sizeof() в этом случае работает, оно не сработает, как только размер станет динамическим, но компилятор все равно с радостью примет код. Получить указатель std::begin() или std::end() не удастся.
  • В контексте, где тип точно не известен, например, если это typedef или шаблон, у std::numeric_limits<T>::min() больше шансов на работу. Это все еще не будет работать для многих типов, так как не определено min(), но область действия больше.

Все это говорит о том, что я бы вместо этого использовал соответствующий класс, который выполняет инициализацию напрямую, т.е.

std::vector<char> charchar_value(MAX_VARCHAR_LENGTH + 1,
                                 std::numeric_limits<char>::min());

Это распределяет память динамически, то есть не полностью эквивалентно. Однако, если нет веских оснований предполагать обратное, я бы использовал простой подход и оптимизировал его, только если это необходимо.

1 голос
/ 26 марта 2012

Если вы просто хотите установить первый элемент на CHAR_MIN, то это будет:

char charchar_value[MAX_VARCHAR_LENGTH + 1] = { CHAR_MIN };

Если вы хотите инициализировать весь массив на CHAR_MIN, тогда это будет:

char charchar_value[MAX_VARCHAR_LENGTH + 1];

memset(charchar_value, CHAR_MIN, sizeof(charchar_value));
0 голосов
/ 29 октября 2012

Определите минимальное и максимальное значения для следующих типов данных в C ++:

g)  char
h)  int
i)  float
j)  double
...