Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.79/43: Рейтинг темы: голосов - 43, средняя оценка - 4.79
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
1

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

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

Как обычную переменную на время сделать константой?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2013, 10:32
Ответы с готовыми решениями:

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

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

Цикл в delphi. Сделать переменную константой в цикле
Вообщем у меня цикл - там огромные формулы... и в итоге с каждым началом нового действия цикла...

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

66
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
16.07.2013, 19:15 41
Цитата Сообщение от BigLow Посмотреть сообщение
Как обычную переменную на время сделать константой?
А как самому на время стать решёткой? Переменная не может быть константой.
0
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
16.07.2013, 20:15 42
Цитата Сообщение от taras atavin Посмотреть сообщение
А как самому на время стать решёткой? Переменная не может быть константой.
Опять вы за своё...

Смотрите, вот формула:
4x2 + 3x + 7 = 0
Не думаю, что кто-то называет здесь x иначе как переменной. Но тем не менее значение x ни при каких условиях не изменяется (в пределах этого выражения).
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
16.07.2013, 20:20 43
Во-первых если оно не меняется в конкретный период времени, то это ещё не означает константности. Не хочешь не меняй. А константа - это то, чего менять нельзя. Уж или можно, тогда переменная, или нельзя. Одно из двух, а
C++
1
const int a=a;
- перекрытие переменной другой величиной, а не трансформация изменением истинного имени (смотри волшебника земноморья). А во-вторых здесь не видно переменной, x здесь - просто величина, но пока что не факт, что именно переменная.
0
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
16.07.2013, 20:20 44
Терминологический спор - самый сложный. Предлагаю не обострять на этом внимание. Главное - что значение переменной можно однажды "поймать" и потом использовать это пойманное значение как константу в течение какого-то времени.
Сегодня научили меня еще одному способу сохранения "пойманного" начального значения - с помощью глобальной переменной.
Тогда можно не вводить локальную ststic переменную, а объявить глобальную переменную, например типа int.
Результат будет такой же.
Настроение поднялось, можно двигаться дальше.
0
Комп_Оратор)
Эксперт по математике/физике
8461 / 4218 / 576
Регистрация: 04.12.2011
Сообщений: 12,603
Записей в блоге: 14
16.07.2013, 21:24 45
Цитата Сообщение от taras atavin Посмотреть сообщение
А как самому на время стать решёткой? Переменная не может быть константой.
Первое, действительно трудно. "От тюрьмы да от сумы...", как говорится. А второе просто правда и всё. Тем не менее [TC] получил советы передать в в функцию как const, константную ссылку или даже ссылку на ссылку (не помню это говорили или нет). И ничего.
Второй вопрошающий, спрашивает вообще не об этом. Как выяснилось позже. Особенно в свете:
Цитата Сообщение от kotgav Посмотреть сообщение
Сегодня научили меня еще одному способу сохранения "пойманного" начального значения - с помощью глобальной переменной.
И тоже ничего. Почему бы не поговорить?

Добавлено через 4 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
- перекрытие переменной другой величиной, а не трансформация изменением истинного имени (смотри волшебника земноморья). А во-вторых здесь не видно переменной, x здесь - просто величина, но пока что не факт, что именно переменная.
Ну и пусть. С точки зрения доступа в коде это тоже самое имя. Не так ли? Не важно, что произошло затенение.
0
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
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
Комп_Оратор)
Эксперт по математике/физике
8461 / 4218 / 576
Регистрация: 04.12.2011
Сообщений: 12,603
Записей в блоге: 14
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
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
17.07.2013, 12:56 48
Вон сколько способов, оказывается!
Спасибо, взял на вооружение.
0
IGPIGP
17.07.2013, 13:45
  #49

Не по теме:

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

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

Не по теме:


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

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

Не по теме:

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

0
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
19.07.2013, 15:37 52
Еще один вопрос возник.
В программе есть много блоков, в которых требуется измерение отрезков относительного времени, следовательно надо многократно применять приемы временного "замораживания" переменной.
А что если сделать класс объекта, который будет выполнять роль секундомера с "замораживанием" начального значения времени?
И можно ли в классе объявлять глобальные переменные?
0
146 / 116 / 37
Регистрация: 27.10.2011
Сообщений: 690
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
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
19.07.2013, 16:00 54
Вот спасибо!
Сейчас попробую.
0
Комп_Оратор)
Эксперт по математике/физике
8461 / 4218 / 576
Регистрация: 04.12.2011
Сообщений: 12,603
Записей в блоге: 14
19.07.2013, 17:15 55
Цитата Сообщение от kotgav Посмотреть сообщение
И можно ли в классе объявлять глобальные переменные?
Статическую переменную можно объявить.
2
146 / 116 / 37
Регистрация: 27.10.2011
Сообщений: 690
19.07.2013, 17:23 56
Кстати да, kotgav, если ты под глобальной подразумевал переменную, к которой можно обращаться за пределами класса, то используй код, написанный мной выше, а если ты под глобальной подразумевал переменную, которая будет у экземпляров класса единственная (и неповторимая ) , независимо от количества этих самых экземпляров, то используй статическую переменную :

C++
1
2
public: //используй любой нужный уровень доступа, это для примера
static int a;
1
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
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
146 / 116 / 37
Регистрация: 27.10.2011
Сообщений: 690
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
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
19.07.2013, 17:41 59
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Всё же, что ты подразумеваешь под глобальной переменной класса? Если можно, то конкретное определение
Не класса, а программы. Подразумеваю переменную, которая определена и инициализирована вне функций, в верхней части программы. Чтобы в нее можно было поймать начальное значение переменной и использовать его как постоянную величину.
А при использовании класса она просится в класс. Но тогда будет ли она обладать такой возможностью?
Вот это мне пока непонятно.

Если это не получится, то есть варианты от IGPIGP с двумя функциями и без глобальной переменной.
0
Комп_Оратор)
Эксперт по математике/физике
8461 / 4218 / 576
Регистрация: 04.12.2011
Сообщений: 12,603
Записей в блоге: 14
19.07.2013, 17:45 60
Цитата Сообщение от kotgav Посмотреть сообщение
Но тогда будет ли она обладать такой возможностью?
Там ей и лучше будет. Перенесите код, раз он понравился в функцию сеттер (тоже статическую) для этой переменной и будет работать. Там может потребоваться две статических переменных, как в "примере".
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2013, 17:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как сохранить значение адреса указателя в обычную переменную?
Всем привет. Пишу лабиринт на C++. С языком знаком мало. В общем, я в курсе, что можно в функцию...

Как сделать вводимое с консоли значение константой?
Например я ввожу значение с консоли a = Convert.ToInt32(Console.ReadLine()); как сделать a -...

из массива в обычную переменную
есть char'овский массив такого содержания &quot;100&quot; как перенести этот массив в обычную переменную...

Как сделать обычную кнопку в режиме ключа?
Добрый день! Есть кнопка типа Button (решение с ToggleButton не подходит), мне нужно сделать,...


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

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

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