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,eax
cld ;снять флаг 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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22