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

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

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

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

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

Как обычную переменную на время сделать константой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2013, 10:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как обычную переменную на время сделать константой? (C++):

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

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

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

Консольное приложение.Описать как структуру переменную время - C++
Описать как структуру переменную время (с полями часы, минуты, секунды). Составить и протестировать функцию СЕКУНД(t, t1, d), которая...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
15.07.2013, 17:21 #31
kotgav, скажу честно, мало что понятно. То есть библиотека получает время самостоятельно, как я понял. Тогда и не нужно пытаться его останавливать. Поставьте вопрос так: -" Что мне нужно остановить во времени?" Если доступ к работе библиотеки у Вас есть только через установку номера картинки, то возвращайте прежний номер всё время пока Вам нужно.
Не взыщите если и это не в тему.
А вообще, лучше бы Вам сформулировать вопрос как-то иначе. Например: работаю в MVS, в проекте MFC, с внешней библиотекой такой-то..., вопрос в следующем...
Может кто-то и скажет.
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
15.07.2013, 17:28 #32
Можно так сказать, что библиотека получает время самостоятельно из приложения. Точнее значения переменной с частотой 1 герц, т.е. каждую секунду абсолютное значение секунд: 0, 1, 2 и т.д. А я могу включиться в процесс в любой момент времени, например, когда значение этой переменной равно 43. Вот его мне и надо запомнить.
Не останавливать бег переменной, а запомнить то значение, которое было у переменной в момент запуска библиотеки.
Похоже, для данного случая, задача не решаемая.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
15.07.2013, 17:30 #33
Цитата Сообщение от kotgav Посмотреть сообщение
Как и ожидал, замораживания переменной a не происходит, ее значение меняется так же, как и значение переменной ant.
Так что для одной функции этот вариант не подходит.
Мне в силу недостатка опыта непонятно, почему из функции нельзя вызвать функцию (вынести часть кода в функцию) или наоборот: почему нельзя код вызова библиотечной функции (или установки управляющих переменных, для событийно-управляемой модели) обернуть функцией. Попробуйте всё же переформулировать вопрос (см. предыдущий пост).
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
15.07.2013, 17:34 #34
А кстати, это идея! Попробую сделать совсем другую функцию и объявить глобальные переменные. При первом обращении к функции обратного вызова вызвать новую функцию и в ней присвоить начальные значения.
Может быть и получится, кто его знает.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
15.07.2013, 17:37 #35
Цитата Сообщение от kotgav Посмотреть сообщение
Вот его мне и надо запомнить.
Вы то его запомните. Хоть в глобальной переменной. Однако непонятно, что Вы хотите. Чтобы библиотека это сделала? Смотрите документацию, можно ли и как это сделать. Может оказаться, что в соответствии с предлагаемыми возможностями это и не нужно, а можно иначе.

Добавлено через 1 минуту
Цитата Сообщение от kotgav Посмотреть сообщение
При первом обращении к функции обратного вызова вызвать новую функцию и в ней присвоить начальные значения.
Рад это слышать. Напишите что вышло.
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
15.07.2013, 17:38 #36
Напишу, спасибо за помощь!
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
16.07.2013, 17:55 #37
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//ну очень смешное решение))
#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;
}
Проработал еще раз пример и переделал его для лучшего понимания, как мне показалось.
Пример наглядный. Принцип сохранения значения в качестве временной константы основан на использовании const в вызываемой функции.
А со своей функцией обратного вызова продолжаю работать.
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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
// Вспомогательная (вызываемая) функция
int foo1(int ai)
{
    static int prevA;        // вспомогательная переменная, инициализируется нулём до первого вызова
    if(prevA == 0)           // проверяем, если 0 - то значение первое, иначе возвращаем старое значение аргумента
        prevA = ai;          // если значение первое, то присваиваем вспомогательной переменной полученное значение из вызывающей функции
    const int a = prevA;     //если хотите для самодисциплины, "замораживаем" значение аргумента функции foo1()
//далее работаем с переменной a 
return a;   // возвращаем "замороженное" значение переменной
}
 
 
// Главная (вызывающая) функция
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int i = 0;
    int b = 0;
    int c = 0;
 
    for(int i=1; i<5; ++i)
    {
        b = foo1(i);     // присваиваем "замороженное" переменной b, которая выполняет роль временной константы в вызывающей функции
        c = i-b;         // текущая разность
 
        cout << "i= "<< i << " а= " << b << " c= " << c << "\n";;    // вывод текущего i и "замороженного foo1(i)" значений 
        system("pause");
    }
 
    system("pause");
    return 0;
}
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
16.07.2013, 18:07 #38
Цитата Сообщение от kotgav Посмотреть сообщение
Принцип сохранения значения в качестве временной константы основан на использовании const в вызываемой функции.
Не-а, на основе использования static основан. Конст можно и не использовать, но если функция большая, вполне уместно.
Второй пример с инициализирующим значением (дополнительной статической переменной) лучше подходит. Нет же гарантии, что 0 не получите потом. Это нормальное значение секунд на каждой 61-й секунде предыдущей минуты, другими словами. Успеха!
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
16.07.2013, 18:10 #39
Цитата Сообщение от IGPIGP Посмотреть сообщение
Не-а, на основе использования static основан. Конст можно и не использовать, но если функция большая, вполне уместно.
Второй пример с инициализирующим значением (дополнительной статической переменной) лучше подходит. Нет же гарантии, что 0 не получите потом. Это нормальное значение секунд на каждой 61-й секунде предыдущей минуты, другими словами. Успеха!
Да, пожалуй, что static. Но и const здесь нелишним поставлен, для надежности.
Второй пример тоже изучил, применил у себя. Но пока не присваивается начальное значение, а все время остается этот -1, который был даден ему при инициализации. Разбираюсь.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
16.07.2013, 19:06 #40
Цитата Сообщение от kotgav Посмотреть сообщение
Второй пример тоже изучил, применил у себя. Но пока не присваивается начальное значение, а все время остается этот -1, который был даден ему при инициализации. Разбираюсь.
Дык, положите кода столько сколько нужно. Может и увидим чего.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.07.2013, 19:15 #41
Цитата Сообщение от BigLow Посмотреть сообщение
Как обычную переменную на время сделать константой?
А как самому на время стать решёткой? Переменная не может быть константой.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.07.2013, 20:15 #42
Цитата Сообщение от taras atavin Посмотреть сообщение
А как самому на время стать решёткой? Переменная не может быть константой.
Опять вы за своё...

