powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Инициализация полей структурных констант по умолчанию
25 сообщений из 49, страница 1 из 2
Инициализация полей структурных констант по умолчанию
    #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
Инициализация полей структурных констант по умолчанию
    #40101831
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock> Подскажите, где прочитать про то, что они инициализируются нулями.

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


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

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

Исходи из того, что типизированные константы это, по сути, глобальные переменные (имено поэтому они не могут участвовать в константных выражениях). Ну а глобалтные переменные всегда инициализируются нулём.
...
Рейтинг: 0 / 0
Инициализация полей структурных констант по умолчанию
    #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
Инициализация полей структурных констант по умолчанию
    #40101839
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Исходи из того, что типизированные константы это, по сути, глобальные переменные
Ну вот не вижу я этой сути. Если бы было написано об этом где-то - было бы ок.
...
Рейтинг: 0 / 0
Инициализация полей структурных констант по умолчанию
    #40101844
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Ну вот не вижу я этой сути. Если бы было написано об этом где-то - было бы ок.

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

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

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

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

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

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

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

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

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

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


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