Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Инициализация полей структурных констант по умолчанию / 25 сообщений из 49, страница 1 из 2
04.10.2021, 15:07
    #40101819
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Подскажите, где прочитать про то, что они инициализируются нулями. Нигде не нашёл, а хочется уверенности.

Я вот о чем.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
type
  TRec = record
    a: Integer;
    b: Integer;
    c: Integer;
    c1: Integer;
    c2: Integer;
    c3: Integer;
    c4: Integer;
    c5: Integer;
    c6: Integer;
    d: Integer;
  end;

procedure TForm1.Button5Click(Sender: TObject);
const
  a: Array[ 1 .. 15 ] of TRec = (
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 ),
    ( a: 1 )
  );
var
  i, j: Integer;
  S: String;
begin
  Memo1.Lines.Clear;

  for i := Low( a ) to High( a ) do begin
    S := '';
    for j := 0 to sizeof( TRec ) - 1 do
      S := S + IntToHex( Byte( PAnsiChar( @a[ i ] )[ j ] ), 2 ) + ' ';

    Memo1.Lines.Add( S );
  end;
end;


Выводит всегда все нули (кроме младшего байта, как явно указано мною при объявлении константы)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Т.е. как будто заливка нулями по умолчанию есть. Пробовал извращаться, посредине пропускать - всегда так.
Но, блин, где прочитать про этот эффект, чтобы не бояться использовать?
...
Рейтинг: 0 / 0
04.10.2021, 15:48
    #40101831
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
YuRock> Подскажите, где прочитать про то, что они инициализируются нулями.

Declaring variables, в конце.
Там упомянуто и отличие
локальных и глобальных
переменных в этом плане.


YuRock> Нигде не нашёл, а хочется уверенности.

Я бы не закладывался.
Инициализируй всё сам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.10.2021, 15:59
    #40101835
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
YuRock,

Исходи из того, что типизированные константы это, по сути, глобальные переменные (имено поэтому они не могут участвовать в константных выражениях). Ну а глобалтные переменные всегда инициализируются нулём.
...
Рейтинг: 0 / 0
04.10.2021, 16:01
    #40101838
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Гаджимурадов Рустам,

Ничего я не нашел там, кроме отличия локальных и глобальных, которое и так понятно.
Но спасибо, тоже не знал, где это написано.

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.


Но дело тут не в этом. У меня в данном примере, кстати, локальная переменная (вернее, даже не переменная, а константа).
И она инициализируется таки нулями, если не указать явно другого.
Вот про это не могу найти.

Нашел только, что все поля структурной константы должны быть перечислены.
The fields must be listed in the order in which they appear in the record type declaration, and the tag field, if there is one, must have a value specified

Ну, так тому и быть.

Гаджимурадов Рустам
Я бы не закладывался


Да, придется, видимо, не закладываться.
...
Рейтинг: 0 / 0
04.10.2021, 16:02
    #40101839
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Kazantsev Alexey
Исходи из того, что типизированные константы это, по сути, глобальные переменные
Ну вот не вижу я этой сути. Если бы было написано об этом где-то - было бы ок.
...
Рейтинг: 0 / 0
04.10.2021, 16:09
    #40101844
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
YuRock
Ну вот не вижу я этой сути. Если бы было написано об этом где-то - было бы ок.

Ну ты же в курсе, что в дельфях есть такая е#анина, как изменяемые типизированные константы (writeable typed constants)? И эту хрень можно включать и выключать директивой компилятора. Теперь немного подумать и...
...
Рейтинг: 0 / 0
04.10.2021, 16:21
    #40101848
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Kazantsev Alexey
YuRock
Ну вот не вижу я этой сути. Если бы было написано об этом где-то - было бы ок.

Ну ты же в курсе, что в дельфях есть такая е#анина, как изменяемые типизированные константы (writeable typed constants)? И эту хрень можно включать и выключать директивой компилятора. Теперь немного подумать и...
Да, я знаю, и естественно понять, что адреса у таких констант глобальные (как и у любых констант).
Но это ни разу меня не убеждает, что они инициализируются нулями так же, как гл. переменные.

Хотя вот написано:
if the {$J+} compiler directive is in effect, typed constants can have new values assigned to them; they behave essentially like initialized variables.

Но я не хочу {$J+}.
А при {$J-} они ведут себя просто как read-only variables

Мне этого не достаточно для успокоения.
...
Рейтинг: 0 / 0
04.10.2021, 16:29
    #40101852
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Если хочешь покоя, то просто прими, что любая неинициализированная переменная
или её часть - источник потенциального геморроя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.10.2021, 16:41
    #40101856
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
YuRock
Но я не хочу {$J+}.
А при {$J-} они ведут себя просто как read-only variables

Директива не изменяет физического воплощения типизированных констант, она просто разрешает или запрещает их изменять.

Вот наглядный пример, что типизированные константы это глобальные переменные:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
uses
  System.Types;

const
 a : TPoint = ();
 b = 56;
begin
 writeln(nativeint(@a)); // OK
 writeln(nativeint(@b)); // error here
end.
...
Рейтинг: 0 / 0
04.10.2021, 17:00
    #40101862
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Kazantsev Alexey
Вот наглядный пример, что типизированные константы это глобальные переменные:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
uses
  System.Types;

const
 a : TPoint = ();
 b = 56;
begin
 writeln(nativeint(@a)); // OK
 writeln(nativeint(@b)); // error here
