Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 10:32     Как обычную переменную на время сделать константой? #1
Как обычную переменную на время сделать константой?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.07.2013, 19:15     Как обычную переменную на время сделать константой? #41
Цитата Сообщение от BigLow Посмотреть сообщение
Как обычную переменную на время сделать константой?
А как самому на время стать решёткой? Переменная не может быть константой.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.07.2013, 20:15     Как обычную переменную на время сделать константой? #42
Цитата Сообщение от taras atavin Посмотреть сообщение
А как самому на время стать решёткой? Переменная не может быть константой.
Опять вы за своё...

Смотрите, вот формула:
4x2 + 3x + 7 = 0
Не думаю, что кто-то называет здесь x иначе как переменной. Но тем не менее значение x ни при каких условиях не изменяется (в пределах этого выражения).
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.07.2013, 20:20     Как обычную переменную на время сделать константой? #43
Во-первых если оно не меняется в конкретный период времени, то это ещё не означает константности. Не хочешь не меняй. А константа - это то, чего менять нельзя. Уж или можно, тогда переменная, или нельзя. Одно из двух, а
C++
1
const int a=a;
- перекрытие переменной другой величиной, а не трансформация изменением истинного имени (смотри волшебника земноморья). А во-вторых здесь не видно переменной, x здесь - просто величина, но пока что не факт, что именно переменная.
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
16.07.2013, 20:20     Как обычную переменную на время сделать константой? #44
Терминологический спор - самый сложный. Предлагаю не обострять на этом внимание. Главное - что значение переменной можно однажды "поймать" и потом использовать это пойманное значение как константу в течение какого-то времени.
Сегодня научили меня еще одному способу сохранения "пойманного" начального значения - с помощью глобальной переменной.
Тогда можно не вводить локальную ststic переменную, а объявить глобальную переменную, например типа int.
Результат будет такой же.
Настроение поднялось, можно двигаться дальше.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
16.07.2013, 21:24     Как обычную переменную на время сделать константой? #45
Цитата Сообщение от taras atavin Посмотреть сообщение
А как самому на время стать решёткой? Переменная не может быть константой.
Первое, действительно трудно. "От тюрьмы да от сумы...", как говорится. А второе просто правда и всё. Тем не менее [TC] получил советы передать в в функцию как const, константную ссылку или даже ссылку на ссылку (не помню это говорили или нет). И ничего.
Второй вопрошающий, спрашивает вообще не об этом. Как выяснилось позже. Особенно в свете:
Цитата Сообщение от kotgav Посмотреть сообщение
Сегодня научили меня еще одному способу сохранения "пойманного" начального значения - с помощью глобальной переменной.
И тоже ничего. Почему бы не поговорить?

Добавлено через 4 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
- перекрытие переменной другой величиной, а не трансформация изменением истинного имени (смотри волшебника земноморья). А во-вторых здесь не видно переменной, x здесь - просто величина, но пока что не факт, что именно переменная.
Ну и пусть. С точки зрения доступа в коде это тоже самое имя. Не так ли? Не важно, что произошло затенение.
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;
}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
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;
}
Но это конечно сначала константа (и то не вполне), с возможностью изменения "если захотелось"
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
17.07.2013, 12:56     Как обычную переменную на время сделать константой? #48
Вон сколько способов, оказывается!
Спасибо, взял на вооружение.
IGPIGP
17.07.2013, 13:45
  #49

Не по теме:

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

kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
17.07.2013, 13:56     Как обычную переменную на время сделать константой? #50
Цитата Сообщение от IGPIGP Посмотреть сообщение

Не по теме:


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

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

Не по теме:

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

kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
19.07.2013, 15:37     Как обычную переменную на время сделать константой? #52
Еще один вопрос возник.
В программе есть много блоков, в которых требуется измерение отрезков относительного времени, следовательно надо многократно применять приемы временного "замораживания" переменной.
А что если сделать класс объекта, который будет выполнять роль секундомера с "замораживанием" начального значения времени?
И можно ли в классе объявлять глобальные переменные?
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
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) переменная
}
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
19.07.2013, 16:00     Как обычную переменную на время сделать константой? #54
Вот спасибо!
Сейчас попробую.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
19.07.2013, 17:15     Как обычную переменную на время сделать константой? #55
Цитата Сообщение от kotgav Посмотреть сообщение
И можно ли в классе объявлять глобальные переменные?
Статическую переменную можно объявить.
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
19.07.2013, 17:23     Как обычную переменную на время сделать константой? #56
Кстати да, kotgav, если ты под глобальной подразумевал переменную, к которой можно обращаться за пределами класса, то используй код, написанный мной выше, а если ты под глобальной подразумевал переменную, которая будет у экземпляров класса единственная (и неповторимая ) , независимо от количества этих самых экземпляров, то используй статическую переменную :

C++
1
2
public: //используй любой нужный уровень доступа, это для примера
static int a;
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;
}
Я пока точно не знаю, но чувствую, что для каждого экземпляра класса должна быть своя глобальная переменная, чтобы счетчики времени работали независимо друг от друга (они запускаются разными событиями и в разное время, иногда друг за другом).
Поэтому посмотрю один вариант, потом другой, потом третий. Выберу наиболее подходящее.
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
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;
}
Я пока точно не знаю, но чувствую, что для каждого экземпляра класса должна быть своя глобальная переменная, чтобы счетчики времени работали независимо друг от друга (они запускаются разными событиями и в разное время, иногда друг за другом).
Поэтому посмотрю один вариант, потом другой, потом третий. Выберу наиболее подходящее.
Всё же, что ты подразумеваешь под глобальной переменной класса? Если можно, то конкретное определение
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
19.07.2013, 17:41     Как обычную переменную на время сделать константой? #59
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Всё же, что ты подразумеваешь под глобальной переменной класса? Если можно, то конкретное определение
Не класса, а программы. Подразумеваю переменную, которая определена и инициализирована вне функций, в верхней части программы. Чтобы в нее можно было поймать начальное значение переменной и использовать его как постоянную величину.
А при использовании класса она просится в класс. Но тогда будет ли она обладать такой возможностью?
Вот это мне пока непонятно.

Если это не получится, то есть варианты от IGPIGP с двумя функциями и без глобальной переменной.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2013, 17:45     Как обычную переменную на время сделать константой?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
19.07.2013, 17:45     Как обычную переменную на время сделать константой? #60
Цитата Сообщение от kotgav Посмотреть сообщение
Но тогда будет ли она обладать такой возможностью?
Там ей и лучше будет. Перенесите код, раз он понравился в функцию сеттер (тоже статическую) для этой переменной и будет работать. Там может потребоваться две статических переменных, как в "примере".
Yandex
Объявления
19.07.2013, 17:45     Как обычную переменную на время сделать константой?
Ответ Создать тему
Опции темы

Текущее время: 09:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru