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

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

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

Студворк — интернет-сервис помощи студентам
Как обычную переменную на время сделать константой?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.07.2013, 10:32
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 4 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
- перекрытие переменной другой величиной, а не трансформация изменением истинного имени (смотри волшебника земноморья). А во-вторых здесь не видно переменной, x здесь - просто величина, но пока что не факт, что именно переменная.
Ну и пусть. С точки зрения доступа в коде это тоже самое имя. Не так ли? Не важно, что произошло затенение.
0
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
17.07.2013, 11:39
Цитата Сообщение от 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
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.07.2013, 12:38
Цитата Сообщение от 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
Вон сколько способов, оказывается!
Спасибо, взял на вооружение.
0
17.07.2013, 13:45

Не по теме:

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

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

Не по теме:


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

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

Не по теме:

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

0
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
19.07.2013, 15:37
Еще один вопрос возник.
В программе есть много блоков, в которых требуется измерение отрезков относительного времени, следовательно надо многократно применять приемы временного "замораживания" переменной.
А что если сделать класс объекта, который будет выполнять роль секундомера с "замораживанием" начального значения времени?
И можно ли в классе объявлять глобальные переменные?
0
148 / 118 / 37
Регистрация: 27.10.2011
Сообщений: 690
19.07.2013, 15:58
Цитата Сообщение от 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
Вот спасибо!
Сейчас попробую.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.07.2013, 17:15
Цитата Сообщение от kotgav Посмотреть сообщение
И можно ли в классе объявлять глобальные переменные?
Статическую переменную можно объявить.
2
148 / 118 / 37
Регистрация: 27.10.2011
Сообщений: 690
19.07.2013, 17:23
Кстати да, kotgav, если ты под глобальной подразумевал переменную, к которой можно обращаться за пределами класса, то используй код, написанный мной выше, а если ты под глобальной подразумевал переменную, которая будет у экземпляров класса единственная (и неповторимая ) , независимо от количества этих самых экземпляров, то используй статическую переменную :

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

Если это не получится, то есть варианты от IGPIGP с двумя функциями и без глобальной переменной.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.07.2013, 17:45
Цитата Сообщение от kotgav Посмотреть сообщение
Но тогда будет ли она обладать такой возможностью?
Там ей и лучше будет. Перенесите код, раз он понравился в функцию сеттер (тоже статическую) для этой переменной и будет работать. Там может потребоваться две статических переменных, как в "примере".
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2013, 17:45

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru