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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 10:32     Как обычную переменную на время сделать константой? #1
Как обычную переменную на время сделать константой?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.07.2013, 10:40     Как обычную переменную на время сделать константой? #2
C++
1
2
3
4
5
6
7
    int n = 5;
 
    {
        // в этом блоке n будет константа
        const int n = n;
        // some code
    }
только зачем это может понадобиться?
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.07.2013, 10:40     Как обычную переменную на время сделать константой? #3
можно передать её в функцию по константной ссылке.
На время выполнения этой функции она будет константой.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
14.07.2013, 10:45     Как обычную переменную на время сделать константой? #4
Цитата Сообщение от Kastaneda Посмотреть сообщение
C++
1
2
3
4
5
6
7
    int n = 5;
 
    {
        // в этом блоке n будет константа
        const int n = n;
        // some code
    }
только зачем это может понадобиться?
или даже
C++
1
2
3
4
int main () {
  int a = 20;
  const int& _a = a;
}
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.07.2013, 10:45     Как обычную переменную на время сделать константой? #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
C++
1
2
3
4
5
6
7
    int n = 5;
 
    {
        // в этом блоке n будет константа
        const int n = n;
        // some code
    }
только зачем это может понадобиться?
Код упал на VS 2010
The variable 'n' is being used without being initialized
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
14.07.2013, 10:47     Как обычную переменную на время сделать константой? #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
const int n = n;
На gcc мусором инициализировалось.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.07.2013, 10:50     Как обычную переменную на время сделать константой? #7
C++
1
2
3
4
int n = 5;
{
    const int n = ::n;
}
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
14.07.2013, 10:51     Как обычную переменную на время сделать константой? #8
Jupiter, но это только, если n - глобальная.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.07.2013, 10:51     Как обычную переменную на время сделать константой? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от SummerRain Посмотреть сообщение
Код упал на VS 2010
Цитата Сообщение от Schizorb Посмотреть сообщение
На gcc мусором инициализировалось.
Ну да, перекрытие имен. Вот так надо
C++
1
2
3
4
5
6
7
8
    int n = 5;
 
    {
        // в этом блоке n будет константа
        int tmp = n;
        const int n = tmp;
        // some code
    }
Kukurudza
104 / 85 / 6
Регистрация: 29.08.2012
Сообщений: 539
14.07.2013, 10:54     Как обычную переменную на время сделать константой? #10
а покажите в каком виде хотите этим попользоваться. может придумаем более изящное решение.
0x10
14.07.2013, 10:54
  #11

Не по теме:

Один я не понимаю какую проблему пытается решить автор?

SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.07.2013, 10:57     Как обычную переменную на время сделать константой? #12
Цитата Сообщение от 0x10 Посмотреть сообщение

Не по теме:

Один я не понимаю какую проблему пытается решить автор?

Не по теме:

Нет не один, но нам интересен процесс

BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 10:58  [ТС]     Как обычную переменную на время сделать константой? #13
Цитата Сообщение от Kukurudza Посмотреть сообщение
а покажите в каком виде хотите этим попользоваться. может придумаем более изящное решение.
воспользуюсь советом SummerRain, буду по константной ссылке передавать эту переменную в функцию
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
14.07.2013, 11:38     Как обычную переменную на время сделать константой? #14
Спасибо за тему, как раз и моя проблема (я начинающий, пока не знаю, как коды вставлять в сообщение, поэтому помещаю в тексте).
Есть некая функция обратного вызова FLOAT64 FSAPI GTX328_Zastavka_icon_cb(PELEMENT_ICON pelement)
C++
1
2
3
4
5
6
7
8
9
{
......
       FLOAT64  time_var = pelement->source_var.var_value.n;          // получаем текущее значение секунд от 0 до 59 с частотой 1 Гц
       FLOAT64  time_double = modf(time_var/10, &time_int)*10;        // получаем единицы и десятки секунд
 
       time_int_begin = time_int;           // замораживаем десятки секунд
       time_double_secondomer = time_double-time_double_begin;    // текущее время секундомера, единицы секунд
.......
}
При первом вызове функции я получаю текущее значение переменной time_var типа FLOAT64 (это аналог float) в секундах (от 0 до 59) и выделяю из него единицы и десятки секунд. И на первом же вызове мне надо запомнить полученное значение единиц секунд time_double_begin и сделать его константой на все последующие вызовы на все время работы программы. Далее я из текущего значения времени вычитаю эту временную константу и получаю относительное время секундомера.
Способ получения time_var единственный, это объясняется спецификой программы. Значение времени в секундах генерируется другой программой, изменить или в мешаться в этот процесс нельзя.
Пробовал использовать объявление static FLOAT64 time_double_begin и с инициализацией, и без него. Переменная не "замораживается", а изменяет свое значение при каждом новом вызове функции (что в общем то понятно, т.к. в книжках написано, что она сохраняет значение только между вызовами).
Подскажите, пожалуйста, как можно превратить переменную time_double_begin во временную константу в моем конкретном случае?
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 12:03  [ТС]     Как обычную переменную на время сделать константой? #15
Цитата Сообщение от kotgav Посмотреть сообщение
пока не знаю, как коды вставлять в сообщение,
внизу есть кнопка "C++". сначала нужно выделить сам код и нажать ее
Миниатюры
Как обычную переменную на время сделать константой?  
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
14.07.2013, 12:42     Как обычную переменную на время сделать константой? #16
Спасибо, буду знать! Это для тренировки, кажется получилось:
C++
1
2
       FLOAT64  time_var = pelement->source_var.var_value.n;          // получаем текущее значение секунд от 0 до 59 с частотой 1 Гц
       FLOAT64  time_double = modf(time_var/10, &time_int)*10;        // получаем единицы и десятки секунд
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.07.2013, 12:46     Как обычную переменную на время сделать константой? #17
Цитата Сообщение от kotgav Посмотреть сообщение
При первом вызове функции я получаю текущее значение переменной time_var типа FLOAT64 (это аналог float) в секундах (от 0 до 59) и выделяю из него единицы и десятки секунд. И на первом же вызове мне надо запомнить полученное значение единиц секунд time_double_begin и сделать его константой на все последующие вызовы на все время работы программы.
static const
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
14.07.2013, 13:33     Как обычную переменную на время сделать константой? #18
Изменил код на примере поста #9 и поста #17 этой темы вот так (фрагмент кода):
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
FLOAT64 FSAPI   GTX328_Zastavka_icon_cb(PELEMENT_ICON   pelement)
{
       FLOAT64  time_double;              // единицы секунд текущего времени
       FLOAT64  time_int;                   // десятки секунд текущего времени
       FLOAT64  time_double_secondomer;   // текущее время секундомера, единицы секунд
       FLOAT64  time_int_secondomer;      // текущее время секундомера, десятки секунд
 
    // Включение-выключение прибора
    INT32       gauge_state;                // переменная состояния прибора вкл/выкл
    execute_calculator_code("(L:G_GTX-328_Power_OnOff,number)", NULL, &gauge_state, NULL); 
 
    if (gauge_state)             // если прибор включен
    {
       FLOAT64  time_var = pelement->source_var.var_value.n;          // получаем текущее значение секунд от 0 до 59 с частотой 1 Гц
                time_double = modf(time_var/10, &time_int)*10;        // получаем единицы и десятки секунд
 
       // Блок объявления временных констант
       FLOAT64  time_double_begin = time_double;         // начальное значение единиц секунд
static const FLOAT64  time_double = time_double_begin;   // начальное значение единиц секунд
       FLOAT64  time_int_begin = time_int;              // начальное значение десятков секунд
static const FLOAT64  time_int = time_int_begin;        // начальное значение десятков секунд               
                
       time_double_secondomer = time_double - time_double_begin;    // текущее время секундомера, единицы секунд
       time_int_secondomer = time_int - time_int_begin;            // текущее время секундомера, десятки секунд
 
...................
 
    }                    // для gauge_state
Компиляция в VS 2010 Professional нормальная, библиотека создается без ошибок. А при включении приложения к Windows, в которой она используется, сразу же происходит фатальная ошибка и приложение не запускается. Закрывает приложение служба безопасности, которая расценивает запускаемую программу как вирус.
Может быть указанные выше приемы создания временных констант подходят не ко всем приложениям?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,696
Записей в блоге: 3
14.07.2013, 13:37     Как обычную переменную на время сделать константой? #19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//ну очень смешное решение))
#include <iostream>
 using namespace std;
 int foo1(int ai){
static int prevA;//инициализируется нулём до первого вызова
if(prevA == 0) prevA = ai;
const int a = prevA;//если хотите для самодисциплины
//далее работаем с переменной a, 
 
 
return a;
 }
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
for(int i=6; i<9; ++i) cout<<foo1(i)<<" ";//6 6 6 то есть не меняется значение в функции
 
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2013, 13:47     Как обычную переменную на время сделать константой?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
14.07.2013, 13:47     Как обычную переменную на время сделать константой? #20
Спасибо, поизучаю и поэкспериментирую.
Смущает один аспект - ваш пример предполагает передачу переменных из одной функции (fool) в другую (main). Способов создания временных констант при такой организации программ достаточно много.
А у меня все должно происходить в рамках одной функции - обратного вызова. В ней я могу организовать только некие блоки, что я и попытался сделать условием if (gauge_state) { }.
Yandex
Объявления
14.07.2013, 13:47     Как обычную переменную на время сделать константой?
Ответ Создать тему
Опции темы

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