Re: Динамические матрицы и иже с ними
От: Кодт Россия  
Дата: 08.12.08 23:30
Оценка: 38 (1)
Здравствуйте, S10, Вы писали:

S10>Пишу лабу по динамическим массивам, сделал библиотеку:

S10>

S10>/* Вставка последней строки после строки с индексом n. */
S10>void insert_last_after_n (int **mx, int &height, int width, int n)
S10>{
S10>    int **tmp = new_matrix (height + 1, width);
.............................
S10>    del_matrix (mx, height);
S10>    mx = tmp;
S10>    height ++;
S10>}
S10>


S10>А вот собственно сама программа с заданием:

S10>
S10>    int **matrix = new_matrix (m, n);
..............................
S10>    insert_last_after_n (matrix, m, n, index);
S10>    print_matrix (matrix, m, n);
S10>    del_matrix (matrix, m);
S10>


Ошибка в том, что insert_last_after_n уничтожает исходную матрицу, не сообщая об этом наружу. Заодно у тебя получилась утечка, но ты её не успел заметить
Нужно поменять сигнатуру этой функции
S10>void insert_last_after_n (int ** /*inout*/ & mx, int /*inout*/ & height, int width, int n)


Кстати говоря. Поскольку размеры матрицы ходят парой вместе с ею самой, то было бы логично объединить их в одну структуру
struct matrix
{
  int width, height;
  int** data;
};

matrix new_matrix(int w, int h);
void delete_matrix(matrix m); // здесь спокойно можно по значению - копирование поверхностное
void insert_row(matrix& m, int jInsertTo, int jCopyFrom)
{
  matrix mx = new_matrix(m.width, m.height+1);
  for(int i=0; i!=mx.width; ++i)
  {
    for(int j=0; j!=mx.height; ++j)
    {
      int jSrc = (j<jInsertTo) ? j : (j==jInsertTo) ? jCopyFrom : (j+1);
      mx[i][j] = m[i][jSrc];
    }
  }
}
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.