Skip to content

Conversation

@kermanglobe
Copy link

No description provided.

@kermanglobe
Copy link
Author

@maksimus-sergeyev, @KirillovAndrey, @VarvaraSharutina можете проверять

include/stack.h Outdated
else throw std::runtime_error("Trying to pop from empty stack");
}

void clear() { while (!isEmpty()) pop(); }
Copy link

@maksimus-sergeyev maksimus-sergeyev Dec 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

зачем тут целый цикл? просто sz = 0 не проще?
в зависимости от смысла функции, можно при случае не только sz = 0, но и память освободить частично либо полностью

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

согласен

Comment on lines 46 to 51
TStack& operator=(TStack&& s) noexcept
{
TStack tmp(s);
swap(*this, s);
return *this;
}
Copy link

@maksimus-sergeyev maksimus-sergeyev Dec 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

утечка памяти. должно быть что-то вроде
TStack& operator=(TStack&& s) noexcept
{
if (this == &s) return *this;
delete[] data;
data = s.data;
sz = s.sz;
cap = s.cap;
s.cap = s.sz = 0;
s.data = nullptr;
return *this;
}

upd: здесь, кстати, тоже не правда, получается. утечки нет, естественно. при условии, что компилятор догадается вызвать перемещающий конструктор, а по идее он должен догадаться, здесь всё приемлемо было.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ок

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

держу в курсе, я ещё забыл проверку на самоприсваивание

