Anonymous
Ой всё...
Лучше бы сказали что нужно, а написать не сложно.
Ned
Anonymous
не ты ли недавно говорил, что нихера не знаешь?)
"Я профан" - ещё писал.
Сегодня на Stepik'e решил задачу с использованием явного приведения, а я не знаю что это такое и на курсе об этом и речи не было (самый начальный курс).
Ой всё...
Anonymous
Там нужно было int как-нибудь в плавающий превратить(и обратно).
Я и вспомнил, что на C# менять тип на ходу. Начал тыкать. (MSDN интереса ради не использовал)
Так, сяк - не подходит.
Жмяк в скобки (double) - сработало. После погадал на что влияет и profit.
🦥Alex Fails
Честно вам скажу? В пизду всякие заебатые олимпиадные задачи на собеседе. Важна практика.
🦥Alex Fails
Хотя на рисёч можно и олимпиаду
Ned
я тож за практику базарил
✙ Fatum ✙
cобесы собесам рознь - есть где спрашивают алгоритмы, заставляют код на листочке писать, как у препода на экзамене, а есть где спрашивают всякую туфту, аля всякие джаваскриптовые заморочи и ангуляр, хотя идешь вообще на другую специальность
✙ Fatum ✙
так что, у олимпиадников есть туз в рукаве
✙ Fatum ✙
их берут без труда туда, куда обычного студента не возьмут
✙ Fatum ✙
она так и сказала, что ее взяли отчасти благодаря тому,что она олимпиадница.. говорит, ну я сказала, что попала в тройку победителей олимпиады Одесской.. так те сразу заулыбались
🦥Alex Fails
Не, ну вчякое бывает же. Я ж не отрицаю
Maxim
Кто-нибудь ходил на собеседование в лабораторию касперского?
🦥Alex Fails
Меня звали, но я забыл
✙ Fatum ✙
https://geektimes.ru/post/281754/ 😱
ovf
а почему вдруг сейчас написали статью?
ovf
терри безумно крутой, но по-моему ему сейчас опять хуже стало :-(
🦥Alex Fails
Ned
действия, описанные в деструкторе выполняются до или после исчезновения объекта?
Ned
ставлю 9 против 1, что до)
Maxim
Конечно до. Иначе с чем работать деструктору))
Vladislav
Ned
Ned
логично что до
Ned
но мало ли
Ned
я видел деструкторы в дизассемблинге, но поленился почитать
Ned
ткчто спросил на всякий
Ned
просто я хочу понять, надо ли вызывать освобождающий динамически взятую память деструктор перед throw?
Ned
если throw не обрабатывают, произойдёт утечка, я проверял, деструктор не вызовется
Kirill
Вопрос непонятен. Уточни.
Ned
ну смотри, я разрабатываю класс матрицы. шаблонный. допустим произошла исключительная ситуация: пользователь по какой-то причиние умножил матрицы неподходящего размера. получить результат мы не можем, ибо операция алгебраически не определена. тогда я throw Exception();
Ned
что если пользователь умножал их не в блоке try{}catch()
Ned
эксепшн вздёрнет программу по SIGTERM
Kirill
Тебя это не касается.
Ned
и память под объект утечёт (проверял валгриндом)
Ned
то есть, нет смысла делать delete перед throw?
Kirill
Тебе нужно только обеспечить корректное освобождение ресурсов при уничтожении объекта.
Ned
хорошо, а где вообще прописана зона ответственности проектировщика классов? я не встречал. понятно, что все ситуации я не предусмотрю, но я хочу чтобы юзеры не плевались от моего класса и могли легко писать приложения, ага
Kirill
Если твоя матрица представлена внутри как обычный динамический массив, то в конструкторе ты выделяешь под него память, а в деструкторе освобождаешь ее.
Ned
что мне надо для этого сделать?
Ned
Kirill
Как создаешь экземпляры матриц?
Ned
template <class T>
Matrix<T>::Matrix(const int _rows, const int _cols):
rows(_rows),
cols(_cols){
#ifdef DEBUG
std::cout << "Constructor (int, int) called\n";
#endif
if ((_rows < 1) || (_cols < 1)) throw Matrix<T>::ExceptionWrongInitialParams();
data = new T[rows*cols];
for (int i = 0; i < rows*cols; data[i++] = (T)0);
}
template <class T>
Matrix<T>::Matrix(const Matrix<T> &copy):
rows(copy.rows),
cols(copy.cols){
#ifdef DEBUG
std::cout << "Copy constuctor called\n";
#endif
data = new T[rows*cols];
for (int i = 0; i < cols*rows; data[i] = copy.data[i], i++);
}
Ned
других вариантов пока нет
Kirill
Я спросил, как ты матрицы перемножаешь.
Kirill
И где деструктор?
Ned
Как создаешь экземпляры матриц?
Ned
И где деструктор?
template <class T>
Matrix<T>::~Matrix(){
#ifdef DEBUG
std::cout << "Destructor called!\n";
#endif
delete [] data;
}
Ned
перемножая создаю первым конструктором матрицу, забиваю значениями, возвращаю
Ned
вот и всё
Ned
если размер неверный, throw
Kirill
Ок. Я имел в виду, что непонятен сценарий использования класса, который вызывает утечку.
Ned
а, ну банально, смотри
Ned
template <class T>
bool Matrix<T>::isSquare(){
return (cols == rows);
}
template <class T>
T Matrix<T>::getTrack(){
if (this->isSquare()){
T track = (T)0;
for (int i = 0; i < cols; track += (*this)[i][i], ++i);
return track;
}
delete [] data;
throw ExceptionSquareOperationForNonSquare();
}
вот есть такие 2 функции
Ned
а я делаю где-то в программе так:
Matrix <int> A(5,4);
A.getTrack();
Ned
вот и всё, взлетает эксепшн "операция для неквадратной матрицы"
Ned
к ним же относится определитель, например
Kirill
Конструкция в цикле это шедевр, конечно. :)
Ned
ты не поверишь, чего мне она стоила) раньше i++ стоял во вторых скобках, но это постоянно вызывало undefined behaviour)
Kirill
А зачем освобождать память где-то еще, кроме деструктора?
Ned
так вот в чём дело. если за эксепшном никто не следит, то деструктор не вызывается
Kirill
Эта функция возвращает сумму диагональных элементов?
Ned
и память не освобождается (если система не позаботится о том)
Ned
да, это след матрицы)
Ned
относится, что логично, только к квадратным
Kirill
for (std::size_t i = 0; i < _rows; i++)
track += data[i][i];
Kirill
Так же гораздо понятнее?
Ned
ну теперь да, вообще говоря
Ned
не поверишь, я поменял, но откатился на старую ветку)
Kirill
Только вот не помню, откуда компилятор берет информацию о размерности двумерного массива. Безопаснее писать data[i*_rows+j]
Ned
Ned
оригинальный массив одномерный)
Kirill
Т.е. ты перегрузил оператор двойные скобки?
Ned
дважды
Kirill
А, читал вчера
Ned
наконец разобрался с константными функциями-членами и их комбинацией с this
Ned
там интересная лабуда
Ned