
Dmitry
20.01.2017
13:18:40
почему не сделает то?

Grigirii
20.01.2017
13:19:14
сделай writeln(str) до и после replace
str не меняется

Google

Dmitry
20.01.2017
13:19:59
да не меняется
а что же тогда происходит в момент выхода на экран?

Grigirii
20.01.2017
13:22:51
создаётся новая строка и она возвращается из replace
напиши auto str2 = str.replace
и выведи их по отдельности
если хочешь менять ту же переменную, то можно str = str.replace

Dmitry
20.01.2017
13:26:09
В этот момент
str = str.replace(i,u);
переменная str просто получит новый адрес в памяти?

Grigirii
20.01.2017
13:26:41
нет, адрес str не поменяется, &str останется прежним, а вот str.ptr поменяется

Dmitry
20.01.2017
13:28:38
адрес это то что хранится в стеке — типа там где лежит название переменной, а указатель это там где лежат данные от нее так?

Grigirii
20.01.2017
13:31:50
так. адрес и указатель это одно и то же, названное с разных сторон. на стеке лежит структура str, грубо говоря это 2 указателя - на начало строки и на её конец. указатель на начало строки это str.ptr. сами данные, на которые указывает str.ptr лежит где-то в куче. &str не имеет никакого отношение к содержимому строки, это указатель на структуру str, то есть указатель на те 2 указателя на начало и конец
не знаю понятнее ли так

Dmitry
20.01.2017
13:33:49
да вроде понятнее.
все переменные в Ди хранятся в стеке?

Google

Grigirii
20.01.2017
13:34:19
всё, что ты объявишь внутри функции да

Dmitry
20.01.2017
13:34:48
а если до нее? К пример до бфшт что-то объявить? Это тоже в стек пойдет?

Grigirii
20.01.2017
13:35:06
нет, глобальные переменные лежат отдельно
ещё вне стека (в куче) лежит содержимое массивов и всё, что создано через new
например в йункции есть. auto o = new MyClass(), тогда o - переменная , лежащая на стеке. она содержит указатель (ссылку) на область в куче, где лежит сам объект MyClass

Dmitry
20.01.2017
13:45:12
" указатель на начало строки это str.ptr"
А на конец строки тогда что указывает?

Grigirii
20.01.2017
13:46:16
ну формально не определён мезанизм хранения строк, там может быть как указатель на конец, так и просто длина. поэтому нет смысла добалвять такой геттер
всегда можно сделать str.ptr + str.length

Dmitry
20.01.2017
13:47:44
а размер определяется благодаря наличие сборщика мусора?

Grigirii
20.01.2017
13:49:04
а он тут при чём? он либо хранится в структуре, либо вычисляется разностью указателей

Dmitry
20.01.2017
13:52:12
А срез получается это манипцляция указателем на начало и на конец строки?

Grigirii
20.01.2017
13:52:27
да

Dmitry
20.01.2017
13:57:03
string str = "abcdefg";
string newstr = str[1..4];
newstr создаст ссылку с двумя указателями так?

Grigirii
20.01.2017
13:57:24
ну ссылку он не создаст, просто 2 указателя
ссылка будет создана, когда она понадобится, например string* p = & newstr;

Dmitry
20.01.2017
14:02:12
чем звездочка отличается от ptr ?

Армен
20.01.2017
14:02:50
ptr - это же метод, который и отдает указатель, нет?

Grigirii
20.01.2017
14:02:52
ptr - свойство объекта string, string* - указатель на строку

Армен
20.01.2017
14:03:27
ну да. так что это просто разные вещи

Google

Dmitry
20.01.2017
14:14:26
так, а могу я без операции replace значtние строки заменить? Просто написав: str = "newvalue" ?

Grigirii
20.01.2017
14:14:44
да

Dmitry
20.01.2017
14:16:40
Ну вод по здравой логике тогда последний вывод writeln должен быть не таким как прервый?
string str = "abcdefg";
string newstr = str[1..4];
writeln(newstr);
str = "qwerty";
writeln(newstr);

Grigirii
20.01.2017
14:17:55
почему же? при присваивании str = "qwerty" исходная строка "abcdefg" не меняется, поэтому newstr не меняется
str = "qwerty" это не модифицировать память со строкой, а присвоить в str указатели на совсем другую область, где лежит "qwerty"

Dmitry
20.01.2017
14:19:05
а поменять тогда как?

Grigirii
20.01.2017
14:19:29
никак :)

Dmitry
20.01.2017
14:20:36
ты же сказал, что я могу без replace поменять значение строки?

