enot777 писал(а):Компилятор вас не может обманывать.
Распечатайте, код ассемблера , из примера ТС, в котором компилятор обнуляет массив и приведите, в качестве подтверждения.
Есть в ASM код обнуления массива или вы всё таки заблуждаетесь?
.
Модератор: Модераторы
enot777 писал(а):Компилятор вас не может обманывать.

{$mode objfpc}
type
  TA = array [low(word)..high(word)] of integer;
var
  a: TA;
  i: cardinal;
begin
  for i:=low(a) to high(a) do write(a[i],#32);
  readln;
end.
vitaly_l писал(а):такая приблуда ненужного принудительного обнуления - тормознёт в два раза любую программу. Вы явно заблуждаетесь.

Лекс Айрин писал(а):Если я правильно помню PE EXE формат, то все инициализированные значения хранятся в отдельном разделе и он целиком загружается в память.. Т. е накладных расходов фактически нет.
enot777 писал(а):Ну да, не более чем 2 byte индекс (2^16=65536), иначе ошибка: слишком большой диапазон у массива.

vitaly_l писал(а):Это всё должо быть прописано в ASM коде.

Лекс Айрин писал(а):Оно прописано. Только без кучи справочников, блокнота и океана времени ты его не найдешь. А найдя, с большой долей вероятности не переведешь обратно в паскалевский код. При этом надо еще учитывать настройку сегментов при загрузке программы и пр... и пр... ах да... некоторые команды превращаются в данные. И как раз инициализации они и касаются.
program ex;
const a=10;
type
  arr=array[1..a] of integer;
var
  b : arr;
  element : integer;
  i, j, isFound : integer;
Begin
  for i:=1 to a do
    begin
      repeat
         Write( Utf8ToAnsi('Введите '),i,Utf8ToAnsi('-й элемент: ') );
         ReadLn(element);
         isFound := 0;
         for j:=1 to i do
           if b[j]=element then begin
               isFound:=1;
               Break;
           end;
           if isFound=1 then WriteLn(Utf8ToAnsi('Введённое значение уже есть в массиве. Вводите ещё раз!'),b[j])
      until isFound=0;
      b[i] := element;
      WriteLn(Utf8ToAnsi('Ведено новое значение'),b[i]);
  end;
end.    

for j:=1 to i-1 do  FillChar(V, SizeOf(V), 0);
enot777 писал(а):Про TP3 не скажу, а такая программа на TP7 выведет на экран нули
function TStack.Get: _T;
var
   Buf: _T;
begin
   if Counter>0 then
      Result := Top^.Data
   else
   begin
      //FillChar(Buf, SizeOf(_T), #0);
      Result := Buf;
   end;
end;
     function TStack.Get: _T;
begin
   if Counter>0 then
      Result := Top^.Data;
end;function TStack.Get: _T;
begin
      Result := Top^.Data;
end;stack.pas(77,11) Warning: Локальная пеpеменная "i" не инициализиpована
beria писал(а):Или в пределе, ну ежели статические переменные всегда заполняются нулем, ежели не используются... Хотя это уж совсем бред.

vitaly_l писал(а):Компилируем с -Al и смотрим. Обнуляет или нет?
dim1 db  150 dup (0) vitaly_l писал(а):потому что, принудительное бесконтрольное обнуление - это слишком затратная процедура, при больших массивах.
xor eax,eaxcld ;снять флаг DF
mov di, [адрес_массива]
mov cx, размер_массива
sub al, al ;обнуляем записываемый байт 
rep stosb ;обнуляем массив байтов
Лекс Айрин писал(а):И будет твое обновление выглядеть как

vitaly_l писал(а): В коде ассемблера при создании глобальных переменных принудительно присваивается ноль или нет?
vitaly_l писал(а):Если ответ "ДА" - значит нужно писать в баг-трекер, т.к. компилятор врёт, что 0 не инициализирован, т.к. 0 - это инициализированная переменная.
vitaly_l писал(а):Если ответ "НЕТ" - то многим программистам, которые: нагло не инициализируют переменные - имеет смысл пересмотреть свой код.
program project1;
var
  arr:array[1..10] of integer;
begin
end.
.section .bss
   .balign 4
# [3] arr:array[1..10] of integer;
U_$P$PROJECT1_$$_ARR:
   .zero 40
   .file "project1.lpr"
# Begin asmlist al_procedures
.section .text.n__main,"x"
   .balign 16,0x90
.globl   PASCALMAIN
PASCALMAIN:
.globl   _main
_main:
# [project1.lpr]
# [4] begin
   pushl   %ebp
   movl   %esp,%ebp
   call   FPC_INITIALIZEUNITS
# [5] end.
   call   FPC_DO_EXIT
   leave
   ret
# End asmlist al_procedures
# Begin asmlist al_globals
.section .bss
   .balign 4
# [3] arr:array[1..10] of integer;
U_$P$PROJECT1_$$_ARR:
   .zero 40
.section .data.n_INITFINAL,"d"
   .balign 4
.globl   INITFINAL
INITFINAL:
   .long   3,0
   .long   INIT$_$SYSTEM
   .long   0
   .long   INIT$_$FPINTRES
   .long   0,0
   .long   FINALIZE$_$OBJPAS
.section .data.n_FPC_THREADVARTABLES,"d"
   .balign 4
.globl   FPC_THREADVARTABLES
FPC_THREADVARTABLES:
   .long   1
   .long   THREADVARLIST_$SYSTEM
.section .data.n_FPC_RESOURCESTRINGTABLES,"d"
   .balign 4
.globl   FPC_RESOURCESTRINGTABLES
FPC_RESOURCESTRINGTABLES:
   .long   0
.section .data.n_FPC_WIDEINITTABLES,"d"
   .balign 4
.globl   FPC_WIDEINITTABLES
FPC_WIDEINITTABLES:
   .long   0
.section .data.n_FPC_RESSTRINITTABLES,"d"
   .balign 4
.globl   FPC_RESSTRINITTABLES
FPC_RESSTRINITTABLES:
   .long   0
.section .fpc.n_version
   .balign 16
   .ascii   "FPC 3.0.0 [2015/11/16] for i386 - Win32"
.section .data.n___heapsize,"d"
   .balign 4
.globl   __heapsize
__heapsize:
   .long   0
.section .data.n___fpc_valgrind,"d"
.globl   __fpc_valgrind
__fpc_valgrind:
   .byte   0
# End asmlist al_globals

Warning: Variable "arr" does not seem to be initialized
program project1;
var
  s:string;
begin
  if s<>'' then
    readln;
end.project1.lpr(5,6) Warning: Variable "s" of a managed type does not seem to be initialized
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1