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 Sokolov Viacheslav

╰─>$ 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]

65 | return *this;

| ~

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]’

68 | constexpr array_bool_proxy operator= (const array_bool_proxy& x) && noexcept {

| ~

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]

72 | return *this;

| ~

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]’

68 | constexpr array_bool_proxy operator= (const array_bool_proxy& x) && noexcept {

| ~

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

comment:2 Changed 4 years ago by Sokolov Viacheslav

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 abramov.nikita

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

comment:4 Changed 4 years ago by Sokolov Viacheslav

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 abramov.nikita

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

comment:6 Changed 4 years ago by Sokolov Viacheslav

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

Ошибка все еще осталось. Должно быть
89 return data_[index / 8] & (1u << (index % 8));
или эквивалентный код.
Поэтому если что-то не работает - лучше написать тест(ы), чтобы быть уверенным, что исправление правильное. И чтобы не ломать то, что раньше работало.

Note: See TracTickets for help on using tickets.