.: [предыдущая | оглавление | следующая] :.

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();
}
.: [предыдущая | оглавление | следующая] :.