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: ожидается проверкаожидаются исправления
  1. Не работает вычитание и умножение. Вот пример с вычитанием:
    init a 2 3
    set a 0 0 1
    set a 0 1 3
    set a 1 0 3
    set a 1 1 4
    init b 2 3
    set b 1 1 1
    set b 0 1 -2
    set b 1 2 -2
    - a b 
    1 5 0
    3 3 0
    
  2. operator== лезет не в свою память в определенных случаях
  3. В elementwise и операторах вместо прямого обращения к _data лучше использовать геттеры и сеттеры (они же для этого и нужны)
  4. return not (*this == m); not -- серьезно? :) А чего не триграфы? Давай не будем извращаться, чай не на питоне пишем.
  5. elementwise -- круто! Только elementwise нужно переименовать в elementwise_copy. Писать семантически различные функции, которые неочевидно отличаются друг от друга символом подчеркивания или заглавной буквой -- это плохой стиль, не надо так делать. Различия между elementwise и elementwise_ должны быть понятны из названия, без необходимости лезть в их код. А еще лямбду можно передавать прямо в аргумент, не обязательно заводить для неё временную переменную.

comment:2 Changed 3 years ago by antonenko.mixail

Type: ожидаются исправленияожидается проверка
Version: 1.02.0
  1. Ну, вкусовщина. Мне вот, например, почему-то кажется, что словами удобнее и набирать и читать.

comment:3 Changed 3 years ago by antonenko.mixail

  1. Как передавать? Жалуется, что не lvalue.

comment:4 Changed 3 years ago by antonenko.mixail

  1. Может, вам покажется это смешным, но я не рассчитывал, что пользователю зачем-то захочется проверять на равенство матрицы разного типа.

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

  1. Служебные функции должны быть в приватной области видимости
  2. Реализуя *= через * у тебя происходит лишняя аллокация и лишнее копирование данных: сначала во временную переменную попадет результат умножения, а потом через вызов оператора присваивания результат скопируется в this. Лучше сделать наоборот -- реализовать * через *=.

Как передавать? Жалуется, что не lvalue.

Ты принимаешь function по ссылке, поэтому он тебе и не дает лямбду передать прямо в аргументе, потому что это временный объект. Убери ссылку -- получится.
Кстати, вопросы лучше пиши мне в телегу, там я тебе оперативно отвечу, здесь я вопрос увижу только когда буду проверять.

Может, вам покажется это смешным, но я не рассчитывал, что пользователю зачем-то захочется проверять на равенство матрицы разного типа.

Когда делаешь какие-то суждения о пользователях, всегда держи в уме вот эту картинку :)
https://s01.yapfiles.ru/files/762279/gifkiyuzeryglazamisisadminapesochnica1000446.gif

comment:6 Changed 3 years ago by antonenko.mixail

У меня всё собирается из-под Clang, а с gcc я ничего не могу гарантировать при всём желании, потому что он тупо отказывается работать на macOS.

comment:7 Changed 3 years ago by antonenko.mixail

Мне, к сожалению, очень неудобно в телеге, можно здесь? (К тому же, тот факт, что эти записи гипотетически может читать любой, добавляет всему некоторой остроты.)

comment:8 Changed 3 years ago by antonenko.mixail

А не будет ли лямбда копироваться?

comment:9 Changed 3 years ago by antonenko.mixail

  1. Не понял вас. Пока что мне кажется, что вы предлагаете мне сделать два копирования вместо нуля: https://gist.github.com/misha-antonenko/d103863fa5f6dec27a393736f95d30c3
Last edited 3 years ago by antonenko.mixail (previous) (diff)

comment:10 Changed 3 years ago by antonenko.mixail

Скомпилировал теперь и из-под Ubuntu. Видимо, clang разрешает не импортировать <functional>

Last edited 3 years ago by antonenko.mixail (previous) (diff)

comment:11 Changed 3 years ago by antonenko.mixail

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

comment:12 Changed 3 years ago by Святослав Власов

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

У меня всё собирается из-под Clang, а с gcc я ничего не могу гарантировать при всём желании, потому что он тупо отказывается работать на macOS.

Это обсуждалось еще в начале прошлого семестра. Вы можете работать под любой ОС и с любым компилятором, как вам удобно, но ваши задания проверяются под линуксом на gcc, ваша задача сделать так, чтобы программа собиралась и корректно работала в этих условиях.

Мне, к сожалению, очень неудобно в телеге, можно здесь?

Можно, но отвечать я буду только когда примусь за проверку, а в закрытые тикеты я не захожу вообще.

А не будет ли лямбда копироваться?

Не будет. Аргумент function просто создастся из лямбды и никуда копироваться уже не будет.
Да и если бы копировался, то лямбда, которая ничего не захватывает -- это считай голый указатель на функцию, его копированием можно пренебречь.

Не понял вас. Пока что мне кажется, что вы предлагаете мне сделать два копирования вместо нуля: ​https://gist.github.com/misha-antonenko/d103863fa5f6dec27a393736f95d30c3

Да, ты прав, у тебя оптимальная реализация, всё ок.

Единственное, что осталось -- это elementsize_inplace и elementwise по прежнему в публичной области видимости, хотя им место в приватной

В остальном всё круто, 10/10

Note: See TracTickets for help on using tickets.