Что бы это значило?

Язык Си позволяет создавать выражения, которые не сразу и поймешь.
Знакомый принес с собеседования вот такую задачку:

Что выведет программа?

  int x = 2;
  x += x+++++x; 
  printf( "x=%u\r\n", x );

Ответ:
Читать далее

Рубрика: Великий и могучий Си | Метки: , | Комментарии (3)

Функции изменения порядка бит

Первый вариант — хитрый

unsigned char bits_reverse( unsigned char bits )
{
  bits = ( ( bits & 0xF0 ) >> 4 ) | ( ( bits & 0x0f ) < < 4 );
  bits = ( ( bits & 0xCC ) >> 2 ) | ( ( bits & 0x33 ) < < 2 );
  bits = ( ( bits & 0xAA ) >> 1 ) | ( ( bits & 0x55 ) < < 1 );
  return bits;
}

Вариант второй — быстрый.
Читать далее

Рубрика: Великий и могучий Си | Метки: , | Добавить комментарий

vim и меню переключения кодировки файлов

Во время работы в vim часто приходится редактировать файлы в различной  кодировке.

Для того чтобы открыть файл в нужной кодировке, надо выполнить команду:

:e ++enc=кодировка имяфайла

Вместо «кодировка» надо поставить необходимую (koi8-r, cp866, cp1251, utf8 )

Если имя файла не указывать то будет переоткрыт текущий файл.

Но гораздо удобней перекодировку делать не вводя команды а при помощи меню.

Читать далее

Рубрика: Редактор vim | Метки: | Добавить комментарий

Выравнивание и размер структуры

Есть у нас, допустим структура.

struct my_struct{
  int a;
  char b;
  int c;
};

Но если на разных платформах ( например avr и arm ) выполнить следующий код

printf("размер структуры %u\r\n", sizeof( struct my_struct ) );

то мы получим разные результаты. Для arm размер структуры равен 12, а для avr равен 5. Почему?

Читать далее

Рубрика: Великий и могучий Си | Метки: , | Комментарии (4)

Как создать демона в linux

Демон — это программа не имеющая стандартного ввода и вывода, и при этом работающая в фоновом режиме.

Исходный код простейшего демона:
Читать далее

Рубрика: Великий и могучий Си | Метки: , | Комментарии (8)

Особенности перенаправления в bash

Как оказалось, в bash порядок указания перенаправлений имеет значение.

Рассмотри две команды:

a.out > outfile 2&>1
a.out 2&>1 > outfile

Кажется, что делают они одно и тоже, но это не так. Читать далее

Рубрика: Использование linux | Метки: , | Добавить комментарий

Для чего нужен volatile

volatile — это квалификатор языка Си, который говорит, что переменная может изменятся в другом потоке (обработчике прерываний) или является указателем на регистр. Иначе говоря, volatile отключает оптимизацию обращения к этой переменной.

В качестве примера рассмотрим программу для микроконтроллеров avr atmega. Читать далее

Рубрика: Великий и могучий Си | Метки: , , | Комментарии (3)

Почему не работает getchar?

На некоторых системах не работает следующий код.

char ch;
while( getchar( &ch ) != EOF ) {
  putchar( ch );
}

Почему? Читать далее

Рубрика: Великий и могучий Си | Метки: , | Добавить комментарий

vim: замена текста с подстановкой

Текстовый редактор vim удобнейшая вещь, но я иногда забываю как в нем делать замену текста с подстановкой.

Например нам надо заменить во всем тексте BIT0 на _BV( 0 ), BIT1 на _BV( 1 ) и т.д.

Делать это вручную долго и муторно. И зачем себя мучить если  в vim это можно сделать одной командой: %s/BIT\([0-9]*\)/_BV( \1 )/gc

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

Рубрика: Редактор vim | Метки: , | Комментарии (3)