Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
#1

Как обычную переменную на время сделать константой? - C++

14.07.2013, 10:32. Просмотров 3142. Ответов 66
Метки нет (Все метки)

Как обычную переменную на время сделать константой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2013, 10:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как обычную переменную на время сделать константой? (C++):

Как обычную переменную сделать константой - C++
Как можно константой сделать обычную переменную, а то хочу создать матрицу nxn а мне VS требует что бы n1 и n2 были константами, или как...

Как сделать, чтобы "*" принимали как обычную переменную? - C++
как сделать чтобы * принимали как обычную переменную??

из массива в обычную переменную - C++
есть char'овский массив такого содержания "100" как перенести этот массив в обычную переменную типа int?

Консольное приложение.Описать как структуру переменную время - C++
Описать как структуру переменную время (с полями часы, минуты, секунды). Составить и протестировать функцию СЕКУНД(t, t1, d), которая...

Описать как структуру переменную время (с полями часы, минуты, секунды) - C++
Прошу вашей помощи Описать как структуру переменную время (с полями часы, минуты, секунды). Составить и протестировать функцию: ...

подскажите, как можно сохранить переменную, вводимую во время работы программы после ее закрытия - C++
допустим есть переменная a ... int a; cin>>a; ... при повторном открытии программы переменная нигде не сохранится. как ее...

66
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
17.07.2013, 11:39 #46
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//вот так тоже забавно:
#include <iostream>
 using namespace std;
//если 0 по умолчанию не устраивает
 int foo2(int ai){
int first_inisializer = -1;//не обязательно -1, можно всё что угодно, NAN например, лишь бы a 
//не могла принимать это значение естественным путём))
static int prevA;//инициализируется нулём до первого вызова, но тепрь это неважно
static int count_of_callings;//то же с нуля 
if( count_of_callings==0 ) prevA = first_inisializer;
if( prevA ==  first_inisializer ) prevA = ai;
const int a = prevA;// :)
//далее работаем с переменной a 
 
 
 
if(count_of_callings<100)//защита от переполнения
count_of_callings++;//делаем невозможной переустановку в first_inisializer
else count_of_callings = 1;
return a;
 }
 
int main()
{  
for(int i=6; i<9; ++i) cout<<foo2(i)<<" ";//6 6 6 то есть не меняется значение в функции
    cout<<endl;  
    system("pause");
    return 0;
}
Разобрался и со вторым примером. Немного добавил комментариев и кое-где изменил форму написания.
Работает прекрасно для консольного приложения!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "stdafx.h"
#include <iostream>
using namespace std;
 
// Вспомогательная (вызываемая) функция
int foo2(int ai)
{
    int first_inisializer = -1;           // вспомогательная переменная, инициализируем любым значением
    static int prevA;                     // первая статическая переменная, инициализируется по умолчанию нулем
    static int count_of_callings;         // вторая статическая переменная, инициализируется по умолчанию нулем
    
    if( count_of_callings == 0 )          // проверяем состояние, если 0 - значит первый вызов   
        prevA = first_inisializer;        // при первом вызове даем статической переменной значение вспомогательной переменной, т.е. -1 
    if( prevA == first_inisializer)       // проверяем равенство. При первом вызове переменные равны -1   
        prevA = ai;                       // при первом вызове присваиваем prevA полученной значение из вызывающей функции, т.е. начальное значение
    const int a = prevA;                  // замораживаем а, присваивая ей начальное значение
 
   if(count_of_callings<100)   //защита от переполнения
       count_of_callings++;    //делаем невозможной переустановку в first_inisializer
   else
       count_of_callings = 1;
 
   return a;     // возвращаем начальное значение
 }
 
 
// Главная (вызывающая) функция
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int i = 0;
    int b = 0;
    int c = 0;
 
    for(i=1; i<5; ++i)
    {
        b = foo2(i);     // присваиваем "замороженное" переменной b, которая выполняет роль временной константы в вызывающей функции
        c = i-b;         // текущая разность
 
        cout << "i= "<< i << " а= " << b << " c= " << c << "\n" << endl;;    // вывод текущего i и "замороженного foo1(i)" значений 
        system("pause");
    }
 
    system("pause");
    return 0;
}
Сделаю свою библиотеку, покажу прием "замораживания" начального значения времени в библиотеке.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Второй вопрошающий, спрашивает вообще не об этом. Как выяснилось позже. Особенно в свете:

