Объявление базового синтаксического массива

#c

#c

Вопрос:

Если я использую значение int в качестве размера массива при объявлении нового массива, lint жалуется. Каков правильный способ решить эту проблему:

Я мог бы статически преобразовать int в unsigned, но это выглядит немного странно…

Каков наилучший способ решить эту проблему без изменения использования массива и необходимости использования целого числа в качестве размера?

 MapItemPtr* pMapItems = new MapItemPtr[ (unsigned int)iRecordCount ];
  

Можно было бы сделать:

 MapItemPtr* pMapItems = new MapItemPtr[static_cast<unsigned int>( iRecordCount )];
  

Является ли это правильным способом устранения ошибки lint:
Ошибка 737 строки 3811: переход с int на unsigned int при переходе с int на unsigned int

или есть более элегантный способ?

Комментарии:

1. Вы отправляете 7 вопросов, не размещаете голосов и не принимаете ответов.

2. В настоящее время вы не возвращаете свой вклад в это сообщество.

3. Вау, я этого не знал. Когда кто-то отвечал, я всегда просто отвечал сообщением с благодарностью. Я не понимал, что могу делать такие вещи. Я вернусь к своим сообщениям и исправлю.

4. Да, вы всегда должны повышать голос за те, которые вам нравятся, и принимать тот, который наилучшим образом решает вашу проблему (если какой-либо из них подходит).

Ответ №1:

Поскольку iRecordCount явно предназначено для хранения неотрицательного целого числа, почему бы просто не объявить его как unsigned int в первую очередь?

Комментарии:

1. Действительно, это должно быть size_t .

2. Но если iRecordCount является постоянным целочисленным выражением (как и должно быть, если оно используется в качестве измерения массива), lint, безусловно, не имеет оснований жаловаться на это здесь.

3. Да, я согласен. Даже когда переменная имеет значение const int и значение больше 0, она все еще жалуется, что, я думаю, неправильно. Переменная не может быть изменена, поскольку она является const . Возможно, lint неправильно оценивает код в этой ситуации?

Ответ №2:

Ошибка заключается не в константности переменной, как сказано в lint:

  : Line 3811 Error 737: Loss of sign in promotion from int to unsigned int.
  

У вас есть несколько вариантов:

Приведение 1 — static_cast<> int к unsigned int ,
2 — (unsigned int*) в стиле c, но этого следует избегать в коде c .
3 — создайте временную unsigned int переменную, которая создаст вектор для вас.

поскольку вы просто создаете массив, тип переменной может быть size_t , объявленный в cstddef .

Комментарии:

1. Спасибо за все ваши советы, ребята. Я просто изменил int на unsigned int, поскольку это кажется наиболее практичным? Я отметил галочкой ответ. Итак, как мне теперь проголосовать? Как вы можете сказать как программист, у меня довольно шокирующие навыки в области ИТ, ха-ха.