![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Динамическое выделение и освобождение памяти
При компиляции программы память компьютера разбивается на четыре области, содержащие код программы, глобальные данные, стек и динамически распределяемую память ( иногда ее называют heap - куча). Heap – это свободная память, с которой можно работать с помощью функций new и delete. Для new аргументом является выражение, определяющее размер выделяемого массива, а возвращаемое значение – это указатель на начало массива: int *array=new int[10]; Если память не может быть выделена, то оператор new возвращает указатель NULL . После каждой операции выделения памяти обязательна проверка указателя на NULL: if(array==NULL) printf(“memory allocation error.”); else { // действия при правильном выделении памяти } Выделенная динамически память автоматически не освобождается при выходе из блока или по завершению программы. Для ее освобождения обязательно необходимо выполнить команду delete[] имя_массива; (delete[] array; - для предыдущего случая).
Практическое задание. Вариант1. Вычислите скалярное произведение векторов Размерность векторов и их координаты должны вводится с консоли. Контрольные примеры:
Вариант 2. Вычислите произведение матрицы на вектор. Размерности вектора Контрольные примеры:
Вариант 3. Вычислите сумму матриц. Контрольные примеры:
Вариант 4. Напишите процедуры умножения и сопряжения матриц и с их помощью вычислите Размерности матриц и их элементы вводятся с консоли. Элементы матрицы C должны выводится на экран. Контрольные примеры:
Тема 5. Ввод и вывод в языке С++. В языке С имеется весьма развитая библиотека функций ввода-вывода. Однако в самом языке отсутствуют какие-либо предопределенные файловые структуры. Все данные обрабатываются как последовательность байт. Имеется три основных типа функций: потоковые, работающие с консолью и портами ввода-вывода и низкоуровневые. Потоковые функции. В потоковых функциях файлы данных рассматриваются как поток отдельных символов. Когда программа открывает файл для ввода вывода при помощи потоковых функций, то открытый файл связывается с некоторой переменной типа FILE (определенной в stdio.h), содержащей базовую информацию об этом файле. После открытия потока с помощью функции fopen возвращается указатель на эту переменную. Этот указатель используется для ссылки к файлу при всех последующих операциях ввода-вывода и называется указателем потока. Все потоковые функции обеспечивают буферизованный, форматированный или неформатированный ввод/вывод. Буферизация потока разгружает приложение. Однако следует иметь в виду, что при аварийном завершении программы содержимое буферов вывода может быть потеряно. Аналогичным образом выглядят функции, работающие с консолью и портами. Они позволяют читать и писать на терминал или в порт ввода/вывода (например, в порт принтера). Функции портов ввода/вывода выполняют простое побайтное считывание или запись. Функции ввода/вывода на консоль обеспечивают несколько дополнительных возможностей, например можно определить момент, когда будет введен символ с консоли и т.п. Для использования потоковых функций в программу должен быть включен заголовочный файл stdio.h. В нем содержатся описания прототипов функций ввода/вывода, а также - описания ряда констант. Константа EOF определяется как значение, возвращаемое при обнаружении конца файла, BUFSIZE - размер буферов потока, тип FILE определяет структуру, используемую для получения информации о потоке. Поток открывается с помощью функций fopen(), fdopen() или freopen(). В момент открытия задаются режим файла и способ доступа. Эти функции возвращают указатель на переменную типа FILE, например FILE *file1; file1=fopen(“input.dat”,”r”); открывает файл input.dat для чтения. Переменная file1 получает указатель на поток. Возможные типы доступа: “a” – запись в режиме добавления в конец файла, ”a+” –тоже, что и “a”, но возможно и чтение, ”r” – только для чтения, ”r+” – для чтения и записи, ”w” – открывается пустой файл для записи, ”w+” – открывается пустой файл для записи и чтения. Когда начинается выполнение приложения, автоматически открывается следующие потоки: стандартное устройство ввода stdin, стандартное устройство вывода stdout, устройство сообщений об ошибках stderr, устройство печати stdprn и стандартное дополнительное устройство stdaux. Эти файловые указатели можно использовать во всех функциях ввода/вывода в качестве указателя на поток. Некоторые функции автоматически используют указатели на поток, например getchar() и putchar() используют stdin и stdout соответственно. Для закрытия потоков используются функции fclose() и fcloseall(). Если программа не закрывает поток явно, то он закрывается автоматически по ее завершению. Для перемещения по файлу можно использовать функции fseek(), ftell() и rewind().
![]() |