Архив метки: Си

Простое FIFO

Столкнулся с интересной реализацией циклического буфера на Си, поначалу даже подумал, что этот код не работает, но разобравшись, решил использовать в своих проектах. Весь код реализован в виде defin’ов и содержится в одном заголовочном файле fifo.h

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

Make: cтруктура Makefile

make — это утилита для автоматической сборки программ. Позволяет отслеживать изменения в исходном коде программы и компилировать не весь проект целиком а только те файлы которые изменились или те которые зависят от внесенных изменений. При больших проектах это дает существенную … Читать далее

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

Подводные камни define’ов

Определение макросов с помощью define очень часто используется программистами. Но есть некоторые особенности, незнание которых может привести к длительным поискам ошибок. Например есть макрос: #define square1( a, b ) \ a*= a; \ b*= b;#define square1( a, b ) \ … Читать далее

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

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

Язык Си позволяет создавать выражения, которые не сразу и поймешь. Знакомый принес с собеседования вот такую задачку: Что выведет программа? int x = 2; x += x+++++x; printf( "x=%u\r\n", x ); int x = 2; x += x+++++x; printf( "x=%u\r\n", … Читать далее

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

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

Первый вариант — хитрый unsigned char bits_reverse( unsigned char bits ) { bits = ( ( bits & 0xF0 ) >> 4 ) | ( ( bits & 0x0f ) < < 4 ); bits = ( ( bits & … Читать далее

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

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

Есть у нас, допустим структура. struct my_struct{ int a; char b; int c; };struct my_struct{ int a; char b; int c; }; Но если на разных платформах ( например avr и arm ) выполнить следующий код printf("размер структуры %u\r\n", sizeof( … Читать далее

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

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

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

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

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

На некоторых системах не работает следующий код. char ch; while( getchar( &ch ) != EOF ) { putchar( ch ); }char ch; while( getchar( &ch ) != EOF ) { putchar( ch ); } Почему?

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