Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.054 c
3-1084960375
Kein
2004-05-19 13:52
2004.06.13
Как создать базу с DEFAULT CHARACTER SET WIN1251


14-1085591875
Art_Z
2004-05-26 21:17
2004.06.13
Про "кладовку"


14-1085710992
Думкин
2004-05-28 06:23
2004.06.13
С днем рождения! 28 мая


1-1086044926
Dark Man
2004-06-01 03:08
2004.06.13
работа с dll вызов процедур программы из dll


14-1085815415
Mad Dancer
2004-05-29 11:23
2004.06.13
Колосоккер