Opened 3 years ago
Closed 3 years ago
#344 closed ожидается проверка (задача сдана)
Lab 7
Reported by: | antonenko.mixail | Owned by: | Святослав Власов |
---|---|---|---|
Component: | WW Matrix | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (12)
comment:1 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
- Ну, вкусовщина. Мне вот, например, почему-то кажется, что словами удобнее и набирать и читать.
comment:4 Changed 3 years ago by
- Может, вам покажется это смешным, но я не рассчитывал, что пользователю зачем-то захочется проверять на равенство матрицы разного типа.
comment:5 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Не собирается
[803][svloyso:lab_07]$ make c++ -std=c++17 -Wall -pedantic -c -o bin/matrix.o -Iinclude src/matrix.cpp c++ -std=c++17 -Wall -pedantic -o main -Iinclude src/main.cpp bin/* In file included from src/main.cpp:7: include/matrix.h:32:11: error: expected ‘;’ at end of member declaration 32 | Matrix& elementwise_inplace(std::function<int(int, int)>& op, const Matrix& m); | ^~~~~~~~~~~~~~~~~~~ | ; include/matrix.h:32:44: error: expected ‘)’ before ‘<’ token 32 | Matrix& elementwise_inplace(std::function<int(int, int)>& op, const Matrix& m); | ~ ^ | ) include/matrix.h:33:22: error: ‘std::function’ has not been declared 33 | Matrix elementwise(std::function<int(int, int)>& op, const Matrix& m) const; | ^~~ include/matrix.h:33:35: error: expected ‘,’ or ‘...’ before ‘<’ token 33 | Matrix elementwise(std::function<int(int, int)>& op, const Matrix& m) const; | ^ make: *** [Makefile:12: main] Error 1
- Служебные функции должны быть в приватной области видимости
- Реализуя
*=
через*
у тебя происходит лишняя аллокация и лишнее копирование данных: сначала во временную переменную попадет результат умножения, а потом через вызов оператора присваивания результат скопируется в this. Лучше сделать наоборот -- реализовать*
через*=
.
Как передавать? Жалуется, что не lvalue.
Ты принимаешь function
по ссылке, поэтому он тебе и не дает лямбду передать прямо в аргументе, потому что это временный объект. Убери ссылку -- получится.
Кстати, вопросы лучше пиши мне в телегу, там я тебе оперативно отвечу, здесь я вопрос увижу только когда буду проверять.
Может, вам покажется это смешным, но я не рассчитывал, что пользователю зачем-то захочется проверять на равенство матрицы разного типа.
Когда делаешь какие-то суждения о пользователях, всегда держи в уме вот эту картинку :)
comment:6 Changed 3 years ago by
У меня всё собирается из-под Clang, а с gcc я ничего не могу гарантировать при всём желании, потому что он тупо отказывается работать на macOS.
comment:7 Changed 3 years ago by
Мне, к сожалению, очень неудобно в телеге, можно здесь? (К тому же, тот факт, что эти записи гипотетически может читать любой, добавляет всему некоторой остроты.)
comment:9 Changed 3 years ago by
- Не понял вас. Пока что мне кажется, что вы предлагаете мне сделать два копирования вместо нуля: https://gist.github.com/misha-antonenko/d103863fa5f6dec27a393736f95d30c3
comment:10 Changed 3 years ago by
Скомпилировал теперь и из-под Ubuntu. Видимо, clang разрешает не импортировать <functional>
comment:11 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:12 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
У меня всё собирается из-под Clang, а с gcc я ничего не могу гарантировать при всём желании, потому что он тупо отказывается работать на macOS.
Это обсуждалось еще в начале прошлого семестра. Вы можете работать под любой ОС и с любым компилятором, как вам удобно, но ваши задания проверяются под линуксом на gcc
, ваша задача сделать так, чтобы программа собиралась и корректно работала в этих условиях.
Мне, к сожалению, очень неудобно в телеге, можно здесь?
Можно, но отвечать я буду только когда примусь за проверку, а в закрытые тикеты я не захожу вообще.
А не будет ли лямбда копироваться?
Не будет. Аргумент function
просто создастся из лямбды и никуда копироваться уже не будет.
Да и если бы копировался, то лямбда, которая ничего не захватывает -- это считай голый указатель на функцию, его копированием можно пренебречь.
Не понял вас. Пока что мне кажется, что вы предлагаете мне сделать два копирования вместо нуля: https://gist.github.com/misha-antonenko/d103863fa5f6dec27a393736f95d30c3
Да, ты прав, у тебя оптимальная реализация, всё ок.
Единственное, что осталось -- это elementsize_inplace
и elementwise
по прежнему в публичной области видимости, хотя им место в приватной
В остальном всё круто, 10/10
operator==
лезет не в свою память в определенных случаяхelementwise
и операторах вместо прямого обращения к_data
лучше использовать геттеры и сеттеры (они же для этого и нужны)return not (*this == m);
not -- серьезно? :) А чего не триграфы? Давай не будем извращаться, чай не на питоне пишем.elementwise
-- круто! Толькоelementwise
нужно переименовать вelementwise_copy
. Писать семантически различные функции, которые неочевидно отличаются друг от друга символом подчеркивания или заглавной буквой -- это плохой стиль, не надо так делать. Различия междуelementwise
иelementwise_
должны быть понятны из названия, без необходимости лезть в их код. А еще лямбду можно передавать прямо в аргумент, не обязательно заводить для неё временную переменную.