Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
konspect.doc
Скачиваний:
7
Добавлен:
23.09.2019
Размер:
151.55 Кб
Скачать

47. Общий случай двумерного массива.

Рассмотрим организацию т.н. рваного массива, т.е. такого, строки которого отличаются по длине.

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

Существуют различные техники подсчета кол-ва элементов в нем:

1)терминальные символы.

2)хранение кол-во элементов в [-1] элементов.

3)кол-во строк хранить в дескрипторе, в нем же хранится массив размеров строк и вектор указателя.

Массив представляется в виде одномерного вектора указателей на строки указатель на длины строк двумерного массива. Каждой строке выделяется соответствующий блок памяти в конструкторе. Картинку нарисовать.

48. Особенности работы с массивами большого размера

Массивами большого размера будем называть такие массивы, которые не помещаются в сегменте памяти.

Для больших двумерных массивов вариантом решения проблемы может служить предложенная в предыдущем разделе схема массива в виде вектора указателей на строки.

Следующая программа иллюстрирует использование массива размером большим максимального размера сегмента:

void far FarMalloc( unsigned long size )

{

void far *p = farmalloc(size);

if( !p )

{ printf("Недостаточно памяти!\n"); exit(1); }

return p;

}

void main(void)

{

double huge *A;

unsigned long i, maxN;

/* Выделение максимального блока памяти */

A = (double huge *) FarMalloc( maxN = farcoreleft() );

maxN /= sizeof(double);

printf("Размер массива: %lu\n", maxN);

getch();

/* Заполняем массив */

for(i = 0; i < maxN; i++) A[i] = i;

/* Печатаем часть массива.*/

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

{

printf("%10.3lf ", A[i]);

if( (i + 6) % 5 == 0 ) printf("\n");

if( (i + 121) % 120 == 0 ) { getch(); clrscr(); }

}

printf("\n");

/* Освобождение памяти */

farfree(A);

}

Если в этой программе поменять атрибут huge на far, то вся адресация будет выполняться по модулю равному размеру сегмента и результат будет неверным.

49. Описание структуры.

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

1 способ

struct

{

char name[21];

float price;

int number;

} goods;

Выделяется 27 байт для переменной goods;

2 способ Описание пользователем тим goods. Переменные не описаны, память не выделилась.

struct _GOODS

{

char name[21]; float price; int number;

};

3способ. Можно смепшать два способа:

struct _GOODS

{

char name[21]; float price; int number;

}

goods;

4 способ. Используется оператор описания типа typedef:

typedef char string[40];

новый тип string

string a, b, c; - описание трех переменных, каждая из

которых является массивом из 40 символов.

В случае структуры имеем:

typedef struct { char name[21];

float price;

int number;} GOODS;

50. Трактовка имени структуры.

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

goods2 = goods1;

При этом вся область памяти goods1 копируется в область памяти goods2. Составные части структурв называются полями. Поля располагаются в памяти в том порядке в котором они описаны в структуре.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]