Ошибка счетчика времени Chrono в C ++ Ошибка: нет совпадения для оператора - PullRequest
0 голосов
/ 09 апреля 2020
#include <iostream>
#include <chrono>
#include <unistd.h>
using namespace std;

void SieveOfEratosthenes (int n)
{
    bool prime[n+1], flag=true;
    int counter=0, ct=0;
    for (int i =0;i<n+1;i++){
        prime[i]=true;
    }
    for (int p=2; p*p<=n; p++)
    {
        if (prime[p]==true)
        {
            for (int i=p*2; i<=n; i += p)
            {
                prime[i] = false; 
            }
        }
    }
   // Print all prime numbers 
    for (int p=2; p<=n; p++)
    {
        if (flag)
        {
              auto begin=chrono::high_resolution_clock::now();
        }
        if (prime[p])
        {
              cout << p << " ";
              counter+=1;
              flag=false;
        }
        if(counter==10)
        {
              auto end=chrono::high_resolution_clock::now();
              auto duration=chrono::nanoseconds(end-begin);
              cout<<"Time elapsed:"<<duration.count();
              counter=0;
              flag=true;
        }
    }
    cout<<endl;
}


int main()
{
     int n;
     cout<<"Type a number:";
     cin>>n;
     cout<<endl<<"Following are the prime numbers smaller or equal to:"<<n<<endl;
     SieveOfEratosthenes(n);
     return 0;
}
// Driver Program to test above function 

Это алгоритм для поиска простых чисел, меньших n (данные с клавиатуры), и я хочу получать время каждые 10 найденных простых чисел. Я получаю ошибку оператора, и она включена (конец-начало). Я могу Не понимаю, где ошибка. И я попытался написать функцию в отдельном файле .o, но все равно ничего не получил. Любая помощь будет высоко ценится.!

enter image description here

1 Ответ

0 голосов
/ 09 апреля 2020

begin определяется внутри блока if, к которому end-begin не может получить доступ. Простое исправление состоит в том, чтобы переместить определение из for -l oop:

      decltype(chrono::high_resolution_clock::now()) begin;                                                                                                                                    
     // Print all prime numbers                                                                                                                                                                
      for (int p=2; p<=n; p++)                                                                                                                                                                 
      {                                                                                                                                                                                        
          if (flag)                                                                                                                                                                            
          {                                                                                                                                                                                    
                begin=chrono::high_resolution_clock::now();                                                                                                                                    
          }
          // ...
      }

Примечание Обычно это плохая идея для using namespace std во всем мире. Поскольку begin сталкивается с std::begin, сообщение об ошибке становится запутанным. Если вы вместо этого напишите namespace chrono = std::chrono; using std::cout;, ошибка станет более понятной:

test.cpp: In function ‘void SieveOfEratosthenes(int)’:
test.cpp:41:53: error: ‘begin’ was not declared in this scope; did you mean ‘std::begin’?
   41 |               auto duration=chrono::nanoseconds(end-begin);
      |                                                     ^~~~~
      |                                                     std::begin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...