@dlangru

Страница 116 из 719
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

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