Перейти к содержанию
    

Статические переменные в функции.

 

1 hour ago, jcxz said:

И...? Вам нужно срочно потратить лишнюю ОЗУ в программе и Вы не знаете как это сделать? Тогда да - это подойдёт. Если только оптимизатор не окажется умнее написавшего сиё и не удалит ненужные выделения памяти.

И больше не для чего.

ой. это с циклом while. я ушел от него.

uint8_t ResponseFromTube(uint8_t tube_id)
{
       static uint32_t no_ack_timeout;
       static uint32_t resp_timeout;
       uint32_t bit_progress_timeout;
       static uint8_t st_count = 0;
       uint8_t result;
	   uint8_t task_done = 0;
  
       //no_ack_timeout = globalSysTimer + (g_sfGcpcon[noAck] * 1000);
       //resp_timeout = globalSysTimer + (g_sfGcpcon[rqpRto] * 1000);
  
       switch (tube_state)
       {   
           case ST_IDLE :
				no_ack_timeout = globalSysTimer + (g_sfGcpcon[noAck] * 1000);
				resp_timeout = globalSysTimer + (g_sfGcpcon[rqpRto] * 1000);
				st_count = 0;
				tube_state = ST_CAN_RX;
			break;
           
            case ST_CAN_RX :
         
              if (globalSysTimer >= bit_progress_timeout)
			  {
				bit_progress_timeout = globalSysTimer + 1000;
				write_bit_process(st_count);
				st_count++;
				if (st_count > 5)
					st_count = 0;
			  }
                
                canbus_receive_one_channel(tube_id);
         
               if (globalSysTimer < no_ack_timeout)
               {
                  //и так далее
               }
         
            break;
      }    
}

no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, jenya7 said:

no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции?

От этого она не станет глобальной. Ни разу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, Forger сказал:

Увы, не удалит :mda:

Слово static - это как заклинание для компилятора и линкера. Ну, по крайней мере с теми  компиляторами, с которыми я работал 

Компиляторы быстро умнеют. В отличие от основной массы быдлокодеров.... :biggrin:

4 минуты назад, jenya7 сказал:

no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции?

Вам надо уже наконец-то взять учебник и прочитать раздел о типах памяти в си. И что такое "глобальная", "статическая", "автоматическая", "динамическая" и т.п. памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jcxz said:

В отличие от основной массы быдлокодеров.... :biggrin:

Это тема - очередное тому подтверждение, да и вообще, что ни тема, то дедсад про компиляторы или сектанты-кубодрочеры, которые не могу справиться с банальным поиском в гугле :dash2:

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

Static local variables: variables declared as static inside a function are statically allocated while having the same scope as automatic local variables. Hence whatever values the function puts into its static local variables during one call will still be present when the function is called again.

All static variables exist in what is known as the BSS or DATA data sections; BSS if it is uninitialized (which will initialize it to zero) and DATA if it is.

и что? в чем проблема? умники великие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

IAR, VxWorks достаточно профессиональные,

У IAR профессиональный только компилятор, возможно отладчик и анализатор кода. Может быть что-то ещё. Но никак ни его IDE. То, что они её прикладывают к своему компилятору, совершенно не пригодно для профессиональной работы с кодом (редактирование, я имею в виду, и навигацию, и рефакторинг и т.п.).

VxWorks, это же вроде ОС??!

1 hour ago, jcxz said:

Судя из вопроса - автор не понимает этого различия.

Странно, что он даже и не собирается этого делать.

 

40 minutes ago, jenya7 said:

no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции?

Простите, вы читать умеете? Я вам уже ответил на этот вопрос ранее, вот цитата меня же самого

1 hour ago, haker_fox said:

Глобальная переменная - это не статическая переменная. Глобальная переменная может быть статической. Вы же говорите о локальных статических переменных.

Вы точно понимаете различие между этими типами данных? Если да, то непонятен смысл вашего вопроса.

 

22 minutes ago, jenya7 said:

и что? в чем проблема?

Прежде, чем бросаться грозными словами на непонятном языке, прочитайте текст внимательнее. В нём ни разу не говорится, что статическая переменная обязательно становится глобальной.

22 minutes ago, jenya7 said:

умники великие

Да, мы опытнее вас в вопросе, который вы задали. Что вас задевает и обижает - не понятно. Вы упорно не желаете понять, что вам отвечают. А по десятому кругу задаёте один и тот же вопрос. И как на это реагировать нам, "великим умникам"?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, haker_fox said:

В нём ни разу не говорится, что статическая переменная обязательно становится глобальной.

да я понимаю какой становиться переменная. но зачем объявлять ее снаружи если она используется только в этой функции и должна сохранять свое значение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, jenya7 said:

если она используется только в этой функции и должна сохранять свое значение?

Как раз для этого и придуман static для локальных объектов. Если эта функция вызывается не только в пределах одного потока/задачи (есть RTOS), то все становится очень интересно )))

Поэтому сто раз надо подумать, а так ли сильно тут нужна static? Возможно, для конкретно взятого случая эту задачу можно нормально решить совсем иначе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, jenya7 сказал:

no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции?

Более бессмысленную фразу редко услышишь... :wacko2:

Автор, вы не понимаете значение понятий "глобальная" и "статическая".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, jenya7 said:

В последнее время увлекся использованием статических переменных в функции. Очень удобно - повышается переносимость функции из проекта в проект, повышается читаемость функции - видишь какими переменными она оперирует.

Но я как то не встречал проектов изобилующих статическими переменными в функции. Есть какие то подводные камни?

Код привязывается к данным. Нельзя извне например сбросить состояние, или сделать несколько экземпляров данных обрабатываемых одной функцией.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если переменная используется только в одной функции, и нужно, чтобы её значение сохранялось между вызовами, то вполне логично объявить её static.

Естественно, надо быть уверенным, что функция вызывается только из одного потока и без рекурсии. Например, для обработчиков прерывания - милое дело.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, jenya7 said:

она используется только в этой функции и должна сохранять свое значение?

Это единственная правильная причина, почему вам в вашей функции требуется статическая локальная переменная. А то, что вы озвучили в первом посте темы - это вообще ни о чём.

Или вы имели ввиду то, что до того, как узнали о существовании статических локальных переменных использовали внутри функций для этих целей глобальные? А потом вдруг узнали и заменили их на статические локальные? Тогда да, ваши доводы из первого поста становятся понятными.

Вам надо было сразу объяснить что с чем вы сравниваете:

1. Использование глобальных объектов в функциях

2. Использование статических локальных объектов в функциях.

Какие есть плюсы, минусы и ограничения у данных подходов по отношению друг к другу. Такая постановка вопроса правильная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...