С ++ расчет оценен до 0 - PullRequest
1 голос
/ 06 мая 2010

Я анализирую файл и пытаюсь декодировать координаты в нужную единицу. Получается, что этот код оценивается как 0. Если я наберу его в gdb, результат будет правильным.

int pLat = (int)(
        (argv[6].data() == "plus" ? 1 : -1)
        * (     atoi(argv[7].data()) 
              + atoi(argv[8].data()) / 60. 
              + atoi(argv[9].data()) / 36000.)
        * 2.145767 * 0.0001);

Я делаю (градусы, минуты, десятые секунды) преобразование в wgs. Что-то не так с этим кодом?

Ответы [ 5 ]

7 голосов
/ 06 мая 2010

Если вы пытаетесь преобразовать градусы в координаты WGS84, есть две ошибки:

  • Коэффициент преобразования отсутствует в 10 раз (180/2 23 составляет приблизительно 2,145767 * 10 -5 , и у вас 2,145767 * 10 -4 )
  • Вы умножаете на коэффициент пересчета, когда вы должны делиться на него. Это даст вам очень маленькое число, а приведение к int даст ноль.
7 голосов
/ 06 мая 2010

Вы приводите его к int, что означает, что вы принимаете только неотъемлемую часть.

(int)0.7 == 0.Если выражение, которое вы приводите к типу int, <1, результат будет 0 из-за приведения.* * * * * * * * * * * * * * * * * * * * </p> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1007)) * * * * * * * * * * * * * * * *1001* * * * * * * * * * *1001* *.для всех поплавков и парных разрядов x.y.(игнорируя возможное переполнение)

4 голосов
/ 06 мая 2010

Я пока предположу, что вы определили

vector<string> argv;

и как-то его инициализировали.

string::data не делает то, что вы, кажется, хотите. На самом деле, это почти ничего не делает. Он просто возвращает константный указатель на версию строки, , которая не обязательно заканчивается нулем.

Чтобы сравнить string с символьным литералом, просто используйте ==.

Чтобы передать string функции C, используйте string::c_str.

И вы помещаете дробное число в int.

double pLat = ( // use a floating-point type
        (argv[6] == "plus" ? 1 : -1) // compare string using ==
        * (     atoi(argv[7].c_str()) // get C string using c_str
              + atoi(argv[8].c_str()) / 60. 
              + atoi(argv[9].c_str()) / 36000.)
        * 2.145767 * 0.0001);
4 голосов
/ 06 мая 2010

Просто добавление случайных значений для argv [6..9] производит числа меньше 1. При приведении к int эти значения будут усечены до 0. Если ваши коэффициенты пересчета верны, вам может потребоваться используйте тип с плавающей точкой для представления результата.

0 голосов
/ 06 мая 2010

В конце вы конвертируете в int, что ограничит все значения меньшим (!) Значением int. C не округляется в этом случае.

[Редактировать: Извините, моя предыдущая версия этого ответа содержала неправильную часть.]

...