Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

На практике фиксированный размер также не является проблемой; мы знаем, что размер

BUFSIZ
достаточен для представления всех флагов, которые мы используем. Тем не менее, поскольку мы опытные и знаем, что вещи могут измениться, в
getflags2str
есть код, предохраняющий себя от переполнения буфера. (Переменная
space_left
и код в строках 18–20.)

В качестве отступления, использование

BUFSIZ
спорно. Эта константа должна использоваться исключительно для буферов ввода/вывода, но часто она используется также для общих
строковых буферов. Такой код лучше убрать, определив явные константы, такие, как
FLAGVALSIZE
, и использовав в строке 11 '
sizeof (buffer)
'.

Вот сокращенный сеанс GDB, показывающий использование

flags2str
:

$ gdb gawk /* Запустить GDB с gawk */

GNU gdb 5.3

...

(gdb) break do_print /* Установить контрольную точку */

Breakpoint 1 at 0x805a584: file builtin.c, line 1547.

(gdb) run 'BEGIN { print "hello, world" }' /* Запустить программу */

Starting program: /home/arnold/Gnu/gawk/gawk-3.1.4/gawk 'BEGIN { print "hello, world" }'

Breakpoint 1, do_print (tree=0x80955b8) at builtin.c: 1547 /* Останова в контрольной точке */

1547 struct redirect *rp = NULL;

(gdb) print *tree /* Вывести NODE */

$1 = {sub = {nodep =

 {1 = {lptr = 0x8095598, param_name = 0x8095598 "xU\t\b",

 ll = 134629464}, r = {rptr = 0x0, pptr = 0, preg = 0x0, hd = 0x0,

 av = 0x0, r_ent =0}, x = {extra = 0x0, xl = 0, param_list = 0x0},

 name = 0x0, number = 1, reflags = 0), val = {

 fltnum = 6.6614606209589101e-316, sp = 0x0, slen = 0, sref = 1,

 idx = 0}, hash = {next = 0x8095598, name = 0x0, length = 0, value = 0x0,

 ref = 1}}, type = Node_K_print, flags = 1}

(gdb) print flags2str(tree->flags) /* Вывести значение флага */

$2 = 0x80918a0 "MALLOC"

(gdb) next /* Продолжить */

1553 fp = redirect_to_fp(tree->rnode, &rp);

...

1588 efwrite(t[i]->stptr, sizeof(char), t[i]->stlen, fp, "print", rp, FALSE);

(gdb) print *t[i] /* Снова вывести NODE */

$4 = {sub = {nodep =

 {l = {lptr = 0x8095598, parm_name = 0x8095598 "xU\t\b",

 ll = 134829464}, r = {rptr = 0x0, pptr = 0, preg = 0x0, hd = 0x0,

 av = 0x0, r_ent =0), x = {extra = 0x8095ad8, xl = 134830808,

 param_list = 0x8095ad8}, name = 0xc <Address 0xc out of bounds>,

 number = 1, reflags = 4294967295}, val = {

 fltnum = 6.6614606209589101e-316, sp = 0x8095ad8 "hello, world",

 slen = 12, sref = 1, idx = -1}, hash = {next = 0x8095598, name = 0x0,

 length = 134830808, value = 0xc, ref = 1}}, type = Node_val, flags = 29}

(gdb) print flags2str(t[i]->flags) /*
Вывести значение флага */

$5 = 0x80918a0 "MALLOC|PERM|STRING|STRCUR"

Надеемся, вы согласитесь, что настоящий механизм общего назначения значительно более элегантный и более простой в использовании, чем первоначальный.

Тщательное проектирование и использование массивов структур часто может заменить или слить воедино повторяющийся код.

15.4.1.5. По возможности избегайте объединений

«Не бывает бесплатных обедов»

– Lazarus Long -

union
С относительно эзотерическая возможность. Она помогает экономить память, сохраняя различные элементы в одном и том же физическом пространстве; как программа интерпретирует его, зависит от способа доступа:

/* ch15-union.c --- краткая демонстрация использования union. */

#include <stdio.h>

int main(void) {

 union i_f {

int i;

float f;

 } u;

 u.f = 12.34; /* Присвоить значение с плавающей точкой */

 printf("%f also looks like %#x\n", u.f, u.i};

 exit(0);

}

Вот что происходит, когда программа запускается на системе Intel x86 GNU/Linux:

$ ch15-union

12.340000 also looks like 0x414570a4

Программа выводит битовый паттерн, который представляет число с плавающей точкой в виде шестнадцатеричного целого. Оба поля занимают одно и то же место в памяти; разница в том, как этот участок памяти интерпретируется:

u.f
действует, как число с плавающей точкой, тогда как эти же биты в
u.i
действуют, как целое число.

Объединения особенно полезны в компиляторах и интерпретаторах, которые часто создают древовидные структуры, представляющие структуру файла с исходным кодом (которая называется деревом грамматического разбора (parse tree)). Это моделирует то, как формально описаны языки программирования: операторы

if
, операторы
while
, операторы присваивания и так далее для всех экземпляров более общего типа «оператора». Таким образом, в компиляторе могло бы быть нечто подобное этому:

Поделиться:
Популярные книги

Я еще не бог. Книга XXXV

Дрейк Сириус
35. Дорогой барон!
Фантастика:
аниме
попаданцы
5.00
рейтинг книги
Я еще не бог. Книга XXXV

Неучтенный элемент. Том 11

NikL
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 11

Осколки на снегу. Игра на выживание

Птицына Элина
Фантастика:
эпическая фантастика
фэнтези
5.00
рейтинг книги
Осколки на снегу. Игра на выживание

Неукротимый Бастард. Дилогия

Измайлов Сергей
Неукротимый бастард
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Неукротимый Бастард. Дилогия

Вахмистр

Фиттер Марк
1. Казачий особый
Фантастика:
боевая фантастика
технофэнтези
фэнтези
4.50
рейтинг книги
Вахмистр

Том 2. Проза 1912-1915

Кузмин Михаил Алексеевич
2. Проза и эссеистика в трех томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 2. Проза 1912-1915

Дважды одарённый. Том X

Тарс Элиан
10. Дважды одаренный
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Дважды одарённый. Том X

Мемуары

Понятовский Станислав
Тайны истории в романах, повестях и документах
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Мемуары

Отрок (XXI-XII)

Красницкий Евгений Сергеевич
Фантастика:
альтернативная история
8.50
рейтинг книги
Отрок (XXI-XII)

Козацькому роду нема переводу, або ж Мамай i Чужа Молодиця

Ильченко Александр Елисеевич
Проза:
роман
5.00
рейтинг книги
Козацькому роду нема переводу, або ж Мамай i Чужа Молодиця

3ds Max 2008. Секреты мастерства

Верстак Владимир
Компьютеры и Интернет:
программное обеспечение
5.00
рейтинг книги
3ds Max 2008. Секреты мастерства

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.25
рейтинг книги
Дважды одаренный. Том VI

Чтоб знали! Избранное (сборник)

Армалинский Михаил Израилевич
Русская потаенная литература
Поэзия:
поэзия
5.00
рейтинг книги
Чтоб знали! Избранное (сборник)

И тогда он зачистил город

Тамоников Александр
Детективы:
боевики
7.22
рейтинг книги
И тогда он зачистил город