Проблемы при компиляции кода из-за оператора модуля - PullRequest
11 голосов
/ 03 июля 2019

Я написал программу для хранения числа (которое предопределено программистом) в виде цифр в массиве.

Например, если я хочу сохранить число 1234 в массиве arrx [4], то его элементы будут:

arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4

Я пытаюсь добиться этого, используя следующий фрагмент кода:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int arrx[4];    // Stores the individual digits of number as array
    int digx = 4;   // Total number of digits in number
    int i;
    long int dupx = 1234;  // Number which has to be stored in array
    for(i = digx-1; i >= 0 ; i--)
    {
        arrx[digx-i-1] = int(dupx/pow(10,i));
        dupx = dupx%(pow(10, i));
    }
    return 0;
}

Однако, когда я пытаюсь скомпилировать приведенный выше код, я получаю следующее сообщение об ошибке:

ошибка: недопустимые операнды типов 'long int' и 'double' для двоичного оператора '%'

Единственный вывод, который мне удалось сделать из вышеуказанной ошибки, заключался в том, что проблема связана с оператором модуля.

Поэтому у меня в голове следующие вопросы

  1. В чем конкретно проблема с кодом, содержащим оператор модуля?

  2. Как это исправить?

Я использую Code :: Blocks версии 17.12 с GNU GCC в качестве моего компилятора.

Ответы [ 2 ]

15 голосов
/ 03 июля 2019

Вы можете использовать % только с целыми числами, а pow создает числа с плавающей запятой.

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

int main()
{
   int arrx[4];    //stores the individual digits of number as array
   int digx = 4;   //total number of digits in number
   long int dupx = 1234;  //number which has to be stored in array
   for(int i = 0; i < digx; i++)
   {
        arrx[digx-i-1] = dupx%10;
        dupx = dupx/10;
   }
    return 0;
}
13 голосов
/ 03 июля 2019

std::pow в различных его формах возвращает тип с плавающей запятой, даже если аргументы являются целочисленными типами.

Поскольку % требует целочисленных аргументов, компиляция завершится неудачей.

Использование (long)(pow(10,i)) - это одно исправление, проверяющее, конечно, что (long) достаточно долго. Обратите внимание, что даже в соответствии с IEEE754 pow не требуется возвращать наилучшее возможное значение с плавающей запятой, поэтому усечение до long может иногда быть вредным; возможно, std::round с последующим приведением к long предпочтительнее. Хотя в настоящее время принято считать, что любая реализация pow, нарушающая целостность аргументов, является дефектной.

В вашем случае, хотя я бы хотел определить

constexpr/*use const on earlier standards*/ int powers[] = {1, 10, 100, 1000};

и индексировать соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...