
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;
И правильно ли я понял, что твой метод не приведет к лишней аллокации?

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

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