@dlangru

Страница 117 из 719
Oleg
20.01.2017
15:03:55
задача то исходная какая?

Dmitry
20.01.2017
15:04:14
просто сижу разбираюсь с языком и пытаюсь понять эти основы

Oleg
20.01.2017
15:04:17
чтобы срез всегда смотрел в новые значения по строке?

Dmitry
20.01.2017
15:04:24
да

Google
Dmitry
20.01.2017
15:04:25
именно

Oleg
20.01.2017
15:04:39
тогда тебе нужна не строка, а массив char

и ты не просто присваиваешь значения, а копируешь память по старому адресу

Dmitry
20.01.2017
15:05:11
char [] str = "mystr" так?

Grigirii
20.01.2017
15:05:47
char [] str = "mystr".dup;

единственный правильный способ сделать изменяемое из неизменяемое - скопировать

Dmitry
20.01.2017
15:06:10
понял, спасибо

Oleg
20.01.2017
15:06:20
import std.stdio; void main() { char[] str = "abracadabra".dup; auto slc = str[1..4]; writeln(slc); str[] = "hello world".dup[]; writeln(slc); }

при этом стоит заметить, что str = "hello world".dup; не сработает

потому как будет заменён адрес в str

конструкция str[] = some_array[]; производит поэлементное копирование

кстати, хз чё с памятью происходит

хех)

Google
Oleg
20.01.2017
15:09:12
просто с длиной угадал

так что будь аккуратней, если так делаешь

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

можно это обойти немного auto ss = "hello world"; auto len = min(str.length,ss.length); str[0..len] = ss.dup[0..len]; но, это тоже несёт определённые проблемы

если ss будет меньше str, то что было в конце str так там и останется

не знаю, конкретно со строками это вообще тухлый подход

в целом

со срезами и тд

так что выкинь его из головы)))

Grigirii
20.01.2017
15:16:26
День плохих советов начат))
я смотрю он продолжается ?

Oleg
20.01.2017
16:40:09
ребят, кто в математике шарит?

срочна нада)

есть опр. ограничение — интеграл функции = 1

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

тоесть на каждом диапазоне сумма всех значений должна быть 1

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

[[1], [0.5, 0.5], [0.4, 0.2, 0.4], [0.3, 0.2, 0.2, 0.3]]

функция — парабола

ну или что-то похожее

всё из головы вылетело

Google
Dmitry
20.01.2017
16:49:09
так, еще вопрос. А аллоцированный массив у оригинальной строки его сборщик мусора уберет? Если да, то какая ситуация в языках без ГК?

Oleg
20.01.2017
16:49:58
в языках без ГК всё сам делаешь

забыл — утечка

Dmitry
20.01.2017
16:50:25
а как это хотя бы примерно выглядит?

Oleg
20.01.2017
16:53:11
а что именно выглядит?

1. выделяешь память 2. используешь её 3. удаляешь её

очень много гемороя с этим

Dmitry
20.01.2017
16:54:11
Так, а диструктор в классе всегда удаляет что нужно или допустим аллоцированные строки он не тронет?

Oleg
20.01.2017
16:54:50
в языках без GC (С++ например), если в конструкторе ты где-то делаешь new, то логично делать delete в деструкторе

сам деструктор ничего не делает

максимум вызов других деструкторов полей переменных, которые не являются указателями

Dmitry
20.01.2017
16:56:55
т.е. деструктор класса вызывает деструктор для каждой переменной определенной в классе?

Grigirii
20.01.2017
16:58:13
да

в D так же

для структур

Oleg
20.01.2017
16:59:05
переменной, которая НЕ указатель

Grigirii
20.01.2017
16:59:16
да, важное замечание

Oleg
20.01.2017
16:59:35
если ты выделил сам (new, malloc), то сам и должен высвободить

не обязательно это будет конструктор-деструктор

просто ты за этим должен следить

Google
Oleg
20.01.2017
17:00:01
это касается языков без GC

Dmitry
20.01.2017
17:00:40
а почему бы не вызывать деструктор для всех переменных без явного указания что руками десткруктора для каждой переменной?

Oleg
20.01.2017
17:01:02
потому что вдруг у тебя фабрика

и созданная внутри класса переменная должна дольше жить чем класс?

там много есть вариантов

что да как и почему

и память высвобождать дважды нельзя

в общем геморой это всё

если тебе это сложно даётся, то лучше пока не лезь в языки типа С++, сначала разберись с базовыми вещами

а то там пойдут вопросы про виртуальные деструкторы и почему их нужно делать виртуальными и тд

Admin
ERROR: S client not available

Oleg
20.01.2017
17:03:58
в целом тема не особо трудная, но базу знать надо до её освоения

Grigirii
20.01.2017
17:04:05
и любимое виртуальное наследование ...

Oleg
20.01.2017
17:48:07
насчёт то функции, про которую я говорил

если кому интересно float F(float x) { return x*x*x / 3.0f + 1/6.0f * x; } float magic(size_t pos, size_t len) { if (len == 1) return 1.0f; auto step = (2.0f / len); return F(-1.0 + (pos+1) * step) - F(-1.0 + pos * step); }

F — аналитическое решение интеграла f(x) = x^2 + 1/6 (для этой функции на отрезке от -1 до 1 интеграл равен 1)

Dmitry
20.01.2017
18:10:17
а что делает dup разве он не приводит к новое аллокации?

Oleg
20.01.2017
18:12:52
приводит

Dmitry
20.01.2017
18:13:21
т.е. проблему эту адекватно очень сложно решить?

Oleg
20.01.2017
18:15:36
а в чём проблема то?)

Google
Dmitry
20.01.2017
18:15:51
чтобы слайс указывал на новый массив

Просто я сделал как ты сказал, но он у меня опять на старый ссылается

Oleg
20.01.2017
18:16:40
где это?

Dmitry
20.01.2017
18:17:10
void main() { char [] str = "abcdef".dup; char [] newstr = str[1..4]; writeln(newstr); str = "qwerty".dup; writeln(newstr); } выводит: bcd bcd

Oleg
20.01.2017
18:17:34
ты не внимателен

str = "qwerty".dup;

заменяет указатель в str, а не значения внутри

нужно копировать внутрь str

str[] = "qwerty"[];

Dmitry
20.01.2017
18:23:37
что значат квадратные скобки вконце? Что они дают?

Oleg
20.01.2017
18:26:19
поэлементное копирование срезов

можно указывать от какого по какой элемент ты хочешь скопировать

главное чтобы слева и справа было одинаковое число элементов

Dmitry
20.01.2017
18:26:57
т.е. это аналог dup ?

Oleg
20.01.2017
18:27:23
нет

это аналог for(size_t i=0; i<str.length; i++) str[i] = "qwerty"[i];

Dmitry
20.01.2017
18:30:57
О, получилось) спасибо)

а как работает dup? он строку переводит в отдельные символы?

char [] str = "abcdef".dup;

И правильно ли я понял, что твой метод не приведет к лишней аллокации?

ptr - свойство объекта string, string* - указатель на строку
свойство на что указывает и чем указатель на свойство отличается от указателя на строку?

Oleg
20.01.2017
18:57:07
dup всегда создаёт копию массива

Dmitry
20.01.2017
18:58:08
создает копию и расклдывает ее посимвольно? char [] str = "abcdef".dup; ведь тут мы строку получается в массив чаров загоняем

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