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

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

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

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

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

Как обычную переменную на время сделать константой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2013, 10:32     Как обычную переменную на время сделать константой?
Посмотрите здесь:
C++ Как обычную переменную сделать константой
Как сделать, чтобы "*" принимали как обычную переменную? C++
из массива в обычную переменную C++
Консольное приложение.Описать как структуру переменную время C++
C++ подскажите, как можно сохранить переменную, вводимую во время работы программы после ее закрытия
C++ Как сделать переменную строковой C++
Как лучше сделать глобальную переменную? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 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
326 / 325 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.07.2013, 10:40     Как обычную переменную на время сделать константой? #3
можно передать её в функцию по константной ссылке.
На время выполнения этой функции она будет константой.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
326 / 325 / 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
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
14.07.2013, 10:47     Как обычную переменную на время сделать константой? #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
const int n = n;
На gcc мусором инициализировалось.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 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
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
14.07.2013, 10:51     Как обычную переменную на время сделать константой? #8
Jupiter, но это только, если n - глобальная.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 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
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
14.07.2013, 10:54     Как обычную переменную на время сделать константой? #10
а покажите в каком виде хотите этим попользоваться. может придумаем более изящное решение.
0x10
14.07.2013, 10:54
  #11

Не по теме:

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

SummerRain
326 / 325 / 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
Каратель
Эксперт С++
6552 / 3972 / 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
Комп_Оратор)
Эксперт по математике/физике
6421 / 3060 / 303
Регистрация: 04.12.2011
Сообщений: 8,342
Записей в блоге: 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++
Как сделать переменную типа char именем файла 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     Как обычную переменную на время сделать константой?
Ответ Создать тему
Опции темы

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