И тоже ничего. Почему бы не поговорить?
Сделал пример "замораживания" начального значения переменной в одной функции с использованием глобальной вспомогательной переменной.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Example_StaticVar.cpp: определяет точку входа для консольного приложения.
// Вариант создания временной константы с "ручной" инициализацией глобальной переменной  
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int a = -1;         // глобальная вспомогательная переменная
 
 
// Главная (вызывающая) функция
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int i = 0;
    int b = 0;
    int c = 0;
 
    for(i=1; i<5; ++i)
    {
        if (a < 0)
        {
            a = i;      // "замораживаем" начальное значение переменной i в глобальной переменной а
        }
 
        b = a;          // присваиваем "замороженное" переменной b, которая выполняет роль временной константы в вызывающей функции
        c = i-b;         // текущая разность
        cout << "i= "<< i << " а= " << b << " c= " << c << "\n" << endl;;    // вывод текущего i и "замороженного foo1(i)" значений 
        system("pause");
    }
    system("pause");
    return 0;
}
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
17.07.2013, 12:38 #47
Цитата Сообщение от kotgav Посмотреть сообщение
с использованием глобальной вспомогательной переменной
Конечно. Это просто сохранение и восстановление значения. Мне не ясно было о чём речь вначале. Совсем.
Объявление константы это инструкция компилятору: Не дай мне согрешить!
То есть, что имел ввиду [ТС], можно понять как угодно.
Цитата Сообщение от IGPIGP Посмотреть сообщение
константную ссылку
Если не использовать изменение константы через хитрый указатель, можно с константной ссылкой извратиться:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <string>
using namespace std;
 
void foo(const int &a){
(int)a=321; 
}
 
int& Foo(const int &a){
return (int)a;
}
 
int main()
{
const int& a = 10;
cout<<a<<endl;
cout<<endl;
//a=5;// : error C3892: a: невозможно присваивать значения переменной, которая объявлена как константа
(int)a=5;// а так можно)
cout<<a<<endl;// 5 !
foo(a);//и так можно
cout<<a<<endl;//321
Foo(a)=456;// можно и так
cout<<a<<endl;//456
cin.get();
return 0;
}
Но это конечно сначала константа (и то не вполне), с возможностью изменения "если захотелось"
0
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
17.07.2013, 12:56 #48
Вон сколько способов, оказывается!
Спасибо, взял на вооружение.
0
IGPIGP
17.07.2013, 13:45
  #49

Не по теме:

Цитата Сообщение от kotgav Посмотреть сообщение
Спасибо, взял на вооружение.
Это шутка. Плохо переносимая к тому же. Не нужно, - "на вооружение".

0
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
17.07.2013, 13:56 #50
Цитата Сообщение от IGPIGP Посмотреть сообщение

Не по теме:


Это шутка. Плохо переносимая к тому же. Не нужно, - "на вооружение".

В свою мастерскую, в копилку, в набор инструментов, себе на заметку и т.д.
0
IGPIGP
17.07.2013, 14:07
  #51

Не по теме:

Цитата Сообщение от kotgav Посмотреть сообщение
В свою мастерскую, в копилку, в набор инструментов, себе на заметку и т.д.
Шутите, конечно. Рад, если сумел улыбнуть.

0
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
19.07.2013, 15:37 #52
Еще один вопрос возник.
В программе есть много блоков, в которых требуется измерение отрезков относительного времени, следовательно надо многократно применять приемы временного "замораживания" переменной.
А что если сделать класс объекта, который будет выполнять роль секундомера с "замораживанием" начального значения времени?
И можно ли в классе объявлять глобальные переменные?
0
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 684
Завершенные тесты: 3
19.07.2013, 15:58 #53
Цитата Сообщение от kotgav Посмотреть сообщение
И можно ли в классе объявлять глобальные переменные?
директива public позволяет сделать это:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class example
{
private:
    int b;
 
public:
    int a;
    example()
      :a(0), b(0)
    {};
}
 
int main()
{
    example e();
    e.a=0; //можно, открытая переменная
    //e.b=0; - нельзя,  b-закрытая (private) переменная
}
1
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
19.07.2013, 16:00 #54
Вот спасибо!
Сейчас попробую.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
19.07.2013, 17:15 #55
Цитата Сообщение от kotgav Посмотреть сообщение
И можно ли в классе объявлять глобальные переменные?
Статическую переменную можно объявить.
2
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 684
Завершенные тесты: 3
19.07.2013, 17:23 #56
Кстати да, kotgav, если ты под глобальной подразумевал переменную, к которой можно обращаться за пределами класса, то используй код, написанный мной выше, а если ты под глобальной подразумевал переменную, которая будет у экземпляров класса единственная (и неповторимая ) , независимо от количества этих самых экземпляров, то используй статическую переменную :

