@dlangru

Страница 264 из 719
Andrey
13.09.2017
06:37:26
а указатели обязательно ининтить через null при объявлении?

Maxim
13.09.2017
06:38:45
в D, по-моему, нет

Andrey
13.09.2017
06:39:30
ну я вот тоже поичтал мануалы - вроде как при объявлении переменных их ининтить нулем не нужно. а сегодня наткнулся вот на что: It is always a good practice to assign the pointer NULL to a pointer variable in case you do not have exact address to be assigned. This is done at the time of variable declaration. A pointer that is assigned null is called a null pointer.

Maxim
13.09.2017
06:39:32
компилятор сам должен следить за инициализацией

Google
Andrey
13.09.2017
06:39:38
https://www.tutorialspoint.com/d_programming/d_programming_pointers.htm

Maxim
13.09.2017
06:40:39
предлагаю написать тестовую программу: объявить указатель и посмотреть, будет ли он null)

в D должен быть

Andrey
13.09.2017
06:41:23
(:

NullSanya
13.09.2017
06:41:34
вроде должен

Andrey
13.09.2017
06:44:14
да, пишет, что null

стало быть автор статьи перестраховывается

Maxim
13.09.2017
06:50:30
традиция такая у тех, кто имел дело с Си, потому что там переменные не инициализируются)

лучше перебдеть, чем недобдеть

Andrey
13.09.2017
06:51:01
у меня тоже прямо руки чещутся null вписать везде

(:

как-то надежнее выглядит просто так, со стороны глядя.

qwerty
13.09.2017
06:56:31
в случае с D есть все что надо для того, чтоб null вообще не было в коде

Google
Andrey
13.09.2017
06:57:24
ну в методах же надо порой вставлять

Maxim
13.09.2017
06:57:26
можно пойти дальше, в случае с D есть все для того, чтобы не пользоваться указателями)

Andrey
13.09.2017
06:57:38
а структуры укак же?

NullSanya
13.09.2017
06:58:01
Maxim
13.09.2017
06:58:03
нет что?)

Andrey
13.09.2017
06:58:37
ref для меня лично не сильно очевиден

qwerty
13.09.2017
06:58:39
есть действительно все что надо для того, чтоб не пользоваться указателями

Maxim
13.09.2017
06:58:51
я про это и говорю

Andrey
13.09.2017
06:59:07
я его понимаю пока как алиас для & но наверняка ошибаюсь, глубоко еще не читал

qwerty
13.09.2017
06:59:17
я про это и говорю
я подумал, что это сарказм. Прошу прощения

Maxim
13.09.2017
07:00:18
я его понимаю пока как алиас для & но наверняка ошибаюсь, глубоко еще не читал
в таком случае лучше рассматривать ref как указатель, который всегда указывает на конкретную область памяти)

Andrey
13.09.2017
07:02:22
ну а массив структур - тоже без указателей городить?

Maxim
13.09.2017
07:02:37
да

Andrey
13.09.2017
07:02:44
непривычно (:

Maxim
13.09.2017
07:03:11
а где вообще в массив структур можно воткнуть указатель?)

Andrey
13.09.2017
07:05:28
я имею в виду нечто, как в С++, struct a; std::vector <a*> array; array.push_back(new a() );

Maxim
13.09.2017
07:06:20
в D это будет просто a[] arr; arr ~= a();

Dmitry
13.09.2017
09:10:12
Только в примере на С++ это не массив структур, а массив указателей на структуры. В массиве структур они последовательно лежат одна за другой, как в примере на D, а в примере Андрея структуры будут раскиданы по памяти фиг знает как, а в массиве один за другим будут лежать указатели на них. Оба варианта имеют смысл, у каждого свои достоинства и проблемы.

Maxim
13.09.2017
09:12:28
тут еще нужно помнить, что структуры в D создаются на стеке)

Google
Maxim
13.09.2017
09:18:48
имеет смысл везде обходить указатели

У меня такой вопрос назрел. Никто не поверял, прокатывает ли в D хак, подобный C++, когда помечаешь метод как final, и компилятор перестает искать его в таблице виртуальных методов?

qwerty
13.09.2017
09:24:59
в спецификации такое указано, но я не проверял

Dmitry
13.09.2017
09:25:17
имеет ли смысл тогда на D вовсе обходить стороной указатели?
Я бы сказал действовать по ситуации. Если напрашивается указатель и ref плохо подходит почему-то - используем указатель.

Про final методы: почему ж это хак? Это их назначение, практически, классическая оптимизация.

Andrey
13.09.2017
09:28:49
Я бы сказал действовать по ситуации. Если напрашивается указатель и ref плохо подходит почему-то - используем указатель.
у меня просто представление такое, С++-ное, наверное, когда создаешь нечто типа myClass* a = new myClass(); а потом указатели хранишь по массивам и что надо, то и делаешь. в D я пока в голове не сложил, как лучше делать и поэтому мешаю в кучу то ref, то указатели, а еще и классы сразу являются ссылками. потому путаюсь.

