Текущий архив: 2004.06.13;
Скачать: CL | DM;
ВнизИнициализация AnsiString Найти похожие ветки
← →
Sandman25+1 (2004-05-31 15:07) [0]Разбираю переданный мне код и натыкаюсь на следующий код:
procedure ...;
var
S: String;
I: Integer;
begin
for I := ... do
S := S + IntToStr(...)
....
Почти риторический вопрос: следует ли инициализировать S? С одной стороны, AnsiString не требует инициализации, но, с другой стороны, при замене типа на какой-нибудь ShortString или String[N] начнется некорректная работа.
← →
Gero © (2004-05-31 15:11) [1]В любом случае, инициализировать в данном случае - хороший тон.
← →
Gero © (2004-05-31 15:12) [2]Сорри за тофтологию.
← →
Sandman25+1 (2004-05-31 15:27) [3][1] Gero © (31.05.04 15:11)
Спасибо за ответ. Мне тоже так кажется.
← →
GuAV © (2004-05-31 15:33) [4]Имхо, компилятор должен оптимизить инициализирование таких строк, т.е. удалять совсем, как инициализирование полей класса в nil или false, но он почему-то не делает...
← →
GuAV © (2004-05-31 16:06) [5]используй ansistring - это будет намёк, что к string[255] код неприменим
← →
Sandman25+1 (2004-05-31 16:46) [6][5] GuAV © (31.05.04 16:06)
Точно, это будет ма-а-а-ленький, но очень полезный рефакторинг... Спасибо за совет!
← →
Piter © (2004-05-31 17:50) [7]Sandman25+1 (31.05.04 15:07)
Почти риторический вопрос: следует ли инициализировать S?
если Дельфи предупреждение не выдает - то и не надо инициализировать.
А если тип будет изменен - то Дельфи выдаст предупреждение и человек не будь дураком на это предупреждение отреагирует...
← →
Gero © (2004-05-31 17:52) [8]
> если Дельфи предупреждение не выдает - то и не надо инициализировать
Не факт.
← →
Piter © (2004-05-31 17:57) [9]Gero (31.05.04 17:52) [8]
Не факт
что значит не факт? Вы говорите "какой цвет лучше". Я овтечаю - "зеленый". А вы отвечаете "не факт"...
что значит не факт? :))) я просто высказал так, как считаю.
← →
Гаврила © (2004-05-31 18:04) [10]В общем случае delphi может не выдавать предупреждение в случае, когда код реально некорректен.
Например при создании класса с абстрактными методами через переменную типа class of
← →
Gero © (2004-05-31 18:08) [11]
> Piter © (31.05.04 17:57)
IMHO или AFAIK в твоем посте я не увидел, значит стоит рассматривать его, как констатацию факта.
← →
GuAV © (2004-05-31 18:33) [12]
> и человек не будь дураком на это предупреждение отреагирует...
{$WARNINGS OFF}
имхо, на предупреждения компилера нельзя рассчитывать и второе предупреждение в виде S: AnsiString лишним не будет.
raise EOffTopic.Create("А что такое рефакторинг?");
← →
panov © (2004-05-31 19:18) [13]Глобальные переменные инициализируются нулевыми значениямию
Локальные же переменные программист обязан инициализировать сам. КАк и глобальные (во избежание ошибок).
Из Help:
If you don’t explicitly initialize a global variable, the compiler initializes it to 0. Local variables, in contrast, cannot be initialized in their declarations and contain random data until a value is assigned to them.
← →
GuAV © (2004-05-31 19:27) [14]panov © (31.05.04 19:18) [13]
Но ведь string инициируется в string(nil)...
По крайней мере view->debug->CPU
- лишний xor специально для этого.
← →
Anatoly Podgoretsky © (2004-05-31 20:51) [15]GuAV © (31.05.04 19:27) [14]
[Ansi]string это особый случай, он является часть языка и управляется автоматически. Проверить можешь в редакторе, он выделяется иначе чем другие типы, которые являются предопределенными и могут быть переопределены, они частью языка не являются.
← →
GuAV © (2004-05-31 21:15) [16]
> [Ansi]string это особый случай, он является часть языка
> и управляется автоматически. Проверить можешь в редакторе,
> он выделяется иначе чем другие типы, которые являются предопределенными
> и могут быть переопределены, они частью языка не являются.
Спасибо за разъяснение. Я так и думал что asnistring - это что-то потусторонее.
Вопрос: следует ли из этого, что его можно и не инциировать [0]
или
порядок для всех один [13] ?
← →
Anatoly Podgoretsky © (2004-05-31 21:18) [17]Хороший термин, прямо в глаз
Да можешь не инициализировать, об этом побеспокоится компилятор, а вот с ShortString так не делай, но если инициализируешь то тоже ничего страшного, ошибки не будет.
Это же относится и к динамическим массивам.
Связано это с особой структурой этих типов, есть счетчик ссылок, и когда он становится равным нулю то память освобождается и переменной присваивается nil
А теперь представь, чтобы было если начальное значение не было равно nil, кошмар!
← →
GuAV © (2004-05-31 21:49) [18]Anatoly Podgoretsky © (31.05.04 21:18) [17]
Спасибо.
А в хелпе почему-то ни в Long strings ни в Dynamic arrays этот факт не упомянут, что они в nil инициализируются...
← →
default © (2004-05-31 22:09) [19]"А теперь представь, чтобы было если начальное значение не было равно nil, кошмар!"
ничего, есть же место где хранится длина массива, большего и не нужно
← →
Anatoly Podgoretsky © (2004-05-31 22:15) [20]Какое место, строки то еще нет, и будет AV
← →
default © (2004-05-31 22:24) [21]допустим объявили лок-ую пер-ую типа String
нафига ей указ-ль об"nil-ять?обнулим размер строки, далее при присв-ии этой строке какого-то знач-ия код компил-ра увидит что размер-то нулевой - выделит нужное число байт, запишет длину массива в нужное место, актуал-ет адрес строки, самое значение запишет и все будут довольны(конечно, можно вместо обнуления длины массива исполь-ать 0-ой указ-ль то есть дост-но обнуления чего-то одного)
← →
jack128 © (2004-05-31 22:46) [22]
> raise EOffTopic.Create("А что такое рефакторинг?");
Это когда ты изменяешь код программы не внося новую функциональность, но эти изменения делают логику программы более простой и ясной.
например изменишь вот этот код
function i(b: TRect): Cardinal;
begin
Result := (b.Right - b.Left + 1) * (b.Bottom - b.Top + 1);
end;
на вот такой
function GetRectSquare(ARect: TRect): Cardinal;
begin
Result := (ARect.Right - ARect.Left + 1) * (ARect.Bottom - ARect.Top + 1);
end;
- это будет рефакторинг, по скольку клиенту функции уже из названия функции будет ясно, что эта функция делает.
← →
GuAV © (2004-05-31 23:26) [23]default © (31.05.04 22:24) [21]
Как я понял Anatoly Podgoretsky и F1:
Код
S:="abc" S:=S+"def" и S:="" одинаково требуют чтобы S была nil.
Это происходит, т.к. согласно copy-on-write semantics нужно сначала если S<>nil декрементировать reference-count S, что вызовет AV если PChar(S) указыветк куда-то.
Поэтому var S: AnsiString инициализируется автоматически как PChar(S):=nil;
← →
GuAV © (2004-05-31 23:36) [24]jack128 © (31.05.04 22:46) [22]
Спасибо, а то я думал что общеупотребительное слово, в словарях искал, а потом ещё экономисты объясняли, что такое факторинг...
← →
Anatoly Podgoretsky © (2004-05-31 23:38) [25]Нет, но требуется до самого первого присвоения, иначе обращение по непринадлещащей памяти, в никуда.
← →
default © (2004-05-31 23:45) [26]GuAV © (31.05.04 23:26) [23]
это было в теории, конкретную реализ-ию управ-ия длинными строками я не затрагивал...некорректно выразился ранее
← →
Дмитрий В. Белькевич (2004-06-01 07:32) [27]Result := (ARect.Right - ARect.Left + 1) * (ARect.Bottom - ARect.Top + 1);
with ARect do
Result := (Right - Left + 1) * (Bottom - Top + 1);
p.s. ;)
Страницы: 1 вся ветка
Текущий архив: 2004.06.13;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.035 c