Айтишники на пенсии
Moderator: sss1
-
- Уже с Приветом
- Posts: 64875
- Joined: 12 Jul 2002 16:38
- Location: г.Москва, ул. Б. Лубянка, д.2
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Айтишники на пенсии
это и не про core language тоже, скорее про дух языка - не делать то, о чем не просят явно. так-то аффтары библиотеки вполне могли бы обнулить новый инстанс в конструкторе, если бы пожелали. причем я считаю, что в толь специализированной библиотеке это было бы верным решением
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 7723
- Joined: 29 Mar 2000 10:01
- Location: Kirkland,WA
Re: Айтишники на пенсии
http://arma.sourceforge.net/docs.htmlСнежная Королева wrote: 18 May 2017 01:52Указатели не при чем, это была совершенно другая проблема. Библиотека Armadillo, если кто знает. Объявляешь матрицу arma::mat somename(4,4); и она заполняется (оказывается) мусором. Документация библиотеки очень хороша, но нигде про такое не написано. Значит, должно быть в core language прописано.M. Ridcully wrote: 18 May 2017 01:13Гы, указатели оказались не при чём.Снежная Королева wrote: 17 May 2017 23:44 Кто бы мог подумать, что когда объявляешь массив в C, он заполняется случайным мусоромНи один тьюториал или книжка, ну хоть кто-то бы где-то написал! Правда я читала в основном про пакет Rcpp
Если локальную скалярную переменную не проинициализировать, то то же самое будет.
Правда, в 21 веке принято санитайзерами пользоваться.
Ну и последнее - C и C++ - это всё-таки разные языки. В большинстве случаев в C++ очень мало причин не пользоваться std::vector вместо "голого" массива.
When specifying the size with n_rows and n_cols, by default the memory is uninitialised; memory can be initialised by specifying the fill_type, which is one of: fill::zeros, fill::ones, fill::eye, fill::randu, fill::randn, fill::none, with the following meanings:
fill::zeros = set all elements to 0
fill::ones = set all elements to 1
fill::eye = set the elements along the main diagonal to 1 and off-diagonal elements to 0
fill::randu = set each element to a random value from a uniform distribution in the [0,1] interval
fill::randn = set each element to a random value from a normal/Gaussian distribution with zero mean and unit variance
fill::none = do not modify the elements
-
- Уже с Приветом
- Posts: 64875
- Joined: 12 Jul 2002 16:38
- Location: г.Москва, ул. Б. Лубянка, д.2
Re: Айтишники на пенсии
все-таки старую выучку не пропьешь: я бы доки не читал, но массив бы от греха подальше пронициилизоровал.alex_127 wrote: 18 May 2017 05:09http://arma.sourceforge.net/docs.htmlСнежная Королева wrote: 18 May 2017 01:52Библиотека Armadillo, если кто знает. Объявляешь матрицу arma::mat somename(4,4); и она заполняется (оказывается) мусором. Документация библиотеки очень хороша, но нигде про такое не написано. Значит, должно быть в core language прописано.M. Ridcully wrote: 18 May 2017 01:13Гы, указатели оказались не при чём.Снежная Королева wrote: 17 May 2017 23:44 Кто бы мог подумать, что когда объявляешь массив в C, он заполняется случайным мусоромНи один тьюториал или книжка, ну хоть кто-то бы где-то написал! Правда я читала в основном про пакет Rcpp
When specifying the size with n_rows and n_cols, by default the memory is uninitialised; memory can be initialised by specifying the fill_type,
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Айтишники на пенсии
Так это... может быть, вам оно просто и не надо? Ведь таких и гораздо более сложных (хотя на вид - простых) нюансов в С++ чуть больше, чем дофига. Даже довольно опытный С++ погромист легко может сесть в лужу и отстрелить себе ногу. Левую. Вжик! Я сказал, левую! Вжик! Я сказал, ногу! Вжик! Как-то так.Снежная Королева wrote: 18 May 2017 06:21 Ну вот для не профессиональных программистов хрен поймёшь что означает "memory is uninitialised". Пока не наступишь на грабли.
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 64875
- Joined: 12 Jul 2002 16:38
- Location: г.Москва, ул. Б. Лубянка, д.2
Re: Айтишники на пенсии
Мать, ты реально косяка дала. Я и боком погромизму не учился, просто на Бейсике 1000 лет назад чего-то для химии корябал - но даже при моем склерозе я прекрасно понимаю про Initialized.Снежная Королева wrote: 18 May 2017 06:21 Ну вот для не профессиональных программистов хрен поймёшь что означает "memory is uninitialised". Пока не наступишь на грабли.
-
- Уже с Приветом
- Posts: 10066
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
И правильно. С/C++ простой язык если его использовать только для вычислительных чисел. Его легко понять не программисту, вам в самый раз.Снежная Королева wrote: 18 May 2017 06:50
Деваться некуда. Нужно было писать R код для диплома, и сами понимаете, R медленный. Все более менее серьёзное на С/С++ пишется. А потом втянулась и даже нравится. Реально в сто раз быстрее выполняется код.
Кстати, насчет инициилизации переменных. Тут есть еще такой момент: в С++ ведь есть классы. И с ними абсолютно теже самые проблемы, что и с переменными насчет инициидизации, только хуже. Например, если у вас есть класс ClassA и вы в своей функции написали
Code: Select all
int n;
ClassA instance_class;
Тут есть выход - делать все по Сшному. Работать не с самими обхектами, а с их поинтерами. Это выглядит так:
Code: Select all
int n = 0;
ClassA * p_instance_class= NULL;
...
p_instance_class = new ClassA () ;
init (p_instance_class );
Получается такая вещь: вы вначале отводите пойнтер под будущий объект и заполняете его нулем. Если после этого вы в како-то момент передадите этот пойнтер дальще, внутрь другой функции, то где-то просто будет краш и вы это сразу увидите. А когда реально придет время, что вы готовы наполнить instance_class meaningful значениями, то вы делаете это как в последних двух строчках. В результате у вас нет ситуации, как в первом коде, когда обхектinstance_class вроде живой, но meaningless. Здесь он (вернее его пойнтер) будет не meaningless, а конкретный NULL, что и означает, что он не проициилизирован.
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Айтишники на пенсии
Очередной вывих мозга от нашего "шпешалиста" - завести никому не нужный указатель пораньше, держать его нулем без всякой цели три часа до реального создания инстанса, чтобы потом случайно все-таки использовать, проанализировать крэшлог и порадоваться, какой умный, что быстро нашел проблему
Не читайте советские газеты и ksi, просто ради чистоты сознания
Не читайте советские газеты и ksi, просто ради чистоты сознания
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 5753
- Joined: 15 Aug 2008 00:52
Re: Айтишники на пенсии
Да и использовать динамическое выделение объектов на ровном месте без особой надобности - превед фрагментации памяти, которая лечится только "всеми мыслимыми и немыслимыми наворотами"partner_ca wrote: 18 May 2017 18:12Не согласен. Это неудобно и не в духе С++ksi wrote: 18 May 2017 14:40
Тут есть выход - делать все по Сшному. Работать не с самими обхектами, а с их поинтерами. Это выглядит так:
Code: Select all
int n = 0; ClassA * p_instance_class= NULL; ... p_instance_class = new ClassA () ; init (p_instance_class );
Для инициализации придумали конструктор.
I would hope that a wise white man with the richness of his experiences would more often than not reach a better conclusion than a latina female who hasn't lived that life
-
- Уже с Приветом
- Posts: 4207
- Joined: 10 Jan 2004 01:22
- Location: n-sk -> MD -> VA
Re: Айтишники на пенсии
Было бы странно ожидать от ученых экспертных советов по разгрузке вагонов программингу. Программиррование для них, в общем случае, настолько скучно и просто, что некоторые настоящие ученые, которых я знаю, напрочь отказываются от подобной херни. Один даже уехал из Омерики лет 13 назад, когда получил карту как ученый, но его сократили с ученой работы и из вариантов было только программирование на с++.
-
- Уже с Приветом
- Posts: 10066
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
Что, снова оно, пипиc ..АццкоМото wrote: 18 May 2017 18:13 Очередной вывих мозга от нашего "шпешалиста" - завести никому не нужный указатель пораньше, держать его нулем без всякой цели три часа до реального создания инстанса, чтобы потом случайно все-таки использовать, проанализировать крэшлог и порадоваться, какой умный, что быстро нашел проблему
Не читайте советские газеты и ksi, просто ради чистоты сознания

А по делу? Объект может реально наполняться содержанием (что сплошь и рядом в вычислительных задачах) в глубинах многочисленных if и while. А может так получиться, что код туда не зайдет, а вы думали что зайдет. Там создать вы его не можете из-за скопа. Когда будем создавать объект?