end.

Этот пример иллюстрирует только то, что у типизированных констант есть постоянный адрес, как у глобальных переменных. Не более того.
...
Рейтинг: 0 / 0
04.10.2021, 17:03
    #40101864
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Dimitry Sibiryakov
Если хочешь покоя, то просто прими, что любая неинициализированная переменная
или её часть - источник потенциального геморроя.
Да, я так и поступаю обычно.
Но, блин, задача такова, что нужно сделать огромный константный массив структур, у каждой из которых - гора полей, большинство из которых хотелось бы оставить нулями (в зависимости от типа).
Конкретнее - это дерево настроек (коих тысячи, с разными типами, свойствами и ограничениями).
Очень бы было удобно использовать эту фичу.
...
Рейтинг: 0 / 0
04.10.2021, 17:09
    #40101866
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Копи-паст - тоже удобная фича в данном случае. Достаточно написать одну полную
инициализацию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.10.2021, 17:19
    #40101874
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Что-то вы уж очень загоняетесь. Может, еще и все поля в объекте занулять? Частично заданная структурная константа - значит, все пропущенные поля нулевые. Иначе можно дойти до чего-то вроде
foo := 1;
if foo <> 1 then
foo := 1;
...
Рейтинг: 0 / 0
04.10.2021, 17:23
    #40101877
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Dimitry Sibiryakov
Копи-паст - тоже удобная фича в данном случае. Достаточно написать одну полную
инициализацию.
До поры до времени удобная.
А когда, внезапно, приходится добавлять еще одно поле в структуру - придется перелопачивать весь массив вместо того, чтобы указать его только там, где надо.
...
Рейтинг: 0 / 0
04.10.2021, 17:27
    #40101880
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Fr0sT-Brutal
Может, еще и все поля в объекте занулять?
1. Про это явно написано в документации (лень искать, но видел, честно).
2. Можно посмотреть метод TObject.InitInstance, в котором первой строкой идет
Код: pascal
1.
FillChar(Instance^, InstanceSize, 0);

чтобы точно понять, что занулять поля в объекте не надо.

Fr0sT-Brutal
Частично заданная структурная константа - значит, все пропущенные поля нулевые.
В сях вроде да, значит, и это описано где-то. Вот про паскаль бы найти такую фразу, кроме как на форумах.
...
Рейтинг: 0 / 0
04.10.2021, 17:49
    #40101890
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
YuRockпридется перелопачивать весь массив вместо того, чтобы указать его только там,
где надо.

Search-and-Replace запустить, конечно, трудно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.10.2021, 18:06
    #40101893
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
YuRock
Этот пример иллюстрирует только то, что у типизированных констант есть постоянный адрес, как у глобальных переменных.

И это значит, что они являются глобальными переменными. А глобальные переменные зануляются. Так-то в доке вообще не сказано, что поля при инициализации можно опускать :) Об этом ещё можно запариться.
...
Рейтинг: 0 / 0
04.10.2021, 18:08
    #40101895
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
04.10.2021 18:06, Kazantsev Alexey пишет:
> Так-то в доке вообще не сказано, что поля при инициализации можно опускать

сказано.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.10.2021, 18:09
    #40101896
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Fr0sT-Brutal
Что-то вы уж очень загоняетесь. Может, еще и все поля в объекте занулять? Частично заданная структурная константа - значит, все пропущенные поля нулевые. Иначе можно дойти до чего-то вроде
foo := 1;
if foo <> 1 then
foo := 1;
Давно дошли: народ говорил, что без такого в Lotus Notes не жизнь.
...
Рейтинг: 0 / 0
04.10.2021, 18:23
    #40101901
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Мимопроходящий
сказано.

Ссылочку?
...
Рейтинг: 0 / 0
04.10.2021, 19:15
    #40101909
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Kazantsev Alexey
Мимопроходящий
сказано.

Ссылочку?
Да, мне тоже интересно.
Так-то я нашел пока-что, что поля должны быть инициализированы в порядке полей структуры.
Но я не нашел ни разрешения пропуска, ни указания, что пропуск параметров запрещен.
...
Рейтинг: 0 / 0
04.10.2021, 21:03
    #40101920
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
YuRock
Но я не нашел ни разрешения пропуска, ни указания, что пропуск параметров запрещен.

Про запрет пропуска нет, но есть: "specify the value of each field - as fieldName: value, with the field assignments separated by semicolons".
...
Рейтинг: 0 / 0
04.10.2021, 21:16
    #40101926
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Kazantsev Alexey
YuRock
Но я не нашел ни разрешения пропуска, ни указания, что пропуск параметров запрещен.

Про запрет пропуска нет, но есть: "specify the value of each field - as fieldName: value, with the field assignments separated by semicolons".
Странно, этого я не нашел (6-я версия).
...
Рейтинг: 0 / 0
04.10.2021, 21:18
    #40101927
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
Зачем тогда вообще такое разрешать? Кидал бы ошибку компилятор, да и всё.
...
Рейтинг: 0 / 0
04.10.2021, 21:21
    #40101929
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация полей структурных констант по умолчанию
YuRock
Этот пример иллюстрирует только то, что у типизированных констант есть постоянный адрес, как у глобальных переменных. Не более того.
Этот пример иллюстрируют то, что они не в стеке, а в области данных. А она изначально всегда обнулена.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Инициализация полей структурных констант по умолчанию / 25 сообщений из 49, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]