13 (1106250)
Текст из файла
Курс «Алгоритмы и алгоритмические языки»1 семестр 2013/2014Лекция 131Препроцессор: операции # и ##Операция ## позволяет объединить фактические аргументымакроса в одну строкуjava-opcodes.h:enum java_opcode {#define JAVAOP(NAME, CODE, KIND, TYPE, VALUE)OPCODE_##NAME = CODE,#include "javaop.def"#undef JAVAOPLAST_AND_UNUSED_JAVA_OPCODE};javaop.def:JAVAOP (nop,0, STACK,POP,0)JAVAOP (aconst_null,1, PUSHC,PTR,0)JAVAOP (iconst_m1,2, PUSHC,INT,-1)<...>JAVAOP (ret_w,209, RET,RETURN, VAR_INDEX_2)JAVAOP (impdep1,254, IMPL,ANY,1)JAVAOP (impdep2,255, IMPL,ANY,2)2Препроцессор: операции # и ##Операция ## позволяет объединить фактические аргументымакроса в одну строкуgcc –E java-opcodes.h:enum java_opcode {OPCODE_nop = 0,OPCODE_aconst_null = 1,OPCODE_iconst_m1 = 2,OPCODE_iconst_0 = 3,<...>OPCODE_impdep2 = 255,LAST_AND_UNUSED_JAVA_OPCODE};3Компоновка и классы памятиКласс памяти Время жизниВидимость Компоновка ОпределенаaвтоматическийавтоматическоеблокнетВ блокерегистровыйавтоматическоеблокнетВ блоке какregisterстатическийстатическоефайлвнешняяВне функцийстатическийстатическоефайлвнутренняяВне функцийкак staticстатическийстатическоеблокнетВ блоке как staticКвалификатор extern: переменная определена и память под неевыделена в другом файлеКлассы памяти функций:статическая (объявлена с квалифатором static)внешняя (extern), по умолчаниювстраиваемая (inline, C99)Объявление внешних функций в заголовочных файлах:extern void *realloc (void *ptr, size_t size);4КомпоновщикОрганизовывает слияние нескольких объектныхфайлов в одну программуРазрешает неизвестные символы (внешниепеременные и функции)Глобальные переменные с одним именемполучают одну область памятиОшибки, если необходимых имен нетили есть несколько объектов с одним именемОпции для указания места поискаХорошим стилем программирования являетсяэкспорт лишь тех объектов, которые используютсяв других файлах (интерфейс модуля)Используйте квалификатор staticСборка исполняемого файла или библиотеки5(статической или динамической)Отладка программВсе программы содержат ошибки, отладка – это процесс поискаи удаления некоторых ошибокСуществуют другие методы обнаружения ошибок (тестирование,верификация, статические и динамические анализаторы кода),но их применение не гарантирует отсутствия ошибокДля отладки используют инструменты, позволяющие получитьинформацию о поведении программы на некоторых входныхданных, не изменяя ее поведенияПростейший метод: отладочная печатьstatic void debug_array (int *a, int n) {int *a; int n;fprintf (stderr, "Array (%d)", n);n = read_array (a);for (int i = 0; i < n; i++)debug_array (a, n);fprintf (stderr, "%d ", a[i]);fprintf (stderr, "\n");}Отладочная печать может контролироваться макросом (NDEBUG)6Отладка программ: отладчикиОтладчик – основной инструмент отладки программыОтладчик позволяетзапустить программу для заданных входных данныхостанавливать выполнение по достижении заданныхточек программы безусловно или при выполнениинекоторого условия на значения переменныхостанавливать выполнение, когда некоторая переменнаяизменяет свое значениевыполнить текущую строку исходного кода программыи снова остановить выполнениепосмотреть/изменить значения переменных, памятипосмотреть текущий стек вызововНеобходимое условие для отладки на уровне исходного кода:наличие в исполняемом файле программы отладочнойинформации (связи между командами процессора и строкамиисходного кода программы, связь между адресами и7переменными и т.д.)Отладка программ: отладчик gdbКомпиляция с отладочной информацией: gcc -gНекоторые команды gdbgdb <file> --args <args> – загрузить программу сзаданными параметрами командной строкиrun/continue – запустить/продолжить выполнениеbreak <function name/file:line number> –завести безусловную точку остановаcond <bp#> condition – задать условие остановкивыполнения для некоторой точки остановаwatch <variable/address> – задать точкунаблюдения (остановка выполнения при изменениизначения переменной или памяти по адресу)next/step – выполнить текущую строку исходного кодапрограммы без захода/с заходом в вызываемые функцииprint <var>/set <var> = expression – посмотреть/изменить текущие значения переменных, памятиbt – посмотреть текущий стек вызововСреда Code::Blocks поддерживает gdb в своем интерфейсе 8Отладка программ: примеры команд gdbУстановка точек остановаможно использовать '.' вместо '->'b fancy_abortb 7199b sel-sched.c:7199cond 2 insn.u.fld.rt_int == 112cond 3 x_rtl->emit.x_cur_insn_uid == 1396Просмотр и изменение значений переменныхp orig_ops.u.expr.history_of_changes.basep bb->indexset sched_verbose=5call debug_vinsn (0x4744540)Установка точек наблюденияwa can_issue_morewa ((basic_block) 0x7ffff58b5680)->preds.base.prefix.num9Динамические структуры данныхСтек (stack) – это динамическая последовательностьэлементов, количество которых изменяется, причем какдобавление, так и удаление элементов возможно толькос одной стороны последовательности (вершина стека).Работа со стеком осуществляется с помощью функций:push(x) – затолкать элемент x в стек;x = pop() – вытолкнуть элемент из стека.Стек можно организовать на базе:фиксированного массива stack[MAX],где константа MAX задает максимальную глубину стека.динамического массива, текущий размер которогохранится отдельно.в обоих случаях необходимо хранить позицию текущейвершины стека.можно использовать и другие структуры данных(например, список).10Динамические структуры данныхОрганизация стека на динамическом массиве.struct stack {int sp;/* Текущая вершина стека */int sz;/* Размер массива */char *stack;} stack = { .sp = -1, .sz = 0, .stack = NULL };static void push (char c) {if (stack.sz == stack.sp + 1) {stack.sz = 2*stack.sz + 1;stack.stack = (char *) realloc (stack.stack,stack.sz*sizeof (char));}stack.stack[++stack.sp] = c;}11Динамические структуры данныхОрганизация стека на динамической памяти.struct stack {int sp;/* Текущая вершина стека */int sz;/* Размер массива */char *stack;} stack = { .sp = -1, .sz = 0, .stack = NULL };static char pop (void) {if (stack.sp < 0) {fprintf (stderr, "Cannot pop: stack is empty\n");return 0;}return stack.stack[stack.sp--];}static int isempty (void) {return stack.sp == -1;}12.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.