Maxim
13.09.2017
09:29:36
В D классы и структуры — это разные вещи)

Andrey
13.09.2017
09:29:42
это я заметил (:

Maxim
13.09.2017
09:30:06
ну, собственно, из этого и вытекает ненужность указателей)

вместо хранения массива указателей на структуры можно использовать массив классов)

Maxim
13.09.2017
09:31:26
ну или тех же ссылок на структуры)

или даже самих структур)

Dmitry
13.09.2017
09:32:55
Да, в таких случаях (а они очень часты) достаточно просто классов, там указатели уже убраны под капот.

Maxim
13.09.2017
09:34:56
но тут нас поджидает другой сюрприз: если нам нужен гарантированный деструктор при выходе из области видимости, то придется использовать структуры)

Andrey
13.09.2017
09:35:33
получается так, что то, что я лепил в С++ внутри класса как class myClass{ classTwo* class2; } можно писать без звезды. и передача в фнукцию, например, тоже пойдет без указателя, а просто, типа, foo(myClass class)

Maxim
13.09.2017
09:35:44
scoped можно использовать
да, и он просто обернет класс в структуру с деструктором)

NullSanya
13.09.2017
09:36:06
Google
NullSanya
13.09.2017
09:36:13
Хотя на самом деле структура

Andrey
13.09.2017
09:36:22
но тут нас поджидает другой сюрприз: если нам нужен гарантированный деструктор при выходе из области видимости, то придется использовать структуры)
вот, честно говоря, когда только-только начал изучать D, дцумал, что таких сюрпризов не будет (: теперь же на все готов применять destroy

Andrey
13.09.2017
09:39:47
да просто я как думаю, по-деревенски, если все равно есть проблемы и тонкости по уборке, то что new/delete в С++ что нюансы с GC - jlby xjhn

один чорт то есть (:

Maxim
13.09.2017
09:40:45
сборка мусора гарантированно позволяет избежать ошибок программиста, связанных с утечкой памяти

Andrey
13.09.2017
09:41:24
ну вот внутри у меня в классе будут С-функции, которые с памятью работаю по-своему. и за ними надо следить.

Maxim
13.09.2017
09:41:27
но за это приходится платить оверхедом сборщика мусора и несколько бОльшим потреблением памяти

Admin
ERROR: S client not available

Andrey
13.09.2017
09:42:14
и потому мои небольшие ожидания, что можно немного расслабиться, идут прахом (:

ну библиотека какая-нибудь, например, SDL2

или allegro5

Maxim
13.09.2017
09:43:06
собственно, обертки над такими делами делаются, со всех сторон обкладываются тестами, и дальше используются именно обертки)

именно для того, чтобы не тянуть C-функции работы с памятью в остальной проект

магии, увы, не существует)

Andrey
13.09.2017
09:44:17
это делается, как правило ,на стороне бинда библиотеки или тем, кто уже использует эти бинды?

Maxim
13.09.2017
09:44:48
да по-разному, я подозреваю)

Andrey
13.09.2017
09:44:53
(:

Google
Andrey
13.09.2017
09:45:38
я так понимаю, если функции сишные в бинде имеют nogc и nothrow то по-любому придется самому суетиться?

Maxim
13.09.2017
09:47:24
nogc и nothrow — это всего лишь подсказки компилятору, что внутри функции не будет операций, которые приводят к сборке мусора и ничто не выкинет исключение

а если в бинде функции сишные, то суетиться в любом случае придется

Andrey
13.09.2017
09:48:13
ну что ж - так тому и быть. спасибо за объяснения.

Dmitry
13.09.2017
10:30:40
У меня вопрос по диапазонам. Есть ли понятие ленивые диапазоны?

Maxim
13.09.2017
10:31:16
они все вроде как ленивые должны быть

по возможности, конечно

NullSanya
13.09.2017
10:31:37
ну если явно их не превратить во что-то

так они ленивые

Dmitry
13.09.2017
10:34:17
а как работает метод .array который преобразует диапазон в простой массив

Maxim
13.09.2017
10:35:01
собирает все в кучу и возвращает массив

Dmitry
13.09.2017
10:35:20
т.е. ему нужно время какое-то получается чтобы там все проитерировалось внутри?

Maxim
13.09.2017
10:36:01
ага

а если у диапазона нет конца, будет ой

и если быть точным, .array — это не метод, а шаблон, объявленный в std.array, который для любого Range возвращает динамический массив типа ForeachType!Range[]

внутри он работает как appender

Dmitry
13.09.2017
10:55:46
Олег https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2017/09/websight.gif

Andrey
13.09.2017
11:11:43
ссылки есть только в параметрах функций

Andrey
13.09.2017
11:20:26
вот еще вопрос по наследованию. есть родительский класс со свойством int a; чтобы это свойство увидеть в наследнике, надо обязательно в родительском оформить,например, @property int a(){} ?

Andrey
13.09.2017
11:22:12
просто используй а

оно видно в наследнике если оно public и protected

Andrey
13.09.2017
11:23:05
а. у меня private, потому и не дает, наверное

понятно

Страница 264 из 719