Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 101

Переменная const изменяет своё значение

18.07.2018, 21:40. Показов 1704. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Суть вопроса в том что переменная типа const изменяет своё значение.

C
1
2
3
4
5
6
7
8
9
uint8_t 
gsm_state = GSM_HANDLER_STANDBY, 
gsm_sim = 0, //Статус конечного автомата, статус наличия симки
gsm_incorrect_code = 0, //0 - не было ошибок при вводе пин кодов, 1 - был хоть один раз неправильно введён пин или пак код симки, 2 - при изменении пинов 1 и 2 были неправильно введены текущие пины
gsm_try_pin = 0, gsm_try_puk = 0, gsm_try_pin2 = 0, gsm_try_puk2 = 0, //Количество попыток вводов кодов симки (число)
gsm_pin_edit = 0, gsm_puk_edit = 0, gsm_pin2_edit = 0, gsm_puk2_edit = 0; //Количество попыток вводов кодов симки (число)(значение которое будем менять)
const uint16_t tik_on_sec = 2000; //1 секунда - 2000 тиков таймера(при настройке TIM12)
volatile uint8_t gsm_buffer_index_head = 0, gsm_buffer_index_tail = 0, gsm_count_split = 0; //Индексы головы и хвоста кольцевого буфера и счётчик разделителей
volatile uint16_t gsm_launch = 0, gsm_restart = 0; //Переменная для запуска модема. Она же счётчик, счётчик таймаута времени для ошибок
Вобщем ставлю точку останова сразу же на первой возможно позиции после объявления переменных. И значение вместо 2000, показывает 2176.

И ещё, далее в программе делаю так:

C
1
2
3
4
5
6
7
void gsm_start(void){
  char buff[3] = ""; //Массив для хранения отсчёта времени инициализации и вывода его на экран
    static uint8_t timer = GSM_LOAD_TIME; //время (в тиках) за которое с модема после его включения, придёт весь мусор из служебных команд.
    static uint16_t sec_counter = tik_on_sec;
    if(!(TIM12->CR1 & TIM_CR1_CEN)){
        TIM12->CR1 |= TIM_CR1_CEN;
               .........
ошибка на строку static uint16_t sec_counter = tik_on_sec; (User\src\gsm.c(129): error: #28: expression must have a constant value) Как правильно записать, если я не хочу что бы tik_on_sec как либо поменялся?
Спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2018, 21:40
Ответы с готовыми решениями:

Переменная самопроизвольно изменяет свое значение
Есть код: int M = new int{ 1, 2, 3, 4, 5, 7, 10 }; Random random = new Random(); for (int i = 10; i <= 100000; i *= 10)...

Переменная не изменяет значение в функции
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Threading; public...

Переменная не меняет свое значение
Привет. Почему вот в этом варианте, при вызове функции, у меня не изменяется значение переменной? Оно почему то всегда стоит на нуле. ...

3
87 / 86 / 4
Регистрация: 20.11.2016
Сообщений: 270
18.07.2018, 21:50
supercelt,
а
C
1
#define  tik_on_sec  2000
так сделать нельзя?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
18.07.2018, 22:01
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

supercelt, для инициализации static переменных нужны константы времени компиляции.
слово const в C не объявляет константу времени компиляции, а означает "переменная, которую нельзя изменить в этой области видимости"(что сбивает с толку):
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void) {
    int i = 0;
    for(; i < 3; ++i)
    {
        const int ci = i + 1;
        printf("%d\n", ci);
    }
    return 0;
}
Используйте enum
C
1
2
3
4
enum constants
{
    tik_on_sec = 2000
};
1
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,860
19.07.2018, 08:06
Цитата Сообщение от Radikal_78 Посмотреть сообщение
C
1
#define tik_on_sec 2000
тогда лучше, для исключения коллизий, вот так
C
1
#define tik_on_sec ((uint16_t)2000)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2018, 08:06
Помогаю со студенческими работами здесь

Как сделать, чтобы переменная не затирала свое предыдущее значение? (См. внутри)
При выборе нескольких значений RadioGroup нужно вывести все значения, которые выбрали. begin case RadioGroup1.ItemIndex of 0: begin...

При выполнении условия переменная bool должна менять свое значение на противоположное
Доброго всем здравия, духовного и телесного. Как сделать чтобы при выполнении условия значение переменной менялось на противоположное. Это...

int const * const foo(const int* param) const - разъясните значение квалификаторов
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

Как сделать так, чтобы при нажатии на одну кнопку переменная не сбрасывала свое значение, которое было раньше?
У меня объявлены переменные с их значениями, при нажатии на одну кнопку оно добавляет к переменной $summa значение, но при нажатии на...

Указатель на const массив изменяет его?
Привет! Задача была написать функцию, сохраняющую расширение файла из строки file_name в строку extension. Строка file_name задана как...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru