Синтаксис языка Borland C++ позволяет одновременное задание шаблона, определение переменных по данному шаблону и их инициализацию.

Например:

union EXAMPLE

{ int i;

char  ch[2];

}; uni = {9650}        

13.3. Указатель на объединение

Описание шаблона объединения вводит по существу новый тип данных. Значит, вполне допустимо использовать указатель на введенный тип. Как и любой другой указатель иных типов данных, указатель на объединение занимает либо два байта (near), либо четыре байта (far).

Описание указателя на объединение не отличается от описания указателей на другие типы:

<типы> *<имя_указателя >;

где <тип> - задает имя шаблона объединения, указатель будет данного типа; < имя_указателя > - имя определяемого указателя. Например:

union EXAMPLE

{ int i;

char  ch[2];

}; *pexam;

union EXAMPLE *puni1, *puni2;

Указатели на объединение обычно используются для доступа к объединениям, размещенным в динамически выделенной памяти.

13.4. Размещение объединений в памяти

Все элементы объединения размещаются в одной и той же области памяти одного и того же адреса. Память, которая выделяется под объединение, определяется размером наиболее длинного из элементов данного объединения. Например, если описать объединение вида

union EXAMPLE_1

{ int i;

  float f;

  double d;

char  ch;

}uni;

то компилятор выделит под объединение uni 8 байтов, так как данное объединение содержит поле с максимальной длиной 8 байтов (поле типа double).

НЕ нашли? Не то? Что вы ищете?

Если же объявить следующее объединение:

union EXAMPLE_2

{ long double ld;

char  let[20];

}uni;

то компилятор выделит под объединение uni 20 байтов, так как в этом случае максимальную длину имеет поле, являющееся символьным массивом из элементов, для размещения которго необходимо 20 байтов, в то время как поле типа long double требует всего 10 байтов.

13.5 Динамическое использование памяти. Библиотечные функции

       

       Одним из способов хранения информации является использование системы динамического выделения памяти языка Borland C++. Область свободной памяти, доступной для выделения, находится между областью памяти, где размещается программа. Эта область называется кучей или хипом (от англ. heap – куча).

       Ядром динамического выделения памяти в Borland C++ являются функции№ объявленные в стандартной библиотеке в заголовочном файле stdlib. h, - malloc(), calloc(), realloc(), free(). 

В языке Borland C++ есть операция, с помощью которой можно определить размер участка памяти в байтах, который компилятор отводит под массив после его объявления, это операция sizeof. Формат записи:

                       sizeof(параметр);                 

параметр – тип объекта или его идентификатор (только не имя функции). Операция sizeof позволяет определить размер объекта по имени или типу, результатом является размер памяти в байтах (тип результата int).

Если указан идентификатор сложного объекта (массив, структура, объединение), то получаем размер всего сложного объекта. Например:

       sizeof(int)                ->        2 байта,

       int b[5];  sizeof(b)        ->        10 байт;

       int c[3][4];  sizeof(c)        ->        24 байта.

Операция sizeof применяется при динамическом распределении памяти:

float *x;                                // Указатель массива

int n;                                 // Количество элементов массива

                 x=(float*)calloc(n, sizeof(float));        // Захват и очистка памяти

Прототипы функций работы с памятью находятся в библиотеке alloc. h, рассмотрим основные из них:

void *calloc(unsigned n, unsigned m);        - возвращает указатель на начало области памяти для размещения n элементов по m байт каждый, при неудачном завершении возвращает значение NULL;

void *malloc(unsigned n); - возвращает указатель на блок памяти длиной n байт, при неудачном завершении возвращает значение NULL;

void *realloc(void *bf, unsigned n);        - изменяет размер ранее выделенной памяти с адресом начала bf на n байт;

void free(void *bf); - освобождает ранее выделенный блок памяти с адресом bf;

  coreleft(void);         - возвращает значение объема неиспользованной памяти (тип возвращаемого результата unsigned – для моделей памяти tiny, small, medium; unsigned long – для других моделей памяти).

