Скачать презентацию 1 Лекция 3 Язык C типы данных Скачать презентацию 1 Лекция 3 Язык C типы данных

lecture3-c-asm.ppt

  • Количество слайдов: 17

1 Лекция № 3 Язык C: типы данных 1 Лекция № 3 Язык C: типы данных

2 План лекции • Глобальные переменные • Пользовательские типы данных (определения типа) • Структуры 2 План лекции • Глобальные переменные • Пользовательские типы данных (определения типа) • Структуры • Выравнивание • Упаковка • Работа с файлами

3 Глобальные переменные int abc = 5; int main(int argc, char** argv) { extern 3 Глобальные переменные int abc = 5; int main(int argc, char** argv) { extern int abc; printf("%dn", abc); }

4 Определения типа typedef unsigned int size_t; (size_t)5; size_t var = 4; int read. 4 Определения типа typedef unsigned int size_t; (size_t)5; size_t var = 4; int read. Bytes(size_t Size);

5 Три причины использовать typedef • Улучшение читаемости и понятность программы • Переносимость на 5 Три причины использовать typedef • Улучшение читаемости и понятность программы • Переносимость на разные платформы • Создание структур и указателей на функции

6 Структуры typedef struct { double x; double y; double z; } vector_3 d; 6 Структуры typedef struct { double x; double y; double z; } vector_3 d;

7 Работа со структурами typedef struct { double x; double y; double z; } 7 Работа со структурами typedef struct { double x; double y; double z; } vector_3 d; … vector_3 d my. Vector; vector_3 d* p_my. Vector = &my. Vector; my. Vector. x = 5. 0; p_my. Vector->y = 4. 0; (*p_my. Vector). z = 5. 0;

8 Работа со структурами vector_2 d* a = (vector_2 d*)malloc( sizeof(vector_2 d) ); 8 Работа со структурами vector_2 d* a = (vector_2 d*)malloc( sizeof(vector_2 d) );

9 Выравнивание данных • Различные способы разместить слово в 32 -разрядной памяти (одно обращение 9 Выравнивание данных • Различные способы разместить слово в 32 -разрядной памяти (одно обращение == чтение одной ячейки): 6 F FF FF FF 6 F 6 A 65 63 FF 73 5 C 62 FF FF FF 62 FF FF 6 D 70 66 6 C 69 70 5 C 20 38 20 2 B 20 3 D 20 24 4 C 20 24 54 30 20 2 E 63 62 53 61

10 Выравнивание данных • Выравнивание данных делает доступ к ним быстрее (за наименьшее количество 10 Выравнивание данных • Выравнивание данных делает доступ к ним быстрее (за наименьшее количество обращений к памяти)

11 Компилятор и выравнивание typedef struct { short a; long b; } mystr; … 11 Компилятор и выравнивание typedef struct { short a; long b; } mystr; … mystr k = {5, 4}; sizeof(k) == 8 !!! а а - b b По умолчанию вставляются два «пустых» байта для выравнивания!

12 Структура первого заголовка. bmp typedef struct { short int bf. Type; unsigned int 12 Структура первого заголовка. bmp typedef struct { short int bf. Type; unsigned int bf. Size; short int bf. Reserved 1; short int bf. Reserved 2; unsigned int bf. Off. Bits; } bmp_service_header;

13 #pragma Прагмы переопределяют какие-либо параметры компиляции на область своего действия #pragma once – 13 #pragma Прагмы переопределяют какие-либо параметры компиляции на область своего действия #pragma once – включать заголовок в файл только один раз

14 #pragma pack(2) #pragma pack(push, 2) typedef struct {…} mystruct; #pragma pack(pop) Сохраняет текущее 14 #pragma pack(2) #pragma pack(push, 2) typedef struct {…} mystruct; #pragma pack(pop) Сохраняет текущее значение выравнивания, действуя лишь на структуру mystruct

15 Работа с файлами – старые функции 1. 2. 3. 4. Создать указатель типа 15 Работа с файлами – старые функции 1. 2. 3. 4. Создать указатель типа FILE* Открыть (fopen) Прочитать/записать (fread/fwrite) Закрыть (fclose)

16 Работа с файлами #include <stdio. h> FILE *f; size_to_read = 5; int* my. 16 Работа с файлами #include FILE *f; size_to_read = 5; int* my. Array; f = fopen(“lol. bmp”, “rb”); //read binary fread(my. Array, size_to_read, 1, f); //1 раз fclose(f);

17 Лабораторная работа № 3 – дополнения 1. Заголовки читаются в структуры (одну или 17 Лабораторная работа № 3 – дополнения 1. Заголовки читаются в структуры (одну или две) одним вызовом fread 2. Используются безопасные функции для работы с файлами (с суффиксом _s – см. документацию на: fopen_s fread_s )