Change History (7)

comment:1 Changed 4 years ago by Артур Гулецкий (huletski)

Type: ожидается проверкаожидаются исправления

Идейные замечания:

  • Зачем ловить исключение в методе, который его бросил (e.g. Matrix::add): если метод умеет обрабатывать ошибку, что в ней “исключительного”? Обрабатывайте исключения в main.cpp;
  • Методы load, mul стали бы проще, если для хранения промежуточного результата использовать RAII объект (Matrix), а в конце метода делать noexcept swap или аналог noexcept op=(Matrix&&).

Замечания:

  • базовые гарантии исключений поломаны в некоторых методах. Например: если matrix.cpp:38 бросает исключение, то объект остается наполовину сконструированным (в общем случае, вызывать this->dtor() в середине метода - так себе идея) -> проблемы при следующем вызове деструктора;
  • явно не хватает конструктора Matrix(row_nm, col_nm): matrix.cpp:36-39, 69-72 - код дублируется.
  • matrix.cpp:73-77: код избыточный, нужно как-то изменить new int[mul.width], чтобы инициализация стала неявной;
  • Matrix::get_fail_reason лучше заменить на overridden what, либо исключение от logic_error наследовать;
  • что с Matrix::operator=?
  • методы matrix лучше заменить на операторы (op+=, op*=, op>>, op<<);
  • попробуйте переписать код Matrix::load так, чтобы не нужно было считывать файл целиком для проверки валидности (Hint: проще будет, если поток настроить так, чтобы бросался exception при установке an error bit'a потока).

Баллы: 4, нужно доделывать.

comment:2 Changed 4 years ago by gordeeva.tatyana

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

"попробуйте переписать код Matrix::load так, чтобы не нужно было считывать файл целиком для проверки валидности"
но там ведь проблема не в error bit'е, а в том, что сама по себе матрица может быть неверно записана, так что мне в любом случае придётся дочитать файл до конца, чтобы это выяснить

comment:3 Changed 4 years ago by Артур Гулецкий (huletski)

Type: ожидается проверкаожидаются исправления

"попробуйте переписать код Matrix::load так, чтобы не нужно было считывать файл целиком для проверки валидности"

но там ведь проблема не в error bit'е, а в том, что сама по себе матрица может быть неверно записана, так что мне в любом случае придётся дочитать файл до конца, чтобы это выяснить

"Неверно записана" - значит не полностью/в значения в неверном формате (хранятся буквы, например)?

  • Не полностью: если читать как читается в один проход, то установится eof (один из error bit'ов) раньше времени;
  • Формат: ничего не меняется по сути: установится fail bit (не смогли прочесть очередной int, но данные в потоке еще есть).

В текущей версии проверки на полноту и содержимое неявно делаются в течение первого прохода в условии цикла in >> token. Если использовать режим чтения с исключениями, проверки явно делать не надо - поток оповестит, если сломался в процессе, выбросив исключение.
Напишите, если я недопонял, зачем обязательно нужно файл в два прохода читать.

Замечания:

matrix.h

  • MatrixException? хранит сырой указатель, переданный в конструкторе. Почему лучше так не делать обсудили на практике (неясно, кто данные удаляет);
  • Matrix::elem. Если рассматривать Matrix как value type, код, пользующийся матрицей, не может получить значение элемента непосредственно, что странно -> возвращайте из elem'a значение элемента и печатайте его в логике интерпретатора (в main.cpp);

matrix.cpp

  • Matrix::Matrix. cписки инициализации;
  • Matrix::Matrix. базовые гарантии не обеспечиваются (если bad_alloc в 8, кто и когда освободит память выделенную в 6?);
  • op>>. С double read файла все еще открыт вопрос;

main.cpp

  • 5: немного неточно: не регистры, а количество регистров, тип size_t;
  • преобразование регистра в число лучше вынести в отдельную функцию, чтобы избежать дублирования.

Баллы: 5.5, доделывайте.

comment:4 Changed 4 years ago by gordeeva.tatyana

Type: ожидаются исправленияожидается проверка
Version: 2.03.0

comment:5 Changed 4 years ago by Артур Гулецкий (huletski)

Type: ожидается проверкаожидаются исправления

matrix.h

  • у Matrix::elem const не хватает;

matrix.cpp

  • (opt) 12: неожиданно видеть вызов деструктора в процессе конструирования (объект еще не создали, а уже удаляем). Можно вынести код освобождения памяти в отдельным метод и вызывать его и в констукторе, и в дестукторе;
  • 65: 100+ символьная строка, неудобно воспринимать, нужно разбить на несколько строк;
  • баг в operator>>: файл без последнего элемента в последней строке матрицы считывается успешно, хотя не должен.

Баллы: 8.5, можно доделать.

comment:6 Changed 4 years ago by gordeeva.tatyana

Type: ожидаются исправленияожидается проверка

comment:7 Changed 4 years ago by Артур Гулецкий (huletski)

Resolution: задача сдана
Status: assignedclosed

Ок, +10.

FYI: Matrix::deallocate нужно сделать private, возможность вызывать метод у класса извне выглядит странно.

Note: See TracTickets for help on using tickets.