Приведем пример динамического размещения одномерного массива

       #include<stdio. h>

       #include<stdlib. h>

       #include<conio. h>

       #include<alloc. h>

        void main(void)

       {  int i, n; float *a;

        puts(“\n Input n:”);  scanf(“%d”,&n);

        printf(“\n Свободная память -%d”,coreleft());

a=(float *)calloc(n, sizeof(float));// захват памяти

  printf(“\n Array a \n”);

       for(i=0; i<n; i++)

  {

       *(a+i)=(float)random(10);         // диапазон от 0 до 10

printf(“  %d“, a[i]);

       }

       printf(“\n Память после захвата -%d”,coreleft());

free(a);                                        // освобождение памяти

       getch(); 

  }

Практическое занятие № 14

Тема. Файлы

Цель: Изучить способы создания и работы с файлами в языке Borland C++.

Краткие теоретические сведения по теме

14.1. Понятие файла и файловой системы

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое.

Прежде, чем работать с файлом его нужно открыть для доступа, т. е. создать и инициализировать область данных, которая содержит информацию о файле: имя, путь и т. д.

В алгоритмическом языке Borland C++ это делает функция fopen. Она связывает физический файл на носителе, например  B:\LR7.CPP, с логическим именем в программе. Логическое имя – это указатель на файл, т. е. на область памяти, где храниться информация о файле. Указатели на файлы необходимо объявлять. Формат объявления такого указателя следующий:

FILE  *указатель на файл;

Например.

                       FILE  *f;

                       f=fopen ("B:\LR7.СPP", "w");

Символ "w" определяет право доступа к открываемому файлу. В данном случае открывается файл LR7.СPP на диске B:\ только для чтения.

В Borland C++ используются следующие коды, устанавливающие режимы доступа к открываемым файлам:

Символ

Описание

R

Файл открывается только для чтения. Если нужного файла на диске нет, то возникает ошибка.

W

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

A

Файл открывается для дозаписи в его конец новой информации.

r+

Файл открывается для редактирования его данных. Возможны и запись, и чтение информации.

w+

То же, что и для r+.

a+

То же, что и для a, только запись можно выполнять в любое место файла. Доступно и чтение файла.

T

Файл открывается в текстовом режиме. Указывается поле r, w, a, r+, w+, a+.

B

Файл открывается в двоичном режиме. Указывается поле r, w, a, r+, w+, a+.


Текстовый режим отличается от двоичного тем, что при открытии файла как текстового пара символов « перевод-строки», «возврат каретки» заменяется на один символ: «  перевод-строки» для всех функций записи данных в файл, а для всех функций вывода символ «перевод-строки» теперь заменяется на два символа: « перевод-строки»,«возврат каретки».

По умолчанию файл открывается в текстовом режиме.

После работы с файлом, доступ к файлу необходимо закрыть. Закрывает файл в языке Borland C++ функция fclose. Например, из предыдущего примера ее закрывается так:        fclose (f);

Для открытия нескольких файлов введена функция, объявленная следующим образом:        Void fcloseall(Void);

Если требуется изменить режим доступа к файлу, то для этого сначала необходимо закрыть данный файл, а затем вновь его открыть, но с другими правами доступа. Для этого используют стандартную функцию freopen, описанную в stdio. h как  FILE* freopen (char filename, chov*mode, FILE  *stream). Эта функция сначала закрывает файл, связанный с потоком stream (как это делает функция fopen), а затем открывает файл с именем filename и правами доступа mode, записывая информацию об этом файле в переменную stream.

В алгоритмическом языке Borland C++  имеется возможность работы с временными файлами, т. е. с такими, которые нужны только в процессе работы программы и которые надо удалить после выполнения части вычислений. в этом случае используют функцию tmpfile со следующим объявлением:        FILE* tmpfile (void).

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26