Grigirii
20.01.2017
14:20:58
строка неизменяема. если с обычным массивом можно сделать arr[i] = newValue, то со строками это не прокатит, тка как строка - массив НЕизменяемых символов

Dmitry
20.01.2017
14:21:38
тоесть тогда только replace который сделает пллокацию?

Grigirii
20.01.2017
14:22:05
replace не изменит строку, он создаст новую, в которой всё как в старой, но поменяны символы

Dmitry
20.01.2017
14:22:47
но для переменной указатель переставит на новую строку?

Grigirii
20.01.2017
14:22:54
да
если напишешь str = str.replace

Dmitry
20.01.2017
14:46:42
"str = "qwerty" это не модифицировать память со строкой, а присвоить в str указатели на совсем другую область, где лежит "qwerty""
так, ок присвоили мы указатели, но как это будет выглядеть с практической стороны? вот я написал этот код присваивания, у меня writeln же будет старый вариант выводить. Где я могу увидеть что str получила новый указатель?

Grigirii
20.01.2017
14:51:31
зачем это видеть? запись str = ... не намекает на изменение этой самой str?

Dmitry
20.01.2017
14:53:05
ну так строка str у нас же не изменяемая

Grigirii
20.01.2017
14:53:37
так, тогда сначала разберёмся с разницей const int[] и const(int[])
в первом случае неизменяемы значения в массиве, то есть поменять значение нельзя, но при этом сам массив изменяем, в переменную можно спокойно присвоить другой массив

Oleg
20.01.2017
14:54:28
В D нет неизменяемых указателей на изменяемую память

Google

Oleg
20.01.2017
14:54:30
Кажется

Grigirii
20.01.2017
14:54:37
есть

Oleg
20.01.2017
14:54:55
Реализуются библиотекой
А не языком
Rebindable кажется называется

Grigirii
20.01.2017
14:55:27
любой указатель на изменяемую память можно спокойно скастовать в указатель на неизменяемую

Oleg
20.01.2017
14:55:40
Ну это плохой стиль)

Grigirii
20.01.2017
14:55:45
int* a = malloc(100);
const int* c = a;
наоборот нельзя

Oleg
20.01.2017
14:56:23
Я попутал) наоборот можно, но плохой стиль

Admin
ERROR: S client not available

Grigirii
20.01.2017
14:56:35
Rebindable это для ссылочных типов и там всё действительно сложнее

Oleg
20.01.2017
14:56:49
Можно кастануть string к char[] и всё поменять

Grigirii
20.01.2017
14:57:03
да, но вот это уже очень-очень плохой стиль
потому что в случае литералов это может упасть с segmentation fault

Oleg
20.01.2017
14:57:41
А может и нет)
День плохих советов начат))

Grigirii
20.01.2017
14:57:53
потому как неизменяемость констант блюдёт ОС и обычно таких вольностей не позволяет
но в целом мысль правильная, если нужны изменяемые строки, то char[] - идеальный вариант
ну или dchar[]

Google

Dmitry
20.01.2017
14:58:59
уф.... %)

Oleg
20.01.2017
14:59:11
?
alias string = immutable char[]
это обычный массив D (не структура) из обычных char'ов
только immutable
любой массив содержит длину и указатель на начало

Dmitry
20.01.2017
15:00:41
Я уже идею потерял. как мне строку изменить по-простому. Так вот чтобы оно просто понятно было.

Oleg
20.01.2017
15:00:53
просто меняй и всё)
что конкретно нужно сделать?

Grigirii
20.01.2017
15:01:03
все изменения строки будут выглядеть как str = что-то

Oleg
20.01.2017
15:01:09
просто ты чёт подпарился вообще ни на том

Dmitry
20.01.2017
15:01:39
string str = "abcdefg";
string newstr = str[1..4];
writeln(newstr);
str = "qwerty";
writeln(newstr);
ну вот этот же код будет выводить те же самые буквы, хотя я ожидаю что срез будет показывать на измененную строку

Oleg
20.01.2017
15:01:45
в любом случае нормальный способ перевыделит тебе память под новую строку
сред работает с адресами
это по сути тот же массив, только операция относится к срезу
присваивая новое значение строке ты просто меняешь в ней адрес
в срезе адрес остаётся прежним
в срезанном массиве

Dmitry
20.01.2017
15:02:49
а... тоесть я не могу новую строку по адресу старой поместить отсюда все и проблемы?

Oleg
20.01.2017
15:02:54
да

Dmitry
20.01.2017
15:02:57
понял

Oleg
20.01.2017
15:03:17
так то можешь, но это не то что тебе нужно
тогда тебе нужна не строка, а массив char