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

Стили оформления программ на C/C++ и их применимость

1 час назад, fpga_student сказал:

Интересно бы понять в чем здесь сакральный смысл скобок.

Когда писали - pll_mult и  pll_mult_h были локальными переменными (что логично) и скобки ограничивали их область видимости. Потом код дорабатывал поклонник "классического K&R style" и он объявления переменных перенес в начало функции. Ну а скобки не входили в узкий круг понятий этого писаря, он их не тронул. 

57 минут назад, jcxz сказал:

Я почему-то обхожусь.

Покажьте! Покажьте нам объявления локальных переменных внутри case без фигурных скобок.

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


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

On 12/30/2023 at 9:14 PM, jcxz said:

Странно... Я почему-то обхожусь. ЧЯДНТ?  :umnik2:

Значит MSVC и GCC что-то делают не так.

А может быть вы не поняли о чем я ?

switch(...)
{
  case ... :
    {
      intt32_t a = 0;
      .....
    }
}

Вот без фигурных скобок в case будет ошибка следующего содержания (для GCC)

Quote

 error: a label can only be part of a statement and a declaration is not a statement

 

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


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

8 hours ago, Сергей Борщ said:

поклонник "классического K&R style" и он объявления переменных перенес в начало функции. Ну а скобки не входили в узкий круг понятий этого писаря, он их не тронул. 

Если верить Хабру, то поклонниками рационального стиля были Керниган и Ричи. Интересно они тоже были писарями ?)

 

8 hours ago, Сергей Борщ said:

Когда писали - pll_mult и  pll_mult_h были локальными переменными (что логично) и скобки ограничивали их область видимости. Потом код дорабатывал поклонник "классического K&R style" и он объявления переменных перенес в начало функции.

Файл system_at32f415.c :

 

    case CRM_SCLK_PLL:
      pll_clock_source = CRM->cfg_bit.pllrcs;
      if(CRM->pll_bit.pllcfgen == FALSE){

        /* get multiplication factor */
        pll_mult = CRM->cfg_bit.pllmult_l;
        pll_mult_h = CRM->cfg_bit.pllmult_h;
        /* process high bits */
        if((pll_mult_h != 0U) || (pll_mult == 15U)){
            pll_mult += ((16U * pll_mult_h) + 1U);
        }
        else{
            pll_mult += 2U;
        }

        if (pll_clock_source == 0x00){
          /* hick divided by 2 selected as pll clock entry */
          system_core_clock = (HICK_VALUE >> 1) * pll_mult;
        }
        else{

          /* hext selected as pll clock entry */
          if (CRM->cfg_bit.pllhextdiv != RESET){

            /* hext clock divided by 2 */
            system_core_clock = (HEXT_VALUE / 2) * pll_mult;
          }
          else{
            system_core_clock = HEXT_VALUE * pll_mult;
          }
        }
      }
      else{
        pll_ms = CRM->pll_bit.pllms;
        pll_ns = CRM->pll_bit.pllns;
        pll_fr = CRM->pll_bit.pllfr;

        if (pll_clock_source == 0x00){

          /* hick divided by 2 selected as pll clock entry */
          pllrcsfreq = (HICK_VALUE >> 1);
        }
        else{

          /* hext selected as pll clock entry */
          if (CRM->cfg_bit.pllhextdiv != RESET){

            /* hext clock divided by 2 */
            pllrcsfreq = (HEXT_VALUE / 2);
          }
          else{

            pllrcsfreq = HEXT_VALUE;
          }
        }
        system_core_clock = (uint32_t)(((uint64_t)pllrcsfreq * pll_ns) / (pll_ms * (0x1 << pll_fr)));
      }
      break;


 

Изменено пользователем haker_fox
Для оформления кода есть кнопка <>.

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


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

On 12/30/2023 at 10:21 PM, fpga_student said:

Интересно они тоже были писарями ?)

Да, были писарями. Целую книгу написали.

On 12/30/2023 at 10:21 PM, fpga_student said:

Файл system_at32f415.c :

И что вы эту портянку второй раз приводите ? К тому же без должного оформления.

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


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

11 минут назад, fpga_student сказал:

поклонниками рационального стиля были Керниган и Ричи. Интересно они тоже были писарями ?

 В первом издании их книги "Язык програмирования Си", которая до введения в 89 году первого стандарта языка была стандартом де-факто (изложенный в ней стиль и является тем самым "K&R style"), требовалось все локальные переменные объявлять в начале функции. Уже в следующем стандарте от 99 года локальные переменные можно было объявлять где угодно по мере необходимости. Наверное для введения этого изменения в стандарт были приведены веские доводы и эти доводы были признаны вескими. И если мне не изменяет память - в следующих изданиях этой книги отцы-основатели приняли это изменение.

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


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

On 12/30/2023 at 10:29 PM, dimka76 said:

Да, были писарями. Целую книгу написали.

Они сам язык еще написали)

On 12/30/2023 at 10:29 PM, dimka76 said:

И что вы эту портянку второй раз приводите ? К тому же без должного оформления.

Там видно, что тот кто писал hal, тупо снес условный оператор(видимо в 403a условие не нужно проверять в отличие от 415), и половину ветвления, а операторные скобки оставил на месте

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


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

13 минут назад, fpga_student сказал:

Файл system_at32f415.c :

И? Вопрос теперь в чем?

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


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

On 12/30/2023 at 10:06 PM, Сергей Борщ said:

Когда писали - pll_mult и  pll_mult_h были локальными переменными (что логично) и скобки ограничивали их область видимости. Потом код дорабатывал поклонник "классического K&R style" и он объявления переменных перенес в начало функции. Ну а скобки не входили в узкий круг понятий этого писаря, он их не тронул. 

В том что эта версия неверна

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


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

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

Там видно, что тот кто писал hal, тупо снес условный оператор(видимо в 403a условие не нужно проверять в отличие от 415) а операторные скобки оставил на месте

Может быть и так. Изначально этих исходных данных вами озвучено не было.

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


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

On 12/30/2023 at 10:38 PM, Сергей Борщ said:

Может быть и так. Изначально этих исходных данных вами озвучено не было.

Наткнулся после того как начали обсуждать

 

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


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

Еще двое суток ужасных мучений и наконец-то удалось подобрать программу и регэкспы которые худо-бедно работают.

Походу все что работает с регэкспами донельзя глюкавое в многострочных выражениях.

Единственное кого недожал - PowerGrep - уж больно у него странный интерфейс(( хотя возможно он лучший из всех)

Итоговые замены делает Multiple Search and Replace v.6.9. Тот же самый набор регэкспов в AdvanceFind&Replace 9.0 периодически недочищает символы перевода строки.

 

Этот набор регэкспов переводит в рациональный "классический K&R" стиль любой другой с торчащей открывающей скобкой:

 

\)\s*[\n\r]+\s*\{[\n\r]+         ){\n
do\s*[\n\r]+\s*\{[\n\r]+         do{\n
else\s*[\n\r]+\s*\{[\n\r]+       else{\n 
\"C\"\s*[\n\r]+\s*\{[\n\r]+      "C"{\n
enum\s*[\n\r]+\s*\{[\n\r]+       enum{\n
struct\s*[\n\r]+\s*\{[\n\r]+     struct{\n
union\s*[\n\r]+\s*\{[\n\r]+      union{\n
\=\s*[\n\r]+\s*\{[\n\r]+           = {\n 
PROTOTYPE\s*[\n\r]+\s*\{[\n\r]+  PROTOTYPE {\n

 

зы. Периодически ОНО оставляет пробел, вопреки всему(( Те получается ) {, вместо ){.

Мне уже болт, главное текст занимает минимум по высоте места, кому охота приключений может дотанцевать сам. Попытаться)

 

 

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


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

Да, таки дожал PowerGrep - он самый крутой. Фантастическая скорость работы, раз в 10 быстрее ближайшего конкурента. Погрипано этим набором регэкспов 500 метров сорцов на самом отстойном ноуте чуть не 2 ядра 1.5ГГц за 10 минут. Единственный тул что может отработать без ошибок регэкспы на несколько строк.

 

\)\s*[\n\r]+\s*\{\s*[\n\r]+         ){\n
do\s*[\n\r]+\s*\{\s*[\n\r]+         do{\n
else\s*[\n\r]+\s*\{\s*[\n\r]+       else{\n 
\"C\"\s*[\n\r]+\s*\{\s*[\n\r]+      "C"{\n
enum\s*[\n\r]+\s*\{\s*[\n\r]+       enum{\n
struct\s*[\n\r]+\s*\{\s*[\n\r]+     struct{\n
union\s*[\n\r]+\s*\{\s*[\n\r]+      union{\n
\=\s*[\n\r]+\s*\{\s*[\n\r]+         = {\n 
PROTOTYPE\s*[\n\r]+\s*\{\s*[\n\r]+  PROTOTYPE {\n

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


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

В 30.12.2023 в 21:06, Сергей Борщ сказал:

Покажьте! Покажьте нам объявления локальных переменных внутри case без фигурных скобок.

Странно... не думал, что здесь так много не умеющих написать примитивное объявление переменной.... 

int Tst1(int a, int *p)
{
  int r = -1;
  switch (a) {
    case 0:
      int i0;
      i0 = p[0];
      r = a + i0;
      break;
    case 1:
      int i1;
      i1 = p[1];
      r = a * i1;
      break;
    case 2:
      int i2;
      i2 = p[2];
      r = a << i2;
  }
  return r;
}

Что именно в таком тривиальном коде вызвало столько вопросов???   :scratch_one-s_head:

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


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

On 1/2/2024 at 12:31 AM, Obam said:

Казалось бы "причём здесь Чубайс" USART (((-8:

USART упал с неправильных регэкспов в неправильном туле. Завершение истории - правильные регэкспы в правильном туле.

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


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

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

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

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

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

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

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

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

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

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