Anonymous
Ой всё... Лучше бы сказали что нужно, а написать не сложно.
Ned
Ой всё... Лучше бы сказали что нужно, а написать не сложно.
не ты ли недавно говорил, что нихера не знаешь?)
Anonymous
не ты ли недавно говорил, что нихера не знаешь?)
"Я профан" - ещё писал. Сегодня на Stepik'e решил задачу с использованием явного приведения, а я не знаю что это такое и на курсе об этом и речи не было (самый начальный курс). Ой всё...
Anonymous
Там нужно было int как-нибудь в плавающий превратить(и обратно). Я и вспомнил, что на C# менять тип на ходу. Начал тыкать. (MSDN интереса ради не использовал) Так, сяк - не подходит. Жмяк в скобки (double) - сработало. После погадал на что влияет и profit.
🦥Alex Fails
Честно вам скажу? В пизду всякие заебатые олимпиадные задачи на собеседе. Важна практика.
🦥Alex Fails
Хотя на рисёч можно и олимпиаду
Ned
я тож за практику базарил
✙ Fatum ✙
cобесы собесам рознь - есть где спрашивают алгоритмы, заставляют код на листочке писать, как у препода на экзамене, а есть где спрашивают всякую туфту, аля всякие джаваскриптовые заморочи и ангуляр, хотя идешь вообще на другую специальность
✙ Fatum ✙
Честно вам скажу? В пизду всякие заебатые олимпиадные задачи на собеседе. Важна практика.
у меня есть знакомая. она олимпиадница, так ее взяли в Лукшери, а недавно этот лукшери снепчат купил и перевез всю их тиму в Калифорнию
✙ Fatum ✙
так что, у олимпиадников есть туз в рукаве
✙ Fatum ✙
их берут без труда туда, куда обычного студента не возьмут
✙ Fatum ✙
она так и сказала, что ее взяли отчасти благодаря тому,что она олимпиадница.. говорит, ну я сказала, что попала в тройку победителей олимпиады Одесской.. так те сразу заулыбались
🦥Alex Fails
Не, ну вчякое бывает же. Я ж не отрицаю
Maxim
Кто-нибудь ходил на собеседование в лабораторию касперского?
🦥Alex Fails
Меня звали, но я забыл
Vladislav
Меня звали, но я забыл
в каком смысле - забыл?
✙ Fatum ✙
https://geektimes.ru/post/281754/ 😱
ovf
а почему вдруг сейчас написали статью?
ovf
терри безумно крутой, но по-моему ему сейчас опять хуже стало :-(
🦥Alex Fails
в каком смысле - забыл?
Была куча других дел
Ned
действия, описанные в деструкторе выполняются до или после исчезновения объекта?
Ned
ставлю 9 против 1, что до)
Maxim
Конечно до. Иначе с чем работать деструктору))
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
что мне надо для этого сделать?
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
Только вот не помню, откуда компилятор берет информацию о размерности двумерного массива. Безопаснее писать data[i*_rows+j]
оооооооооооо. это извращение стоило мне трёх часов) там создаётся подобъект и перегружается два оператора []
Ned
оригинальный массив одномерный)
Kirill
Т.е. ты перегрузил оператор двойные скобки?
Ned
дважды
Kirill
А, читал вчера
Ned
наконец разобрался с константными функциями-членами и их комбинацией с this
Ned
там интересная лабуда
Ned
вот о const и this