6.3 Механизм матрицы как контейнера
-
#define
MatrixContainer void ***
void ***AllocMatrixContainer(int m, int n)
{
void
***mas;
int
i,j;
mas=(void
***)malloc(sizeof(mas)*m); //выделение памяти под вектор строк
if(mas==NULL)
ErrorMem();
for(i=0;
i<m; i++) //выделение памяти вектора указателей
{
mas[i]=(void **)malloc(sizeof(*mas)*n);
if(mas[i]==NULL)
ErrorMem();
}
for(i=0;
i<m; i++) //начальная инициализация матрицы
указателей
for(j=0; j<n; j++)
mas[i][j]=NULL;
return
mas;
}
void DeleteMatrix(MatrixContainer matrix,int m, int n,void(*DeleteElem)(void*
elem)
{
int
i,j;
for(i=0;
i<2; i++)
for(j=0;
j<3; j++)
DeleteElem(matrix[i][j]);
//удалить все элементы
for(i=0;
i<2; i++) free(matrix[i]); //удалить строки
free(matrix); //удалить массив указателей
}
Пример использования. Необходимо
хранить матрицу точек, заданных координатами. Описание точки дано ниже.
-
typedef struct Point_
{
int
x;
int
y;
} MPoint;
Функция создания структуры MPoint
-
MPoint *CreatePoint(int
x, int y)
{
MPoint *point=(MPoint *)malloc(sizeof(MPoint));
point->x=x;
point->y=y;
}
Ниже представлен пример функции
использования матрицы-контейнера, хранящей множество точек.
-
void TestContainer()
{
MatrixContainer m=AllocMatrixContainer(2,3);
//распределение
паями под контейнер
int
i,j;
for(i=0;
i<2; i++) //присвоение значений указателем
контейнера на точки
for(j=0; j<3; j++)
m[i][j]=CreatePoint(i,j);
for(i=0; i<2; i++) //вывод матрицы точек
for(j=0; j<3; j++)
printf(”%d%d\n”, ((MPoint *)m[i][j])? > x, ((MPoint *)m[i][j])? > y);
DeleteMatrix(m,2,3,free); //удаление матрицы точек
getch();
}
|