- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
program Project6;
{$APPTYPE CONSOLE}
uses SysUtils;
type TIntArr = array of integer;
function GetSingleArr (i: integer): TIntArr;
begin
SetLength(Result, 1);
Result[0] := i;
end;
var
W: TIntArr;
i : integer;
begin
readln(i);
if i=0 then begin
W := GetSingleArr(5);
WriteLn(W[0]);
end;
ReadLn;
end.
Delphi-7
[Warning] Project6.dpr(25): Variable 'W' might not have been initialized
Да какого хуя? Динмассив вообще по определению - чисто автоматический тип, как он может не инициализироваться?
И почему для других типов такая хрень не вылазит?
blackhearted 18.07.2013 10:28 # 0
guest 13.09.2013 00:02 # −8
[email protected] (Спросить Тараса)
guest 13.09.2013 00:02 # −8
[email protected] (Спросить Тараса)
inkanus-gray 18.07.2013 11:54 # −1
z.pas(21) Hint: Value assigned to 'i' never used
z.pas(20) Warning: Variable 'i' might not have been initialized
А у меня наоборот!
TarasB 18.07.2013 12:08 # +1
У меня ничего подобного не происходит - W я использую только в ветке, в которой я его явно инициализирую (в других он инициализируется неявно). Если я вместо TIntArr применю иной тип (например, String), то этого предупреждения не будет, вот что самое дурацкое.
inkanus-gray 18.07.2013 12:27 # −2
P.S. На type TIntArr = array [0..9000] of integer; Дельфи не ругается. Ругается только на динамический.
bee-squid 18.07.2013 12:28 # −3
Стринги всегда инициализируются компилятором, это не пример.
Такой пример наводит на какие-нибудь мысли, не?
или даже
inkanus-gray 18.07.2013 12:33 # −2
bee-squid 18.07.2013 12:39 # −1
TarasB 18.07.2013 13:30 # 0
Динмассивы тоже.
> Такой пример наводит на какие-нибудь мысли, не?
Не имеет никакого отношения, тут запись в хзкакой адрес.
Мой код 100% корректен.
bee-squid 18.07.2013 12:41 # −1
Теперь сравни с предыдущим примером и пойми почему :)
TarasB 18.07.2013 13:31 # +1
Сравнил.
Ну, и почему же мой пример даёт предупреждение?
inkanus-gray 18.07.2013 15:11 # 0
TarasB 18.07.2013 15:14 # 0
В любом случае код финализации массива одинаковый.
guest 13.09.2013 22:28 # −6
inkanus-gray 18.07.2013 14:01 # 0
Этот код:
В чём разница, кроме вызова DynArrayAsg для копирования массива из безымянной переменной в стеке в W?
blackhearted 18.07.2013 12:42 # −5
inkanus-gray 18.07.2013 13:09 # −5
Это Object Pascal.
guest 13.09.2013 00:02 # −7
[email protected] (Спросить Тараса)
HaskellGovno 18.07.2013 16:30 # +3
PS: Или будь уникален и линяй на Аду. Тоже есть чем нагибать.
inkanus-gray 18.07.2013 21:49 # 0
3.14159265 18.07.2013 22:03 # −1
Какого? Да и причем тут язык?
inkanus-gray 18.07.2013 23:29 # −1
Treulos 19.07.2013 00:28 # −1
А еще, что вам мешает на Си реализовать контейнер паскалестрок?
А да еще, в этом ваши делфи освобождением памяти от строк(и от дин.массивов) занимается GC, что куда дороже, чем нультерминированная строка.
http://stackoverflow.com/questions/4440841/garbage-collection-in-delphi
По поводу данного кода: W может не инициализироваться, если цикл будет выполнен 0 раз, к этому выводу приходит компилятор, анализируя Control-Flow-Graph. Поэтому тут все в порядке.
inkanus-gray 19.07.2013 01:35 # −1
2. За ссылку спасибо, посмотрю.
3. Если цикл будет выполнен 0 раз, то переменная использована будет тоже 0 раз.
superhackkiller1997 19.07.2013 03:31 # −4
Это не паскаль строки - это сишные строки, только с добавночной длинной. Т.е. сама длинна строки к строке не имеет отношения, она имеет отношение только к указателю.
В питух паскаль строке - сделанно как в маллоке. char * str; *(uint16_t *)str = len;
И да, самая быстрая конкатенация строк в сишке. Была и всегда будет.
Treulos 19.07.2013 10:04 # −1
Компилятору все равно, он всего лишь анализирует граф потока управления.
array of T в паскале - не более чем указатель.
TarasB 19.07.2013 10:16 # −1
Это указатель с автоматикой. И только на нём компилятор клинит в паранойю. На string - не клинит.
Treulos 19.07.2013 10:42 # −2
И сравнивать string и array of T некорректно, имхо.
А вот string^ и array of T уже можно, ибо и то и то - указатели.
TarasB 19.07.2013 10:55 # +1
Нихуя подобного, они оба инициализируюся нилом, учи матчасть.
guest 13.09.2013 00:02 # −6
[email protected] (Спросить Тараса)
bormand 19.07.2013 05:58 # +3
Да откуда там GC!? Емнип, на строках только счетчик ссылок, только хардкор.
Treulos 19.07.2013 10:01 # −1
ARC часто рассматривают как частный случай GC;
GC вполне себе реализуется в языках с компиляцией в натив.
Однако, если бы было ARC, то при каждой циклической ссылке в объектах - происходила бы утечка памяти.
TarasB 19.07.2013 10:17 # −1
Не путай ГЦ и автодеструкторы, у них есть очень, очень важные отличия.
Treulos 19.07.2013 10:45 # −1
TarasB 19.07.2013 10:56 # −1
TarasB 19.07.2013 10:57 # −1
Treulos 19.07.2013 11:07 # −1
TarasB 19.07.2013 11:18 # −1
bormand 19.07.2013 10:24 # 0
Откуда взяться циклическим ссылкам в строках? А для объектов там ARC и не работает.
> происходила бы утечка памяти
Проблема, на самом деле, довольно надуманная. А если есть weak_ptr и немного мозгов - ее вообще почти не существует.
TarasB 19.07.2013 10:27 # −1
А вот если в динмассив запечь RC-интерфейс с полем с таким динмасивом, то тут таки да, будут проблемы.
bormand 19.07.2013 10:29 # −1
TarasB 19.07.2013 10:34 # −1
wvxvw 19.07.2013 13:14 # −1
Если строки реализованы как "веревки" (ropes), то вполне может получиться, если тому, кто реализовывал захочется хранить указатели в обе стороны (от родителей к детям и обратно).
TarasB 19.07.2013 10:15 # −1
Какой нахуй GC?
> W может не инициализироваться, если цикл будет выполнен 0 раз
Где цикл? W нужна и используется только внутри одной ветки.
Что сука характерно, если вместо TIntArr взять любой другой тип, хоть string,похожий по принципу работы, то этого неуместного предупреждения не будет.
Ну и как вообще динмассив может не инициализироваться, если это автоматический тип?
Treulos 19.07.2013 10:49 # −1
TarasB 19.07.2013 10:54 # −1
Учи матчасть, он инициализируется нилом. Иначе бы при первой смене длины он попытался бы освободить старый мусор, пиздец же был бы, да?
> а string - аллоцируется автоматически.
Учи матчасть, нихуя он не аллоцируется, он инициализируется нилом.
Treulos 19.07.2013 11:02 # −1
struct{
int len;
char* str;
};
И соответственно при входе в процедуру выделяется память(чаще всего на стеке, если строка не возвращается) для длины и указателя.
Шел бы сам матчать учил.
PCHar конечно же устанавливается в nil, но мы же о обычных паскале строках.
TarasB 19.07.2013 11:17 # −1
Откуда ты знаешь? Это в крестах так, а в Дельфи - не так.
Ты ж нихуя не знаешь, только умными словами на английском языке кидаться горазд, лолка.
К твоему сведению, в Паскале строка выглядит так:
Дальше берётся что-то типа
Потом при SetLength вызывается аллокатор для NewLength+SizeOf(StrRec)
После чего возвращается указатель не тот, что вернул аллокатор, а P+SizeOf(StrRec), то есть строка - это указатель на первый символ, а перед ним идут ещё 8 байт структуры StrRec.
> но мы же о обычных паскале строках.
Обычные - это которые до 255 символов? Я не про них.
inkanus-gray 19.07.2013 15:06 # −1
http://ideone.com/l58zHK
string[N] (точнее ShortString) — это struct { char len; char str[N]; }; Да, никаких указателей и никаких интов, только чар, только хардкор.
String без указания длины — это указатель на str[1].
array of char — это указатель на array [0..длина - 1] of char. Аналогично, AnsiString, WideString, UTF8String — такие же указатели на массив.
inkanus-gray 19.07.2013 15:13 # −1
А ShortString — это struct { char len; char str[N]; }, как и string[N].
inkanus-gray 19.07.2013 15:21 # 0
Если разыменовать AnsiString, WideString, UTF8String, то по смещению минус четыре перед массивом хранится его размер в байтах. А если разыменовать array of char, то перед массивом по смещению минус восемь хранятся два числа: диапазон его индексов (а по смещению минус двенадцать — вероятно, тип элементов).
ctm 19.07.2013 07:38 # 0
var w: TIntarray;
begin
end;
если заменить на string, то варнинг пропадает. разница - в вызове _DynArrayClear или LStrClr.
Причем, аргумент, который указатель на строку/массив передавется одинаково.
Глюк компилятора, походу.
TarasB 19.07.2013 10:18 # −1
Но в таком коде хотя бы есть неиспользуемые переменные.
Я постарался подобрать код, который не должен вообще выдавать претензий.
ctm 19.07.2013 13:25 # −1
кстати, если в начале добавить w := NIL, варнинг пропадает.
а разница вот в чем (модуль system):
procedure _LStrClr(var S);
procedure _DynArrayClear(var a: Pointer; typeInfo: Pointer);
TarasB 19.07.2013 13:54 # −1
Ну да, неявно вызываются разные функции, всё равно не понимаю. Один из них не помечена как "считать что переменная использована если вызывается"?
ctm 23.07.2013 06:13 # 0
в любом случае - фигня какакя-то.
Stertor 10.08.2013 21:33 # +2
guest 20.09.2013 19:09 # −7
Stertor 25.07.2013 08:34 # −4