Подтвердить что ты не робот

Как получить точное количество раз, когда функция выполняется на С++?

#include<iostream>
using namespace std;

void callMe()
{
    int count=0;
    cout<<"I am called "<<++count<<" times!\n";
}

int main()
{
    callMe();
    callMe();
    callMe();
    callMe();
    return 0;
}

В этом случае вывод будет

I am called 1 times!
I am called 1 times!
I am called 1 times!
I am called 1 times!

Вместо этого я хочу, чтобы результат печатался как

I am called 1 times!
I am called 2 times!
I am called 3 times!
I am called 4 times!
4b9b3361

Ответ 1

Я надеюсь, что следующий фрагмент кода решит вашу проблему!

#include<iostream.h>

void callMe()
{
    static int count=0;
    cout << "I am called " << ++count << " times!\n";
}

int main()
{
    callMe();
    callMe();
    callMe();
    callMe();
    return 0;
}

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

Ответ 2

void callMe()
{
    static int count = 0; // note 'static' keyword
    cout<<"I am called "<<++count<<" times!\n";
}

Ответ 3

сделать статическую переменную

поэтому определите его в самой функции и из-за свойства static она сохранит его значение в каждом вызове.

void callMe()
{
    static int count=0;
    cout<<"I am called "<<++count<<" times!\n";
}

статическое хранилище выполняется в сегменте данных, а не в стеке функций, поэтому в каждой функции вызова принимается модифицированное значение. Таким образом, он напечатает желаемый результат.

но count, который вы указали, является локальным и имеет хранилище в стеке, поэтому для каждого вызова функции всегда требуется count = 0

Ответ 4

3 пути, 2 из них уже упомянуты здесь. Я бы обобщил и объяснил причины:

1) Объявите переменную как статическую:

void callMe()
{
    static int count=0;
    cout<<"I am called "<<++count<<" times!\n";
}

Это работает, потому что в памяти теперь создается единственная копия счетчика, а не создается каждый раз, когда вызывается функция, а затем удаляется, когда функция выполняется. Также стоит отметить, что счетчик по-прежнему является локальным для функции, то есть если вы попытаетесь сделать что-то вроде этого:

int main()
{
    int count;
    callMe();
    callMe();
    callMe();
    callMe();
    cout<<"you called "<<count<<"functions!\n";
    return 0;
}

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

2) Настройте глобальную переменную:

int count=0; 
void callMe()
{
    cout<<"I am called "<<++count<<" times!\n";
}

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

int count=0;
void callMe()
{
    cout<<"I am called "<<++count<<" times!\n";
}

void callMe2()
{
    cout<<"I am called 2 "<<++count<<" times!\n";
}

int main()
{
    callMe();
    callMe();
    callMe2();
    callMe2();
    cout<<"you called "<<count<<" functions!\n";
    return 0;
}

Так как счет здесь в основном распространен как для функций, так и для основной, все они относятся к одному и тому же значению, а не к созданию собственных локальных копий. Может быть перепутано, если у вас есть переменные с одинаковым именем. Чтобы понять разницу между глобальной и статической переменной и их масштабом, нажмите здесь

3) Передайте ссылку переменной:

void callMe(int &count)
{
   cout<<"I am called "<<count++<<" times!\n";
}

void callMe2(int &count)
{
   cout<<"I am called 2 "<<++count<<" times!\n";
}

int main()
{
    int count=0;
    callMe(count);
    callMe(count);
    callMe2(count);
    callMe2(count);
    cout<<"you called "<<count<<" functions!\n";
    return 0;
}

Это, пожалуй, самый чистый способ сделать это, переменная локальна для основного (что позволит сэкономить вам сложности сбора мусора), и поскольку это пропуск по refrence, все изменения указывают на то же место в памяти. Если у вас нет веских оснований не следовать этому, я бы сказал, используйте это.

Надеюсь, я больше не смутил вас, Счастливая охота.

Ответ 5

Вам нужно будет передать его в качестве аргумента или сохранить его как состояние функции.

int count = 0;
auto callMe = [=] mutable {
    cout<<"I am called "<<++count<<" times!\n";
};

Ответ 6

Если вы хотите подсчитать количество вызовов одной функции, вы действительно можете использовать переменную счетчика static.


В качестве альтернативы, если вы хотите сделать это для отладки, это не худшая идея использовать для этого инструмент профилирования. Например Valgrind Callgrind [акцент мой]:

Callgrind - это инструмент профилирования, который записывает историю вызовов среди функций в программе, выполняемой как граф вызовов. По умолчанию собранные данные состоят из количества выполненных команд, их связи с исходными строками, отношения вызывающего/вызываемого между функциями и номеров таких вызовов.


Когда вы используете gcc, вы также можете возиться с макросом __PRETTY_FUNCTION__ и глобальной картой:

#include <iostream>
#include <string>
#include <map>

std::map<std::string, int> call_counts;

void call_me_one() {
    call_counts[__PRETTY_FUNCTION__] += 1;
}

void call_me_two() {
    call_counts[__PRETTY_FUNCTION__] += 1;
}

void call_me_three() {
    call_counts[__PRETTY_FUNCTION__] += 1;
}

int main()
{
    for (int i = 0; i < 10; i++) 
        call_me_one();

    for (int i = 0; i < 20; i++) 
        call_me_two();

    for (int i = 0; i < 30; i++) 
        call_me_three();

    for (auto it = call_counts.begin(); it != call_counts.end(); ++it)
        std::cout << (*it).first << " was being called " 
            << (*it).second << " times.\n";
}

Здесь вывод на моей машине:

void call_me_one() was being called 10 times.
void call_me_three() was being called 30 times.
void call_me_two() was being called 20 times.

Ответ 7

Вы должны использовать ключевое слово "статическое" до подсчета.

Исправленный фрагмент кода будет выглядеть примерно так: *

void callMe()
{
    static int count;
    cout<<"I am called "<<++count<<" times!\n";
}

Ответ 8

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

void callMe(int &count)
  {
     cout<<"I am called "<<count++<<" times!\n";
  }

int main()
  {
    int count=0;
  callMe(count);
  callMe(count);
  callMe(count);
  callMe(count);
  return 0;
  }

Для получения дополнительной информации о передаче по ссылке вы можете обратиться здесь.

Ответ 9

По существу, все здесь предлагают. Это макрос, который я использовал время от времени. Я считаю, что это упрощает чтение.

in a separate header: (say debug_helper.h)
---------------------
#define COUNT_USAGE() {static int count=0;++count;std::cout<<"Called "<<count<<" times\n";}

In the CPP file:
----------------
#include "debug_helper.h"    

void callMe()
{
    COUNT_USAGE();
}