Смотрите, вот формула:
4x2 + 3x + 7 = 0
Не думаю, что кто-то называет здесь x иначе как переменной. Но тем не менее значение x ни при каких условиях не изменяется (в пределах этого выражения).
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.07.2013, 20:20 #43
Во-первых если оно не меняется в конкретный период времени, то это ещё не означает константности. Не хочешь не меняй. А константа - это то, чего менять нельзя. Уж или можно, тогда переменная, или нельзя. Одно из двух, а
C++
1
const int a=a;
- перекрытие переменной другой величиной, а не трансформация изменением истинного имени (смотри волшебника земноморья). А во-вторых здесь не видно переменной, x здесь - просто величина, но пока что не факт, что именно переменная.
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
16.07.2013, 20:20 #44
Терминологический спор - самый сложный. Предлагаю не обострять на этом внимание. Главное - что значение переменной можно однажды "поймать" и потом использовать это пойманное значение как константу в течение какого-то времени.
Сегодня научили меня еще одному способу сохранения "пойманного" начального значения - с помощью глобальной переменной.
Тогда можно не вводить локальную ststic переменную, а объявить глобальную переменную, например типа int.
Результат будет такой же.
Настроение поднялось, можно двигаться дальше.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
16.07.2013, 21:24 #45
Цитата Сообщение от taras atavin Посмотреть сообщение
А как самому на время стать решёткой? Переменная не может быть константой.
Первое, действительно трудно. "От тюрьмы да от сумы...", как говорится. А второе просто правда и всё. Тем не менее [TC] получил советы передать в в функцию как const, константную ссылку или даже ссылку на ссылку (не помню это говорили или нет). И ничего.
Второй вопрошающий, спрашивает вообще не об этом. Как выяснилось позже. Особенно в свете:
Цитата Сообщение от kotgav Посмотреть сообщение
Сегодня научили меня еще одному способу сохранения "пойманного" начального значения - с помощью глобальной переменной.
И тоже ничего. Почему бы не поговорить?

Добавлено через 4 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
- перекрытие переменной другой величиной, а не трансформация изменением истинного имени (смотри волшебника земноморья). А во-вторых здесь не видно переменной, x здесь - просто величина, но пока что не факт, что именно переменная.
Ну и пусть. С точки зрения доступа в коде это тоже самое имя. Не так ли? Не важно, что произошло затенение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 21:24
Привет! Вот еще темы с ответами:

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

Как лучше сделать глобальную переменную? - C++
Интернет совсем пустой в плане глобальных переменных на с++ Задача следующая: 1. Нужно создать много глобальных переменных будет...

Как сделать одну глобальную переменную - C++
Есть многофайловый проект. К примеру 5 файлов(5 &quot;H&quot; файлов+для них 5 &quot;срр&quot; файлов, пускай в каждом файле будет лежать класс) и есть...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.07.2013, 21:24
Ответ Создать тему
Опции темы

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