#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, поскольку это кажется наиболее практичным? Я отметил галочкой ответ. Итак, как мне теперь проголосовать? Как вы можете сказать как программист, у меня довольно шокирующие навыки в области ИТ, ха-ха.