Opened 6 years ago
Closed 6 years ago
#178 closed ожидается проверка (задача сдана)
HA1 [Константинов Антон Владимирович]
Reported by: | Антон Владимирович Константинов | Owned by: | rutsky,grabovoy.philipp |
---|---|---|---|
Priority: | проверка | Milestone: | ha1-milestone2 |
Component: | HA#1 matrices | Version: | |
Keywords: | Cc: |
Description
Проверьте, пожалуйста, домашнее задание.
Change History (6)
comment:1 follow-up: 3 Changed 6 years ago by
comment:2 Changed 6 years ago by
Milestone: | ha1-milestone1 → ha1-milestone2 |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:3 Changed 6 years ago by
Здравствуйте! Спасибо за замечания.
Не могли бы Вы мне посоветовать, как лучше разобраться с первым? Выбрасывать исключение, если
rows
или cols
-- нулевые?
Replying to grabovoy:
Приветствую!
Есть несколько вещей на доработку:
- Конструкторы и
Matrix::allocate()
могут инициализировать динамические массивы длиной0
, обращатся к ним по индексам (как, например, происходит в деструкторе) -- undefined behavior (пишут на http://www.cplusplus.com/reference/new/operator%20new%5B%5D)- Опасно в публичном
operator[]
выдавать указатель без проверок. В текущей версии не проверяется индекс строки, и потом никак не проверить номер столбца -- можно вылезки за границы.И просто полезные замечания:
- Стоит использовать список инициализации в конструкторе вместо явного присваивания (
rows
,cols
)(*this)[i][j]
лучше заменить на обращение к приватному полю (row_ptr_array_[i][j]
), чтобы избежать вызова метода (хотя, возможно, компилятор это соптимизирует).- При умножении эффективнее суммировать в локальную переменную, а затем делать присваивание.
comment:4 Changed 6 years ago by
Проще всего проставлять nullptr
при отсутствии элементов (rows = 0
, cols = 0
) и в деструкторе это проверять.
comment:5 Changed 6 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
Ещё раз здравствуйте! Проверьте, пожалуйста, исправленную программу.
Пара комментариев:
- Проверять на
nullptr
пришлось бы во всех методах, которые так или иначе обращаются кrow_ptr_array_
под индексам, поэтому я явно запретил создание матрицы нулевого размера (это подходит под условия задачи, так как в формулировке чётко указано, что размеры матрицы -- натуральные числа). Сделал я это бросанием исключения при попытке сделатьallocate
с нулевым размером. Оба конструктора вызываютallocate
, поэтому враг не проскочит. - Добавил прокси-класс
MatrixRow
и проверки на соответствие индексов допустимому диапазону. Теперь, если пытаемся выйти за границу, вылетит исключение. - Списки инициализации, прямое обращение к приватному полю, суммирование в локальную переменную -- исправил.
Спасибо!
comment:6 Changed 6 years ago by
Resolution: | → задача сдана |
---|---|
Status: | new → closed |
Note: See
TracTickets for help on using
tickets.
Приветствую!
Есть несколько вещей на доработку:
Matrix::allocate()
могут инициализировать динамические массивы длиной0
, обращатся к ним по индексам (как, например, происходит в деструкторе) -- undefined behavior (пишут на http://www.cplusplus.com/reference/new/operator%20new%5B%5D)operator[]
выдавать указатель без проверок. В текущей версии не проверяется индекс строки, и потом никак не проверить номер столбца -- можно вылезки за границы.И просто полезные замечания:
rows
,cols
)(*this)[i][j]
лучше заменить на обращение к приватному полю (row_ptr_array_[i][j]
), чтобы избежать вызова метода (хотя, возможно, компилятор это соптимизирует).