Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];
ВнизОбьявление переменной в var Найти похожие ветки
← →
alexdn © (2011-08-22 18:30) [0]Как то я засомневался в одном вопросе.. вот если переменная обьявляется в блоке var, например:
var p:real;
присваивается ли ей автоматически значение 0..?
Или в коде нужно писать:var x,y:real
begin
x:=0;
y:=0;
тра-та-та..
говорят есть разница между глобальными и локальными переменными.
← →
Antoxa (2011-08-22 18:53) [1]Если объявил,то нужно инициализировать переменную:
var x,y:real
begin
x:=0;
y:=0;
тра-та-та.. :)
← →
int64 © (2011-08-22 18:55) [2]Варнинги и хинты это не просто так.
← →
alexdn © (2011-08-22 19:18) [3]> Antoxa (22.08.11 18:53) [1]
что то не верю я тебе:)
← →
Dimka Maslov © (2011-08-22 19:21) [4]Ноль присваивается только полям класса. Внутренним переменным процедур и функций - что было в том месте стека, то и будет значением переменной. Глобальные переменные вроде тоже изначально обнуляются, но лучше явно задать им начальное значение.
← →
alexdn © (2011-08-22 19:28) [5]> Dimka Maslov © (22.08.11 19:21) [4]
ладно, совсем делитантский вопрос - а что было в том месте стека?..
← →
Inovet © (2011-08-22 19:41) [6]> [5] alexdn © (22.08.11 19:28)
> а что было в том месте стека?..
Всё что угодно, считай мусор.
← →
Юрий Зотов © (2011-08-22 20:02) [7]
> говорят есть разница между глобальными и локальными переменными
Правильно говорят. Глобальные - обнуляются, локальные - нет.
← →
Ega23 © (2011-08-22 20:05) [8]
> alexdn © (22.08.11 19:18) [3]
>
> > Antoxa (22.08.11 18:53) [1]
> что то не верю я тебе:)
А проверить?
unit Unit9;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm9 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form9: TForm9;
implementation
{$R *.dfm}
function Foo: string;
begin
Result := Result + "0";
end;
procedure TForm9.Button1Click(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
for i := 1 to 10 do
Memo1.Lines.Add(Foo);
end;
end.
← →
Игорь Шевченко © (2011-08-22 20:10) [9]метлу купи - тебе самое оно
← →
alexdn © (2011-08-22 20:25) [10]> Игорь Шевченко © (22.08.11 20:10) [9]
повторенье мать ученья!..
← →
sniknik © (2011-08-22 20:33) [11]> Глобальные переменные вроде тоже изначально обнуляются, но лучше явно задать им начальное значение.
в винде обнуляются, под вайном нет. нарывался...
← →
Inovet © (2011-08-22 20:53) [12]> [11] sniknik © (22.08.11 20:33)
> в винде обнуляются, под вайном нет. нарывался...
Во как. Это что же в Вайне финкции Вин АПИ неверно реализованы.
← →
Игорь Шевченко © (2011-08-22 21:24) [13]
> Это что же в Вайне финкции Вин АПИ неверно реализованы.
нет это загрузчик не чистит тот сегмент, где delphi располагает глобальные переменные
← →
alexdn © (2011-08-22 21:53) [14]> Игорь Шевченко © (22.08.11 21:24) [13]
линкер имеется в виду?
← →
sniknik © (2011-08-22 22:02) [15]имеется в виду загрузчик.
← →
Sha © (2011-08-22 22:52) [16]также имеется в виду сегмент, delphi и глобальные переменные.
← →
Rouse_ © (2011-08-22 23:42) [17]Кстати вот это утверждение тоже верно:
> Inovet © (22.08.11 20:53) [12]
> Это что же в Вайне финкции Вин АПИ неверно реализованы.
Последнее время часто контактирую в разработчиками Wine, с некоторыми моментами есть проблемы, часть страниц имеет неверные аттрибуты доступа, FS сегмент неверно инициализирован и т.д. правда что радует - оперативно все правят и контактируешь не с профанами из техподдержки, а напрямую с разработчиками ядра, где все проблемы быстрее разруливаются...
← →
Antoxa (2011-08-23 12:44) [18]Неужели так сложно задать начальные значения нужным переменным? Об этом сам компилятор предупреждает кстати! Лучше разговоры разводить надо это делать или нет,а потом глюки ловить в проге? Если много переменных, напиши комментарии какая для чего и будет тебе счастье ;)
← →
Dimka Maslov © (2011-08-23 13:17) [19]
> ладно, совсем делитантский вопрос - а что было в том месте
> стека?.
Адреса точек входа в функции, их локальные переменные и прочая, прочая, прочая
← →
Inovet © (2011-08-23 14:07) [20]> [19] Dimka Maslov © (23.08.11 13:17)
> Адреса точек входа в функции
Адреса возвратов.
← →
Jeer © (2011-08-23 14:41) [21]
> Inovet © (23.08.11 14:07) [20]
> Адреса возвратов.
Это смотря откуда смотреть - в пещеру или из пещеры :)
← →
DiamondShark © (2011-08-24 01:11) [22]
> Об этом сам компилятор предупреждает кстати!
Экий же он тупой, этот ваш компилятор. На предупреждения его хватает, а на инициализацию -- уже нет.
← →
Rouse_ © (2011-08-24 01:28) [23]
> DiamondShark © (24.08.11 01:11) [22]
> Экий же он тупой, этот ваш компилятор.
Поподробнее можно?
← →
Германн © (2011-08-24 01:57) [24]
> DiamondShark © (24.08.11 01:11) [22]
>
>
> > Об этом сам компилятор предупреждает кстати!
>
> Экий же он тупой, этот ваш компилятор. На предупреждения
> его хватает, а на инициализацию -- уже нет.
>
Ну если компилятор начнёт заниматься инициализацией "всегда и везде", то ...
Ну для батонокидателей это будет самое-то! А для всех прочих?
← →
Eraser © (2011-08-24 02:57) [25]> [17] Rouse_ © (22.08.11 23:42)
> Последнее время часто контактирую в разработчиками Wine,
> с некоторыми моментами есть проблемы
это да, но тем не менее последние несколько лет вайн стал куда стабильнее.
← →
Германн © (2011-08-24 03:10) [26]Может быть именно поэтому.
← →
DiamondShark © (2011-08-25 23:59) [27]
> Rouse_ © (24.08.11 01:28) [23]
> Поподробнее можно?
Можно.
Если разработчик компилятора:
1. смог из анализа текста сделать вывод о наличии неинициализированной переменной;
2. отдаёт себе отчёт в том, что это аномальный код (с логической ошибкой) -- ведь варнинг-то печатается;
3. позволяет, тем не менее, сгенерировать и запустить машинный код (заведомо неверный!),
то у разработчика абсолютно взорван мозг.
Одновременного наличия варнинга и генерации машинного кода быть не может. Может быть одно из двух:
1. Компиляция завершается с ошибкой.
2. Компилятор генерирует инициализацию.
← →
Германн © (2011-08-26 00:50) [28]
> DiamondShark © (25.08.11 23:59) [27]
> Одновременного наличия варнинга и генерации машинного кода
> быть не может. Может быть одно из двух:
> 1. Компиляция завершается с ошибкой.
> 2. Компилятор генерирует инициализацию.
>
Это ты про что?
Warning не означает наличие какой-то ошибки, которую не может разрешить компилятор. Он только предупреждает, что не уверен в том, что код скомпилированный им будет 100% рабочим.
← →
Германн © (2011-08-26 00:50) [29]
> DiamondShark © (25.08.11 23:59) [27]
> Одновременного наличия варнинга и генерации машинного кода
> быть не может. Может быть одно из двух:
> 1. Компиляция завершается с ошибкой.
> 2. Компилятор генерирует инициализацию.
>
Это ты про что?
Warning не означает наличие какой-то ошибки, которую не может разрешить компилятор. Он только предупреждает, что не уверен в том, что код скомпилированный им будет 100% рабочим.
← →
alexdn © (2011-08-26 00:54) [30]> DiamondShark © (25.08.11 23:59) [27]
> код (заведомо неверный!),
почему, ну простаивает переменная, ну и что
← →
Германн © (2011-08-26 01:06) [31]
> alexdn © (26.08.11 00:54) [30]
>
> > DiamondShark © (25.08.11 23:59) [27]
> > код (заведомо неверный!),
> почему, ну простаивает переменная, ну и что
"простаивает" переменная.
Это что-то новое! :)
← →
alexdn © (2011-08-26 01:48) [32]> Германн © (26.08.11 01:06) [31]
это я к тому что не люблю подтирать "сопли" в коде..
← →
Германн © (2011-08-26 01:54) [33]
> > Германн © (26.08.11 01:06) [31]
> это я к тому что не люблю подтирать "сопли" в коде..
>
В каком коде какие сопли?
← →
Дмитрий С © (2011-08-26 05:12) [34]
> DiamondShark © (25.08.11 23:59) [27]
>
>
Переменную можно по-разному проинициализировать, и так что компилятор не догадается. Например
program Project3;
{$APPTYPE CONSOLE}
var
A: Integer;
begin
A := A xor A;
Writeln(A);
end.
← →
Омлет © (2011-08-26 08:51) [35]> Дмитрий С © (26.08.11 05:12) [34]
Ещё можно ходить спиной вперед.
← →
Anatoly Podgoretsky © (2011-08-26 09:41) [36]> DiamondShark (25.08.2011 23:59:27) [27]
Неверно, может, а не может быть при условии ошибки ERROR, ну так код и не
генерируется.
← →
Anatoly Podgoretsky © (2011-08-26 09:43) [37]> Дмитрий С (26.08.2011 05:12:34) [34]
Неужели не догадается, что A := это инициализация?
← →
sniknik © (2011-08-26 09:52) [38]> Ещё можно ходить спиной вперед.
и как ты будешь делать защиту от "ходящих вперед"? тут же это пример почему не сработает...
вот дадут, с "легкой руки", кому нибудь разработать светофор не только показывающий состояния, для знающих правило, но предупреждающий аварии тех кто знать их не желает...
и???
← →
Омлет © (2011-08-26 10:04) [39]> sniknik © (26.08.11 09:52) [38]
> и???
И тогда можно будет всем не знать правил )
← →
sniknik © (2011-08-26 10:23) [40]что это меняет для вопроса как?
ты наверное менеджер? или в "их вере"... они тоже когда им говорят о технической невозможности реализации чего то, вместо изменения условий/логики с оставлением цели "в общем" начинают "уговаривать", типа клиент важный, мы уже договорились, и как всем будет хорошо если это сделать...
врут конечно, почти всегда, по всем пунктам, но зато, им понимать ничего не нужно, и всегда программист виноват "не захотел делать". хотя напрямую с заказчиком практически всегда находится компромисс.
← →
OW © (2011-08-26 10:38) [41]на правах Компромиса (с)
имхо, надо настройку сделать в delphi.
Чекбокс "я батонокидатель".
и все. Кажется компилятору, что правильно обнулить - пусть нулит.
Чекбокс "я батонокидатель". - > OFF - только ругается.
← →
Inovet © (2011-08-26 10:50) [42]> [27] DiamondShark © (25.08.11 23:59)
> 2. Компилятор генерирует инициализацию.
Чем её инициализировать компилятор не знает = мусор оставить?
← →
Омлет © (2011-08-26 10:50) [43]> sniknik © (26.08.11 10:23) [40]
> ты наверное менеджер?
А ты, наверное, меня неправильно понял ))
"Ещё можно ходить спиной вперед." - это была ирония в ответ на способ объявления инициализации переменной "A := A xor A;"
Т.е. так делать можно, но это будет странно, неудобно и даже опасно. Компилятор не обязан распознавать такую инициализацию как безопасную также, как и светофор не обязан стучать по голове спинойвпередходящим.
← →
sniknik © (2011-08-26 10:51) [44]OW © (26.08.11 10:38) [41]
в С так неправильным приведением типов - варнинг/ошибка... и знаешь сколько с этим проблем? (я как то вместо "нулевого" интерфейса из объекта nil получал, и кучу уверений типа "ваша дельфя нифига не понимает"). блин, единственное к чему это привело (имхо, только таких С-шников и вижу) это к полному игнору варнингов, а переключится на контроль со стороны компилятора и явную ошибку, не дает завышенная самооценка.
← →
Омлет © (2011-08-26 10:52) [45]> Inovet © (26.08.11 10:50) [42]
> Чем её инициализировать компилятор не знает
Есть соглашения. По тем же полям объекта, к примеру.
Числа - в ноль, объекты - в nil, строки - в "" и т.д.
← →
Inovet © (2011-08-26 10:53) [46]> [34] Дмитрий С © (26.08.11 05:12)
> и так что компилятор не догадается. Например
> A := A xor A;
Да кудп ему, его разработчикам сирым и убогим - они же только константы за инициализацию считают, а значёк ":=" не для их скудных умишек.
← →
OW © (2011-08-26 11:00) [47]
> sniknik © (26.08.11 10:51) [44]
> вместо "нулевого" интерфейса из объекта nil
батонокидатель не получит никак :). Он батонокидатель.
либо - либо.
Либо сам, либо готовься к возможным проблемам, доверяя все сделать компилятору самому.
Серьёзные люди конечно будут сами, но и простенькие вещи пусть будут автоматом.
Может какой {$TrustCompile+} ввести..
Пишешь, пишешь, а тут такой - оп!
{$TrustCompile-} // вряд ли дальше компилятор поймет
Пишешь, пишешь
{$TrustCompile+} // далее фигня, понять должен
← →
Inovet © (2011-08-26 11:06) [48]> [45] Омлет © (26.08.11 10:52)
> Есть соглашения. По тем же полям объекта, к примеру.
> Числа - в ноль, объекты - в nil, строки - в "" и т.д.
Ладно ещё nil можно притянуть как инициалицацию, а остальное = мусор. Никто, кроме разработчика не знает, что ему надо в качестве начальногго значения, а тут предложили вместо ворнинга инициализацию сделать - ну так компилятор тупой ведь.
← →
alexdn © (2011-08-26 11:24) [49]> OW © (26.08.11 10:38) [41]
> Чекбокс "я батонокидатель".
> и все. Кажется компилятору, что правильно обнулить - пусть
> нулит.
шедевр, Windows forms напоминает в c#
← →
Омлет © (2011-08-26 11:27) [50]> а остальное = мусор
Главное, ты будешь знать, что там изначально записано. И это удобно - избавляет от лишнего кода инициализации: 0, nil, false, "", [] - покрывают 70-80% случаев (по личному опыту). Единственное зло, по-моему - автоматическое присвоение первого значения в перечислимых enum-типах, т.к. заранее не знаешь, изменится ли оно в будущем.
А сейчас как? Проигнорировал (отключил) ворнинги - получил ошибки.
← →
Inovet © (2011-08-26 11:41) [51]> [50] Омлет © (26.08.11 11:27)
> Главное, ты будешь знать, что там изначально записано.
Как вариант может быть удобно.
> [50] Омлет © (26.08.11 11:27)
> Проигнорировал (отключил) ворнинги - получил ошибки.
ССЗБ.
Ещё. С автоинициализацией ворнингов совсем не будет по идеологии.
← →
sniknik © (2011-08-26 13:44) [52]> Ещё. С автоинициализацией ворнингов совсем не будет по идеологии.
что будет большим минусом языку... имхо. вот сколько раз разбирая варнинг натыкался на нелогичность кода, идеи, реализации... так правишь что-то, убрал "лишнее" и тут опа-не инициализированность, начинаешь подробнее смотреть, а там вообще смысл поменялся, делается не то.
а будет. нужна инициализация? вот вам автоматом в нее нулевое значение, и неважно, что тут нужно что-то вполне конкретное... или не доделано поэтому не инициализировано.
в PHP зачастую так и происходит ;(. от тех же причин.
← →
Омлет © (2011-08-26 14:05) [53]Вот как раз PHP дисциплинирует - приходится писать внимательно и вдумчиво, иначе потом полгода будешь вылавливать ошибки.
А на подсказки компилятора полагаться - путь к разгильдяйству )
← →
Anatoly Podgoretsky © (2011-08-26 15:13) [54]> Inovet (26.08.2011 10:50:42) [42]
Так она и так приницилизирована, но только не так как хочется, кстати и
компилятор тоже не знает этого.
← →
Anatoly Podgoretsky © (2011-08-26 15:17) [55]> Омлет (26.08.2011 11:27:50) [50]
70-80% компилятор не устраивает, да и вообще это игру в рулетку напоминает,
мол на 80% все правильно,
а так zero (не ноль) в пользу комилятора
← →
sniknik © (2011-08-26 15:36) [56]> Вот как раз PHP дисциплинирует - приходится писать внимательно и вдумчиво
да вот что то не видно у них особой дисциплины... наоборот "нафига следить? оно само и объявит и про инициализирует и тип определит"... а у меня, где варнинги есть, есть и слежение чтобы их не было, а значит и не было не логичностей/ не определенности в коде.
т.е. вижу не дисциплину, а "с глаз долой из сердца вон".
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.005 c