Языки программирования для численных методов. Глушакова Т.Н - 73 стр.

UptoLike

73
DynMatrix alloc_matrix(N int, M int)
{
int i;
DynMatrix m = calloc(sizeof(double*),N);
if(m == NULL)
return NULL;
for(i = 0 ; i < N ; ++i)
if((m[i] = calloc(sizeof(double),M)) == NULL) {
/* неудача: освободить сначала уже то ,
что успели выделить */
for(--i ; i>=0 ; --i)
free(m[i]);
free(m);
return NULL;
}
return m;
}
Мы определили для типа double** синоним DynMatrix
(динамическая матрица). Функция alloc_matrix выделяет память под
матрицу размерности NxM. В случае неудачи возвращается NULL (при
этом освобождается вся лишняя память , которая уже была выделена к
моменту неудачи). В случае успеха возвращается указатель, который
можно индексировать как обычный двумерный массив .
Для освобождения такого массива необходимо сначала освободить
память , занимаемую каждой строкой, а затем уже сам массив указателей :
for(i = 0 ; i < N ; ++i)
free(m[i]);
free(m);
Трех - и более мерные динамические массивы могут быть
реализованы аналогично двумерным , при помощи массивов на указатели
на массивы указателей .
В заключение отметим , что так как строки являются одномерными
массивами типа char, то для работы с динамическими строками можно
                                      73

     DynMatrix alloc_matrix(N int, M int)
     {
         int i;
         DynMatrix m = calloc(sizeof(double*),N);
         if(m == NULL)
                 return NULL;
          for(i = 0 ; i < N ; ++i)
                 if((m[i] = calloc(sizeof(double),M)) == NULL) {
                         /* неудача: освободить сначала уже то,
                         что успели выделить */
                         for(--i ; i>=0 ; --i)
                                free(m[i]);
                         free(m);
                         return NULL;
                 }
          return m;
     }

     Мы определили для типа double** синоним DynMatrix
(динамическая матрица). Функция alloc_matrix выделяет память под
матрицу размерности NxM. В случае неудачи возвращается NULL (при
этом освобождается вся лишняя память, которая уже была выделена к
моменту неудачи). В случае успеха возвращается указатель, который
можно индексировать как обычный двумерный массив.
     Для освобождения такого массива необходимо сначала освободить
память, занимаемую каждой строкой, а затем уже сам массив указателей:
     for(i = 0 ; i < N ; ++i)
            free(m[i]);
      free(m);
      Трех- и более мерные динамические массивы могут быть
реализованы аналогично двумерным, при помощи массивов на указатели
на массивы указателей.
      В заключение отметим, что так как строки являются одномерными
массивами типа char, то для работы с динамическими строками можно