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

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

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

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

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

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

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

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

66
Jesus loves me
Эксперт С++
5106 / 3119 / 352
Регистрация: 12.12.2009
Сообщений: 7,890
Записей в блоге: 2
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
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
14.07.2013, 10:40 3
можно передать её в функцию по константной ссылке.
На время выполнения этой функции она будет константой.
1
бжни
2468 / 1678 / 135
Регистрация: 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
328 / 327 / 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
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
14.07.2013, 10:47 6
Цитата Сообщение от Kastaneda Посмотреть сообщение
const int n = n;
На gcc мусором инициализировалось.
0
Каратель
Эксперт С++
6596 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.07.2013, 10:50 7
C++
1
2
3
4
int n = 5;
{
    const int n = ::n;
}
1
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
14.07.2013, 10:51 8
Jupiter, но это только, если n - глобальная.
1
Jesus loves me
Эксперт С++
5106 / 3119 / 352
Регистрация: 12.12.2009
Сообщений: 7,890
Записей в блоге: 2
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
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
14.07.2013, 10:54 10
а покажите в каком виде хотите этим попользоваться. может придумаем более изящное решение.
0
0x10
14.07.2013, 10:54
  #11

Не по теме:

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

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

Не по теме:

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

Не по теме:

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

0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 10:58  [ТС] 13
Цитата Сообщение от Kukurudza Посмотреть сообщение
а покажите в каком виде хотите этим попользоваться. может придумаем более изящное решение.
воспользуюсь советом SummerRain, буду по константной ссылке передавать эту переменную в функцию
0
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
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
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 12:03  [ТС] 15
Цитата Сообщение от kotgav Посмотреть сообщение
пока не знаю, как коды вставлять в сообщение,
внизу есть кнопка "C++". сначала нужно выделить сам код и нажать ее
1
Миниатюры
Как обычную переменную на время сделать константой?  
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
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
Каратель
Эксперт С++
6596 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.07.2013, 12:46 17
Цитата Сообщение от kotgav Посмотреть сообщение
При первом вызове функции я получаю текущее значение переменной time_var типа FLOAT64 (это аналог float) в секундах (от 0 до 59) и выделяю из него единицы и десятки секунд. И на первом же вызове мне надо запомнить полученное значение единиц секунд time_double_begin и сделать его константой на все последующие вызовы на все время работы программы.
static const
0
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
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
Комп_Оратор)
Эксперт по математике/физике
8459 / 4217 / 575
Регистрация: 04.12.2011
Сообщений: 12,603
Записей в блоге: 14
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
3 / 3 / 1
Регистрация: 13.07.2013
Сообщений: 71
14.07.2013, 13:47 20
Спасибо, поизучаю и поэкспериментирую.
Смущает один аспект - ваш пример предполагает передачу переменных из одной функции (fool) в другую (main). Способов создания временных констант при такой организации программ достаточно много.
А у меня все должно происходить в рамках одной функции - обратного вызова. В ней я могу организовать только некие блоки, что я и попытался сделать условием if (gauge_state) { }.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2013, 13:47

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

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

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

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

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


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

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

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