C++
1
2
public: //используй любой нужный уровень доступа, это для примера
static int a;
1
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
19.07.2013, 17:32 #57
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Кстати да, kotgav, если ты под глобальной подразумевал переменную, к которой можно обращаться за пределами класса, то используй код, написанный мной выше, а если ты под глобальной подразумевал переменную, которая будет у экземпляров класса единственная (и неповторимая ) , независимо от количества этих самых экземпляров, то используй статическую переменную :

C++
1
2
public: //используй любой нужный уровень доступа, это для примера
static int a;
Вот в этом примере (я его приводил выше) есть глобальная переменная:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int a = -1;         // глобальная вспомогательная переменная
 
 
// Главная (вызывающая) функция
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int i = 0;
    int b = 0;
    int c = 0;
 
    for(i=1; i<5; ++i)
    {
        if (a < 0)
        {
            a = i;      // "замораживаем" начальное значение переменной i в глобальной переменной а
        }
 
        b = a;          // присваиваем "замороженное" переменной b, которая выполняет роль временной константы в вызывающей функции
        c = i-b;         // текущая разность
        cout << "i= "<< i << " а= " << b << " c= " << c << "\n" << endl;;    // вывод текущего i и "замороженного foo1(i)" значений 
        system("pause");
    }
    system("pause");
    return 0;
}
Я пока точно не знаю, но чувствую, что для каждого экземпляра класса должна быть своя глобальная переменная, чтобы счетчики времени работали независимо друг от друга (они запускаются разными событиями и в разное время, иногда друг за другом).
Поэтому посмотрю один вариант, потом другой, потом третий. Выберу наиболее подходящее.
0
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 684
Завершенные тесты: 3
19.07.2013, 17:36 #58
Цитата Сообщение от kotgav Посмотреть сообщение
Вот в этом примере (я его приводил выше) есть глобальная переменная:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int a = -1;         // глобальная вспомогательная переменная
 
 
// Главная (вызывающая) функция
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int i = 0;
    int b = 0;
    int c = 0;
 
    for(i=1; i<5; ++i)
    {
        if (a < 0)
        {
            a = i;      // "замораживаем" начальное значение переменной i в глобальной переменной а
        }
 
        b = a;          // присваиваем "замороженное" переменной b, которая выполняет роль временной константы в вызывающей функции
        c = i-b;         // текущая разность
        cout << "i= "<< i << " а= " << b << " c= " << c << "\n" << endl;;    // вывод текущего i и "замороженного foo1(i)" значений 
        system("pause");
    }
    system("pause");
    return 0;
}
Я пока точно не знаю, но чувствую, что для каждого экземпляра класса должна быть своя глобальная переменная, чтобы счетчики времени работали независимо друг от друга (они запускаются разными событиями и в разное время, иногда друг за другом).
Поэтому посмотрю один вариант, потом другой, потом третий. Выберу наиболее подходящее.
Всё же, что ты подразумеваешь под глобальной переменной класса? Если можно, то конкретное определение
0
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
19.07.2013, 17:41 #59
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Всё же, что ты подразумеваешь под глобальной переменной класса? Если можно, то конкретное определение
Не класса, а программы. Подразумеваю переменную, которая определена и инициализирована вне функций, в верхней части программы. Чтобы в нее можно было поймать начальное значение переменной и использовать его как постоянную величину.
А при использовании класса она просится в класс. Но тогда будет ли она обладать такой возможностью?
Вот это мне пока непонятно.

Если это не получится, то есть варианты от IGPIGP с двумя функциями и без глобальной переменной.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
19.07.2013, 17:45 #60
Цитата Сообщение от kotgav Посмотреть сообщение
Но тогда будет ли она обладать такой возможностью?
Там ей и лучше будет. Перенесите код, раз он понравился в функцию сеттер (тоже статическую) для этой переменной и будет работать. Там может потребоваться две статических переменных, как в "примере".
1
19.07.2013, 17:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2013, 17:45
Привет! Вот еще темы с ответами:

Как сделать переменную строковой C++ - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt;// Выделенме памяти, контроль выполнения программы. очистка экрана. using namespace std; ...

Как лучше сделать глобальную переменную? - C++
Интернет совсем пустой в плане глобальных переменных на с++ Задача следующая: 1. Нужно создать много глобальных переменных будет...

Как сделать одну глобальную переменную - C++
Есть многофайловый проект. К примеру 5 файлов(5 &quot;H&quot; файлов+для них 5 &quot;срр&quot; файлов, пускай в каждом файле будет лежать класс) и есть...

Как сделать переменную пустой (обнулить)? - C++
Пишу простейшего миллионера, вариантом ответа на вопросы которого является переменная типа Int. Проблема в том, что отвечая на один...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru