Opened 4 years ago
Closed 4 years ago
#865 closed ожидается проверка (задача сдана)
WW #13
Reported by: | abramov.nikita | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_array | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (6)
comment:1 Changed 4 years ago by
comment:2 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Просьба разбить обьявление и определение. Так стоит делать, чтобы отдельно смотреть на интерфейс, отдельно - на реализацию. Зачастую интересна не реализация, а интерфейс.
27 constexpr T& operator[](size_t index) {
28 return data_[index];
29 }
30
31 constexpr const T& operator[](size_t index) const {
32 return data_[index];
33 }
assert все же не помешает.
56 char data_[(N + 7)/ 8];
может переполниться при большом N
63 *data_ &= ~(1 << bit);
64 *data_ |= x << bit;
лучше использовать явный static_cast, поскольку битовый знак для знаковых и беззнаковых работает по-разному.
По этой же причине в качестве хранилища лучше использовать unsigned тип.
82 for (size_t i = 0; i < N; i++) {
83 (*this)[i] = false;
84 }
кажется, не просят в условии?
117 constexpr void fill(bool val) noexcept {
118 for (size_t i = 0; i < N; i++) {
119 (*this)[i] = val;
120 }
121 }
можно эффективнее с помощью memset
68 constexpr array_bool_proxy& operator= (const array_bool_proxy& x) && noexcept {
69 *data_ &= ~(1 << bit);
70 int tmp = ((*(x.data_) & (1 << x.bit)) != 0) ? 1 : 0;
71 *data_ |= tmp << bit;
72 return *this;
73 }
непонятно, зачем дублировать логику = для bool.
В выражении a[i] = a[i + 1] позовется не этот конструктор, а rvalue. Поэтому это пока не работает, нужно поправить и написать тест.
comment:3 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:4 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
15 throw std::out_of_range ("Incorrect index");
стоит дополнить сообщение, добавить индекс, по которому происходило обращение
116 *this = (*(x.data_) & (1u << x.bit_)) != 0;
проще *this = static_cast<bool>(x);
или даже return *this = x; (почему это будет работать?)
104 *data_ |= x << bit_;
лучше сделать явный static_cast<unsigned char>(x)
87 return data_[index / 7] & (1 << index);
здесь ошибка
comment:5 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:6 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Ошибка все еще осталось. Должно быть
89 return data_[index / 8] & (1u << (index % 8));
или эквивалентный код.
Поэтому если что-то не работает - лучше написать тест(ы), чтобы быть уверенным, что исправление правильное. И чтобы не ломать то, что раньше работало.
╰─>$ make
mkdir obj
g++ -std=c++17 -o obj/main.o -c -g -Iinclude src/main.cpp -Wall -Wextra -Werror
In file included from src/main.cpp:3:
include/my_array.h: In instantiation of ‘constexpr lab_13::my_array<bool, N>::array_bool_proxy lab_13::my_array<bool, N>::array_bool_proxy::operator=(bool) && [with long unsigned int N = 13]’:
include/my_array.h:83:13: required from ‘constexpr lab_13::my_array<bool, N>::my_array() [with long unsigned int N = 13]’
src/main.cpp:42:20: required from ‘void test_my_array_bool() [with long unsigned int N = 13]’
src/main.cpp:80:33: required from here
include/my_array.h:65:21: error: implicitly-declared ‘constexpr lab_13::my_array<bool, 13>::array_bool_proxy::array_bool_proxy(const lab_13::my_array<bool, 13>::array_bool_proxy&)’ is deprecated [-Werror=deprecated-copy]
include/my_array.h:68:36: note: because ‘lab_13::my_array<bool, 13>::array_bool_proxy’ has user-provided ‘constexpr lab_13::my_array<bool, N>::array_bool_proxy lab_13::my_array<bool, N>::array_bool_proxy::operator=(const lab_13::my_array<bool, N>::array_bool_proxy&) && [with long unsigned int N = 13]’
include/my_array.h: In instantiation of ‘constexpr lab_13::my_array<bool, N>::array_bool_proxy lab_13::my_array<bool, N>::array_bool_proxy::operator=(const lab_13::my_array<bool, N>::array_bool_proxy&) && [with long unsigned int N = 13]’:
src/main.cpp:54:9: required from ‘void test_my_array_bool() [with long unsigned int N = 13]’
src/main.cpp:80:33: required from here
include/my_array.h:72:21: error: implicitly-declared ‘constexpr lab_13::my_array<bool, 13>::array_bool_proxy::array_bool_proxy(const lab_13::my_array<bool, 13>::array_bool_proxy&)’ is deprecated [-Werror=deprecated-copy]
include/my_array.h:68:36: note: because ‘lab_13::my_array<bool, 13>::array_bool_proxy’ has user-provided ‘constexpr lab_13::my_array<bool, N>::array_bool_proxy lab_13::my_array<bool, N>::array_bool_proxy::operator=(const lab_13::my_array<bool, N>::array_bool_proxy&) && [with long unsigned int N = 13]’
cc1plus: all warnings being treated as errors
Makefile:14: recipe for target 'obj/main.o' failed
make: * [obj/main.o] Error 1