Opened 4 years ago

Closed 4 years ago

#776 closed ожидается проверка (задача сдана)

WW #14

Reported by: Brilliantov Kirill Owned by: Sokolov Viacheslav
Component: WW_exceptions Version: 3.0
Keywords: Cc:

Description


Change History (14)

comment:1 Changed 4 years ago by Egor Suvorov

Owner: changed from Sokolov Viacheslav to Brilliantov Kirill
Type: ожидается проверкаожидаются исправления

comment:2 Changed 4 years ago by Brilliantov Kirill

Owner: changed from Brilliantov Kirill to Sokolov Viacheslav
Type: ожидаются исправленияожидается проверка

comment:3 Changed 4 years ago by Sokolov Viacheslav

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

39 #define MATRIX_COUNT 10
в C++ нет смысла задавать константы define-ами, потому что есть constexpr

52 std::array<Matrix, MATRIX_COUNT> _matrixes;

matrices

67 class MatrixException? {
68 public:
69 explicit MatrixException?(_MATRIX_ERROR_CODE_ mec);
70
71 friend std::ostream &operator<<(std::ostream &os, const MatrixException? &me);
72
73 private:
74 std::string _message;
75 };

есть опасность того, что при создании _message произойдет out of memory, что приведет к ситуации "исключение при исключении"; предпочтительнее делать у исключений все методы noexcept, включая конструктор

std::out_of_memory может произойти не только при работе с матрицами, поэтому стоит его обрабатывать отдельно

всегда выставляйте .exceptions на failbit, badbit для стандартных потоков ввода/вывода, если не считаете их ожидаемыми

like за overflow, но он реализован не совсем корректно (abs возвращает floating point)

61 for (auto line : mtx._data) {

62 for (auto el : line) {

const auto& ?
сейчас есть копирование на ровном месте

< lab_14: src/matrix.cpp:32: int32_t Matrix::operator()(size_t, size_t) const: Assertion `row < _rows && col < _cols' failed.

comment:4 Changed 4 years ago by Sokolov Viacheslav

про abs я глупость написал, есть перегрузка от int, но с ней тоже надо быть аккуратным:

The behavior is undefined if the result cannot be represented by the return type.
In 2's complement systems, the absolute value of the most-negative value is out of range, e.g. for 32-bit 2's complement type int, INT_MIN is -2147483648, but the would-be result 2147483648 is greater than INT_MAX, which is 2147483647

такие проверки лучше делать в большей размерности (int по стандарту не более, чем 32-битный: https://en.cppreference.com/w/cpp/language/types

comment:5 in reply to:  4 Changed 4 years ago by Sokolov Viacheslav

Replying to Sokolov Viacheslav:

про abs я глупость написал, есть перегрузка от int, но с ней тоже надо быть аккуратным:

The behavior is undefined if the result cannot be represented by the return type.
In 2's complement systems, the absolute value of the most-negative value is out of range, e.g. for 32-bit 2's complement type int, INT_MIN is -2147483648, but the would-be result 2147483648 is greater than INT_MAX, which is 2147483647

такие проверки лучше делать в большей размерности (int по стандарту не более, чем 32-битный: https://en.cppreference.com/w/cpp/language/types

точнее видимо так: по стандарту >= 16 бит, по факту <= 32, но лучше поставить static_assert, что дейстивтельно не больше 32 и тогда уже работать в 64 битах

comment:6 Changed 4 years ago by Brilliantov Kirill

Version: 1.02.0

comment:7 Changed 4 years ago by Brilliantov Kirill

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

comment:8 Changed 4 years ago by Sokolov Viacheslav

src/main.cpp:46:38: error: catching polymorphic type ‘const class std::ios_base::failure’ by value [-Werror=catch-value=]

46 | } catch (const std::ios::failure e) {

|

cc1plus: all warnings being treated as errors
Makefile:17: recipe for target 'obj/main.o' failed
make: * [obj/main.o] Error 1

comment:9 Changed 4 years ago by Sokolov Viacheslav

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

74 const std::string &_message;

опасно. Лучше сохранить _MATRIX_ERROR_CODE_ в качестве поля, это более прозрачно.

12 std::unordered_map<_MAIN_ERROR_CODE_, std::string> main_error_codes = {
13 {_MAIN_ERROR_CODE_::MEM, "Unable to allocate memory."}};

можно не в std::string, а в const char*

49 std::cout << main_error_codes[_MAIN_ERROR_CODE_::MEM] << std::endl;
лучше сделать отдельную функцию toString(ec)

22 static_assert(sizeof(int32_t) <= 32);
==. Этот ассерт можно убрать, у этого типа гарантированный размер.

36 for (size_t r = 0; r < rows; r++) {
37 _data.push_back(std::vector<int32_t>(cols, 0));
38 }

можно в списке инициализации сразу правильно инициализировать

comment:10 Changed 4 years ago by Brilliantov Kirill

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

comment:11 Changed 4 years ago by Sokolov Viacheslav

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

╰─>$ make
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -c -MMD -o obj/matrix.o src/matrix.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -c -MMD -o obj/main.o src/main.cpp
src/main.cpp: In function ‘int main()’:
src/main.cpp:49:43: error: catching polymorphic type ‘const class std::ios_base::failure’ by value [-Werror=catch-value=]

49 | } catch (const std::ios_base::failure e) {

|

cc1plus: all warnings being treated as errors
Makefile:17: recipe for target 'obj/main.o' failed
make: * [obj/main.o] Error 1

comment:12 Changed 4 years ago by Brilliantov Kirill

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

Поправил. А почему у меня не появляются такие же ворнинги?..

comment:13 Changed 4 years ago by Sokolov Viacheslav

Другая версия компилятора?

comment:14 Changed 4 years ago by Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.