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

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

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

Как обычную переменную на время сделать константой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2013, 10:32
Ответы с готовыми решениями:

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

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

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

Консольное приложение.Описать как структуру переменную время
Описать как структуру переменную время (с полями часы, минуты, секунды)....

Описать как структуру переменную время (с полями часы, минуты, секунды)
Прошу вашей помощи Описать как структуру переменную время (с полями часы,...

66
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 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
    }
только зачем это может понадобиться?
0
SummerRain
327 / 326 / 92
Регистрация: 16.12.2012
Сообщений: 544
14.07.2013, 10:40 3
можно передать её в функцию по константной ссылке.
На время выполнения этой функции она будет константой.
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 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;
}
1
SummerRain
327 / 326 / 92
Регистрация: 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
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
14.07.2013, 10:47 6
Цитата Сообщение от Kastaneda Посмотреть сообщение
const int n = n;
На gcc мусором инициализировалось.
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 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;
}
1
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
14.07.2013, 10:51 8
Jupiter, но это только, если n - глобальная.
1
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 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
    }
3
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
14.07.2013, 10:54 10
а покажите в каком виде хотите этим попользоваться. может придумаем более изящное решение.
0
0x10
14.07.2013, 10:54
  #11

Не по теме:

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

4
SummerRain
327 / 326 / 92
Регистрация: 16.12.2012
Сообщений: 544
14.07.2013, 10:57 12
Цитата Сообщение от 0x10 Посмотреть сообщение

Не по теме:

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

Не по теме:

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

0
BigLow
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 10:58  [ТС] 13
Цитата Сообщение от Kukurudza Посмотреть сообщение
а покажите в каком виде хотите этим попользоваться. может придумаем более изящное решение.
воспользуюсь советом SummerRain, буду по константной ссылке передавать эту переменную в функцию
0
kotgav
2 / 2 / 1
Регистрация: 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 во временную константу в моем конкретном случае?
0
BigLow
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 12:03  [ТС] 15
Цитата Сообщение от kotgav Посмотреть сообщение
пока не знаю, как коды вставлять в сообщение,
внизу есть кнопка "C++". сначала нужно выделить сам код и нажать ее
1
Миниатюры
Как обычную переменную на время сделать константой?  
kotgav
2 / 2 / 1
Регистрация: 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;        // получаем единицы и десятки секунд
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 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
0
kotgav
2 / 2 / 1
Регистрация: 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, в которой она используется, сразу же происходит фатальная ошибка и приложение не запускается. Закрывает приложение служба безопасности, которая расценивает запускаемую программу как вирус.
Может быть указанные выше приемы создания временных констант подходят не ко всем приложениям?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,332
Записей в блоге: 5
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;
}
1
kotgav
2 / 2 / 1
Регистрация: 13.07.2013
Сообщений: 62
14.07.2013, 13:47 20
Спасибо, поизучаю и поэкспериментирую.
Смущает один аспект - ваш пример предполагает передачу переменных из одной функции (fool) в другую (main). Способов создания временных констант при такой организации программ достаточно много.
А у меня все должно происходить в рамках одной функции - обратного вызова. В ней я могу организовать только некие блоки, что я и попытался сделать условием if (gauge_state) { }.
0
14.07.2013, 13:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2013, 13:47

подскажите, как можно сохранить переменную, вводимую во время работы программы после ее закрытия
допустим есть переменная a ... int a; cin&gt;&gt;a; ... при повторном...

Как сделать переменную строковой C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt;// Выделенме памяти, контроль выполнения...

Как сделать переменную пустой (обнулить)?
Пишу простейшего миллионера, вариантом ответа на вопросы которого является...


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

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

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