VC ++ компилятор и преобразование типов? - PullRequest
0 голосов
/ 17 апреля 2009

Когда я переместил программу с Mac на этот ПК с Windows, компилятор VC ++ 2008 выдает мне ошибки при передаче целых чисел без знака в функцию cmath pow (). Как я понимаю, эта функция не перегружена, чтобы принимать что-либо, кроме чисел с плавающей запятой.

Есть ли какой-нибудь флаг / параметр компилятора, который игнорирует эти ошибки? Также кто-нибудь знает, как найти документацию по компилятору VC ++?

Редактировать

Это не предупреждение , это ошибка . Однако для меня это не проблема, так как моя программа имеет дело только с числами, которые выдаются как целые числа, поэтому мне все равно, что они не являются числами с плавающей точкой. Если бы это были просто предупреждения, я бы продолжил свою жизнь, но это не позволяет мне компилировать. Можно ли как-то подавить ошибки? Как я уже сказал, ошибки не появляются на моем Mac, и программа в порядке.

Ответы [ 6 ]

3 голосов
/ 17 апреля 2009

Что касается других ответов здесь, не рекомендуется указывать автору вопроса отключить это предупреждение. Его код не работает - он передает без знака int вместо float. Вы должны сказать ему, чтобы исправить свой код!

Это не предупреждение, а ошибка. Однако для меня это не проблема, так как мой Программа имеет дело только с числами, которые выходят как целые числа, поэтому мне все равно, они не плавает. Если бы это были просто предупреждения, я бы продолжил свою жизнь, но это не так позвольте мне скомпилировать. Можно ли как-то подавить ошибки? Как я уже сказал, ошибки не подходит к моему Mac, и программа в порядке.

Целые числа и числа с плавающей запятой используют различные представления внутренне. Если у вас есть одно и то же число в int и float, битовая комбинация внутри хранилища для них будет совершенно другой . Вы не можете ни при каких обстоятельствах ожидать, что ваш код будет работать, если вы передаете целое число, когда вы должны передавать число с плавающей запятой.

Более того, я утверждаю, что ваш код Mac либо использует молчаливо перегруженную версию этой функции (например, вы работаете на этой платформе, компилируя с C ++), либо вы считаете, что она работает, когда на самом деле она работает случайно или фактически не работает.

Добавление

Ни один из когда-либо написанных компиляторов не может отключать ошибки.

Предупреждение означает , что компилятор считает, что вы допустили ошибку .

Ошибка означает компилятор не знает, что делать .

1 голос
/ 17 апреля 2009

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

В C, решение заключается в простом приведении целых чисел к удвоениям:

pow((double)i, (double)j)

В C ++ вы можете сделать то же самое, хотя вы должны использовать приведение в стиле C ++:

pow(static_cast<double>(i), static_cast<double>(j))

Но лучше использовать перегрузку, предоставляемую C ++:

std::pow(static_cast<double>(i), j);

Основание все еще должно быть значением с плавающей запятой, но показатель степени может быть целым, по крайней мере,

Префикс std ::, вероятно, не нужен (большинство компиляторов также делают функцию доступной в глобальном пространстве имен).

Конечно, чтобы получить доступ к версиям функции на C ++, вы должны включить версию заголовка на C ++.

Так что вместо #include <math.h> вам нужно #include <cmath>

C ++ предоставляет версии C ++ для каждого заголовка C, используя это соглашение об именах. Если заголовок C называется foo.h, версия C ++ будет cfoo. Когда вы пишете на C ++, вы всегда должны отдавать предпочтение этим версиям.

0 голосов
/ 17 апреля 2009

Не игнорируйте это или любые предупреждения. Исправь их. Компилятор - ваш друг, пытающийся заставить вас написать хороший код. Это друг, который верит в жесткую любовь, но это твой друг.

Если у вас есть unsigned int и вам нужен float, конвертируйте unsigned in в float.

И MSDN Library - это документация как для реализации языка VC ++, так и для самой IDE.

0 голосов
/ 17 апреля 2009

C ++ имеет перегрузки для pow / powf для int показателей. Обратите внимание на предупреждение.

0 голосов
/ 17 апреля 2009

Как уже упоминал Мехрэд, используйте синтаксис #pragma warning для отключения предупреждения. Документация здесь - http://msdn.microsoft.com/en-us/library/2c8f766e.aspx

Я был бы склонен исправить предупреждения, а не скрывать их!

0 голосов
/ 17 апреля 2009

Я не знаю флага, но избавиться от предупреждений было достаточно легко для меня. Просто дважды щелкните по каждому предупреждению в «Списке задач» и добавьте соответствующий кастинг, предпочитаете ли вы

(double) my_variable

или

static_cast<double>(my_variable)

Полагаю, если вы получаете неоднозначное предупреждение, где-то определены несколько функций pow. В любом случае, по-моему, лучше быть откровенным. Что бы это ни стоило, мой голос идет с опцией static_cast.

...