Comment on lines 30 to 35
~TStack()
{
sz = 0;
cap = 0;
delete[] data;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

желательно ещё data = nullptr;
поскольку, например, деструктор можно вызвать принудительно, то бишь вручную,

например так
PtrClass * ptr = new PtrClass();
ptr->~PtrClass();

то при повторном вызове деструктора, не положив data := nullptr,
на строке
delede[] data;
вылетит ошибка о попытке повторного освобождения памяти (upd: в зависимости от стандарта и компилятора может даже и не ошибка, а неопределенное поведение будет).

А, если всё-таки data = nullptr, то delete от nullptr'а, согласно стандарту, должен отработать корректно, то есть никак:
"The value of the first argument supplied to a deallocation function may be a null pointer value; if so, and if the deallocation function is one supplied in the standard library, the call has no effect."

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

согласен

Comment on lines 16 to 20
TStack(const TStack& s) : sz(s.sz), cap(s.cap)
{
data = new T[cap];
std::copy(s.data, s.data + cap, data);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно копировать не весь стек вплоть до cap, а только до sz

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

согласен

@maksimus-sergeyev
Copy link

ещё я должен осудить комментарии на русском, поскольку Дмитриевич говорил, всё на английском писать

@maksimus-sergeyev
Copy link

если мне не изменяет память, Дмитриевич хотел возможность в программе
ввести выражение с переменными, а потом для этого же выражения менять значения переменных и получать результат
если я правильно помню, то, вероятно, такое стоит сделать

@maksimus-sergeyev
Copy link

в остальном:
программа работает корректно.
ошибок в файле с арифметикой не нашел (как минимум, пока)
тесты все тоже в порядке.

@kermanglobe
Copy link
Author

ещё я должен осудить комментарии на русском, поскольку Дмитриевич говорил, всё на английском писать

¯\(ツ)

если мне не изменяет память, Дмитриевич хотел возможность в программе ввести выражение с переменными, а потом для этого же выражения менять значения переменных и получать результат если я правильно помню, то, вероятно, такое стоит сделать

фича уже есть, нужно вводить конструкции вида "название переменной" = значение
изображение

@maksimus-sergeyev
Copy link

maksimus-sergeyev commented Dec 12, 2023

ещё я должен осудить комментарии на русском, поскольку Дмитриевич говорил, всё на английском писать

¯_(ツ)_/¯

если мне не изменяет память, Дмитриевич хотел возможность в программе ввести выражение с переменными, а потом для этого же выражения менять значения переменных и получать результат если я правильно помню, то, вероятно, такое стоит сделать

фича уже есть, нужно вводить конструкции вида "название переменной" = значение изображениеА если я захочу посчитать x = 10, и снова посчитать x+1

ещё я должен осудить комментарии на русском, поскольку Дмитриевич говорил, всё на английском писать

¯_(ツ)_/¯

если мне не изменяет память, Дмитриевич хотел возможность в программе ввести выражение с переменными, а потом для этого же выражения менять значения переменных и получать результат если я правильно помню, то, вероятно, такое стоит сделать

фича уже есть, нужно вводить конструкции вида "название переменной" = значение изображение

Не, речь не о том. На этом примере:
А если я захочу посчитать для x+1 для x=10? Мне придется заново ввести:
X = 10
X+1
Ответ -> 11
Потом например для 3
X = 3
X+1
Ответ -> 4

Ну и т.д. А Дмитриевич хотел видеть, что-то типа:
x+1
X = 3
Ответ ->4
X = 10
Ответ -> 11.
И т.д

Т.е. если я правильно помню, выражение должно вводиться одноразово, а потом должна быть возможность посчитать его для разных значений переменных без повторного ввода выражения

@maksimus-sergeyev
Copy link

ещё можно придраться, что деление на 0 считается = inf, хотя скорее должно быть не определено и выдавать ошибку

@kermanglobe
Copy link
Author

ещё можно придраться, что деление на 0 считается = inf, хотя скорее должно быть не определено и выдавать ошибку

как бы это странно не звучало, но по IEEE 754 при делении положительных чисел возвращается inf, а при делении отрицательных -inf
так что это вопрос к стандарту, а не к лабораторной работе

@maksimus-sergeyev
Copy link

ещё можно придраться, что деление на 0 считается = inf, хотя скорее должно быть не определено и выдавать ошибку

как бы это странно не звучало, но по IEEE 754 при делении положительных чисел возвращается inf, а при делении отрицательных -inf так что это вопрос к стандарту, а не к лабораторной работе

стандарт стандартом, но тебе же никто не мешает при делении проверить второй аргумент на равность нулю и, скажем, кинуть исключение. с точки зрения математики, логичнее так сделать, я считаю

Comment on lines +81 to +87

void clear()
{
TStack s;
swap(*this, s);
}

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

почему? при выходе из функции будет вызван деструктор, который уничтожит TStack s (у него к этому моменту будет указатель на старые данные)

Comment on lines +37 to +46

TStack& operator=(const TStack& s)
{
if (this == &s)
return *this;
TStack tmp(s);
swap(*this, tmp);
return *this;
}

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тоже будет вызван деструктор у TStack tmp при выходе

Comment on lines +47 to +55
TStack& operator=(TStack&& s) noexcept
{
delete[] data;
sz = 0;
cap = 0;
data = nullptr;
swap(*this, s);
return *this;
}
Copy link

@maksimus-sergeyev maksimus-sergeyev Dec 16, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

upd: ещё проверка на самоприсваивание должна быть

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

спорный на самом деле вопрос, потому что нарочно сделать самоприсваивание по rvalue невозможно (rvalue - временный объект, как можно превратить уже существующий объект во временный?). можно конечно напридумывать конструкций вроде st=std::move(st) чтобы сделать самоприсваивание, но это уже что-то на уровне стрельбы из ружья по своим ногам.
к тому же мне кажется в коде уже поздно что-то менять

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

вообще не спорный. в обычном операторе= ты ж делаешь проверку от a = a, тоже ведь выстрел в ногу; почему здесь не сделать от st=std::move(st)? ценой одной проверки исключаешь стрельбу по ногам. на счет поздно: согласен, но, ты Дмитриевича вроде до сих пор не тегнул, хотя уже давно пора

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в таком случае лучше assert делать (если адрес у rvalue каким-то образом оказался равен адресу объекта, то это явно какой-то баг), ну и я клоню к тому, что такие ситуации естественным образом не возникают.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

даже ассерт лучше, чем ничего. но, я всё же считаю, что надо проверять и возвращать *this. и всякие разработчики stl'ей, в частности, мелкософт, предпочитают таки делать так же.(github.com/microsoft/STL/blob/main/stl/inc/vector строка 740)

@kermanglobe
Copy link
Author

@ValentinV95, код готов к проверке
(приношу извинения за долгую задержку с тегом, надеялся на то, что остальные одногруппники по проверке проявят хоть какую-то реакцию)

TStack<int> s;
s.push(42);
ASSERT_FALSE(s.isEmpty());
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вроде всё верно (извиняюсь, за то что долго не давала никакую реакцию, так как я не нашла ошибок, не считала нужным об этом писать)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

та же причина не активности

Copy link
Owner

@ValentinV95 ValentinV95 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лабораторная и отчет приняты.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants