Главная страница
    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.51 MB
Время: 0.028 c
14-1085759818
Petr V. Abramov
2004-05-28 19:56
2004.06.13
Виноватый назначен! :)


1-1086082142
Yuriy
2004-06-01 13:29
2004.06.13
FastNet под Delphi7


6-1082557140
Lena19
2004-04-21 18:19
2004.06.13
что делать если не успеваеш считывать буфер


4-1084196011
FireMan_Alexey
2004-05-10 17:33
2004.06.13
Вопрос по реестру!


1-1085970696
borg
2004-05-31 06:31
2004.06.13
Работа с файлами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский