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
Owner: | changed from Sokolov Viacheslav to Brilliantov Kirill |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 4 years ago by
Owner: | changed from Brilliantov Kirill to Sokolov Viacheslav |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:3 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:4 follow-up: 5 Changed 4 years ago by
про 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 Changed 4 years ago by
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
Version: | 1.0 → 2.0 |
---|
comment:7 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:8 Changed 4 years ago by
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
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
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:11 Changed 4 years ago by
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
Type: | ожидаются исправления → ожидается проверка |
---|
Поправил. А почему у меня не появляются такие же ворнинги?..
comment:14 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
39 #define MATRIX_COUNT 10
в C++ нет смысла задавать константы define-ами, потому что есть constexpr
matrices
есть опасность того, что при создании _message произойдет out of memory, что приведет к ситуации "исключение при исключении"; предпочтительнее делать у исключений все методы noexcept, включая конструктор
std::out_of_memory может произойти не только при работе с матрицами, поэтому стоит его обрабатывать отдельно
всегда выставляйте .exceptions на failbit, badbit для стандартных потоков ввода/вывода, если не считаете их ожидаемыми
like за overflow, но он реализован не совсем корректно (abs возвращает floating point)
61 for (auto line : mtx._data) {
const auto& ?
сейчас есть копирование на ровном месте
< lab_14: src/matrix.cpp:32: int32_t Matrix::operator()(size_t, size_t) const: Assertion `row < _rows && col < _cols' failed.