Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1314339664
dj kondakov
2011-08-26 10:21
2011.12.11
Дождаться завершения потока


15-1313656363
OW
2011-08-18 12:32
2011.12.11
DeDe - реально декомпилировать, поправить и перекомпилировать?


15-1314044999
Юрий
2011-08-23 00:29
2011.12.11
С днем рождения ! 23 августа 2011 вторник


2-1314186301
Lamer6666
2011-08-24 15:45
2011.12.11
Проверка существования почтового ящика.


4-1242382646
Игорь
2009-05-15 14:17
2011.12.11
Функция IsProcessInJob в Windows 2000





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский