Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
11
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

1.4 Розробити консольну програму, яка відкриває файл порціями по 4Кб та відображае його зміст в вікні. Для роботи з файлами викорастати Win32 Api

#include <windows.h>

#include <tchar.h>

#ifndef UNICODE

#include <stdio.h>

#endif

#define BUFFERSIZE 0x1000

int_tmain(int argc, TCHAR * argv[])

{

TCHAR szFile[_MAX_PATH];

HANDLE hReadFile;

_tprintf(_T(“Имя файла”));

_getts(szFile);

hReadFile = CreateFile(szFile, GENERIC_READ,0,(LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATRIBUTE_NORMAL, (HANDLE) NULL);

if(hReadFile==INVALID_HANDLE_VALUE)

{

_tprintf(_T(“Ошибка открытия файла”));

return;

}

else

{

//считать порциями по 4 Кб и отобразить на экран

BYTE buffer[BUFFERSIZE];

DWORD dwRead;

do

{

BOOL fRead = ReadFile(hReadFile, buffe, BUFFERSIZE, &dwRead, NULL);

If(fRead == FALSE)

{

_tprintf(_T(“Ошибка чтения”));

break;

}

else if(dwRead == 0)

{

_tprintf(_T(“\r EOF обнаружен\n”));

break;

}

else

{

//отобразить данные

DWORD ndx;

For(ndx=0; ndx<dwRead;ndx++)

{

_tprintf(_T(“%c [%#2.2hx]\t”),buffer[ndx], (USHORT) buffer[ndx]);

}

}

}

while(dwRead == BUFFERSIZE);

CloseHandle(hReadFile);

Return 1;

}

    1. Определить маску подсети, которая соответствует диапазону ip-адресов.

- от 128.71.0.1 до 128.71.255.254

- от 172.88.32.1 до 172.88.63.254

- от 61.8.0.1 до 61.15.255.254

- от 7.0.0.1 до 7.255.255.254

  • от 128.71.0.1 до 128.71.255.254

Маска подсети 255.255.0.0

  • от 172.88.32.1 до 172.88.63.254

1 Способ

172.88.32.1

172.88.63.254

255.255.?.0.

переводим из 10ой системы в 2ую

3210=001000002

6310=001111112

111000002=22410

Маска подсети 255.255.224.0

2 Способ

определяем шаг подсети

следующая подсеть 64 значит 64-32=32 шаг подсети 32

Это вес младшей единицы в маске

111000002=22410

маска подсети 255.255.224.0

  • от 61.8.0.1 до 61.15.255.254

61.8.0.1

61.15.255.254

255.?.0.0.

определяем шаг подсети

следующая подсеть 16 значит 16-8=8 шаг подсети 8

Это вес младшей единицы в маске

111110002 = 24810

маска подсети 255.248.0.0

  • от 7.0.0.1 до 7.255.255.254

Маска подсети 255.0.0.0

2.1 Указатели в С++, их использование. Динамическое распределение памяти

Переменные, которые хранят адреса других переменных, называются указателями.

Указатель - это переменная целого типа, которая интерпретируется как адрес байта памяти, содержащий некоторый элемент данных.

Суть концепции указателей состоит в том, что вы работаете с адресом ячейки памяти, получая лишь косвенный доступ к ее содержимому, благодаря чему появляется возможность динамически создавать и уничтожать переменные. Хотя с помощью указателей можно создавать чрезвычайно эффективные алгоритмы, сложность программы, в которой используются указатели, значительно возрастает.

В языках C/C++ все переменные должны быть предварительно объявлены. Объявление указателя pimemorycell_address выглядит следующим образом:

int *pimemorycell_address;

Символ * говорит о том, что создается указатель. Этот указатель будет адресовать переменную типа int. Следует подчеркнуть, что в C/C++ указатели могут хранить адреса только переменных конкретного типа. Если делается попытка присвоить указателю одного типа адрес переменной другого типа, возникнет ошибка либо во время компиляции, либо во время выполнения программы.

Обращение к переменной, чей адрес хранится в другой переменной, осуществляется путем помещения перед указателем оператора *: *pimemorycell_address. Такая запись означает, что будет произведен косвенный доступ к ячейке памяти через имя указателя, содержащего адрес ячейки. Например, если выполнить две показанные ниже строки, то переменная imemorycell_contentsпримет значение 20:

pimemorycell_address = &imemorycell_contents;

*pimemorycell_address = 20;       

Чтобы объявить в программе указатель, который будет хранить адрес другого указателя, нужно просто удвоить число звездочек в объявлении:

int  **ppi;

Каждый символ * читается как указатель на. Таким образом, количество указателей в цепочке, задающее уровень косвенной адресации, соответствует числу звездочек перед именем идентификатора. Уровень косвенной адресации определяет, сколько раз следует выполнить операцию раскрытия указателя, чтобы получить значение конечной переменной.

Во время компиляции программ на языках C/C++ память компьютера разделяется на четыре области: программного кода, глобальных данных, стек и динамическую область ("куча"). Последняя отводится для хранения временных данных и управляется функциями распределения памяти, такими как malloc() и free(). Функция mallос () резервирует непрерывный блок ячеек для хранения указанного объекта и возвращает указатель на первую ячейку этого блока. Функция free() освобождает ранее зарезервированный блок и возвращает эти ячейки в динамическую область для последующего резервирования. В качестве аргумента в функцию malloc() передается целочисленное значение, указывающее количество байтов, которое необходимо зарезервировать. Если резервирование прошло успешно, функция malloc() возвращает переменную типа void*, которую можно привести к любому необходимому типу указателя. Концепция использования указателей типа void описана в стандарте ANSI С. Этот спецификатор предназначен для создания обобщенных указателей неопределенного типа, которые впоследствии можно преобразовывать к требуемому типу. Обобщенный указатель сам по себе не может быть использован для обращения к каким-нибудь данным, так как он не связан ни с одним из базовых типов данных. Но любой указатель может быть приведен к типу void и обратно без потери информации. В следующем фрагменте программы резервируется память для 300 чисел типа float:

float *pf;

int inura_floats = 300;

pf = (float *) malloc(inum_floats * sizeof(float));

В данном примере функция malloc() резервирует блок памяти, достаточный для хранения 300 значений типа float. Выделенный блок надежно отделен от других блоков и не перекрывается ими. Предугадать, где именно он будет размещен, невозможно. Все блоки особым образом помечаются, чтобы система могла легко их обнаруживать и определять их размер. Если блок ячеек больше не нужен, его можно освободить следующей строкой:

free ((void*)   pf);