Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 29.06.2012, 21:30
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 297
Репутация: -1806
По умолчанию

Цитата:
Сообщение от ined
Во всех известных версиях Delphi действует следующая не совсем документированная фишка (разработчики в документации к одной из версий сказали, что это так, но в будущей версии может и не быть. Но пока есть): Все глобальные переменные автоматически иницилизируются (нулём или пустым значением).
А вот локальные переменные - не иницилизируются.
очередная херь про расчудесные недокументированные фишки...
это описано в хелпе в разделе "Declaring variables" во всех версиях дельфи, без всяких "может быть пока"
и соответственно в книгах "Делфи для чайников" тоже, прочти уже хоть одну
Ответить с цитированием
  #17  
Старый 29.06.2012, 23:14
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от ined
Все глобальные переменные автоматически иницилизируются (нулём или пустым значением).
А вот локальные переменные - не иницилизируются.
это вообще-то все знают...
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #18  
Старый 30.06.2012, 06:59
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Ну вот видите, я не знал.

У меня две книги, и наверно я просто не натыкался на эту информацию.
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #19  
Старый 30.06.2012, 08:37
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Вот над чем сей час я работаю, просто так для себя.
Код:
unit MWrite;

interface

uses
windows;

type


TMWrite = class
  private
   Pb:PByte;
   Adres    : pointer ;
   EndAdres : pointer ;
   Index    : pointer ;
   MSize    : cardinal;
  public
   constructor Create(Size:cardinal=1); overload;
   procedure Free;
   procedure NullMem;
   procedure BlockWrite(P:pointer;Size:cardinal);
   procedure TransitionIndex(Position:cardinal=0); overload;
   procedure ChangeLengthMemory(NewSize:cardinal);
   function OutMem:pointer;
   Function SaveToFile(NameFile:string):boolean;
   Function SaveToFileAnIndex(NameFile:string):boolean;
   destructor Destroy;
end;



implementation

var BoolMem: boolean = false;

{$region 'CopiPtoPP'}
procedure CopiPtoPP(Source:pointer; Receiver:pointer; Size:cardinal);
begin
  asm
    pushad
    mov esi,Source
    mov edi,Receiver
    mov ecx,Size
    cld
rep movsb
    popad
  end;
end;
{$endregion}

{$region 'Pinc'}
procedure incP(var P:pointer; d:cardinal=1); overload;
begin
  asm
   pushad
   mov eax,p
   add eax,d
   mov p,eax
   popad
  end;
end;
{$endregion}

procedure MemNull(p:pointer;Size:cardinal);
begin
  asm
    pushad
    mov eax,0
    mov edi,p
    mov ecx,Size
    cld
rep movsb
    popad
  end;

end;

{ TMWrite }

procedure TMWrite.BlockWrite(P: pointer; Size: cardinal);
begin
 if ((cardinal(Index)+ Size) > cardinal(EndAdres)) then ChangeLengthMemory(MSize+Size-cardinal(EndAdres)-cardinal(Index));

 CopiPtoPP(P,Index,Size);
 incP(Index,Size);
 if (cardinal(Index) > cardinal(EndAdres)) then MessageBox(0,'Выход за пределы распределённой памяти'+#10+#13+#10+#13+
                                       'Exit out of limits of the distributed memory','Warning',MB_OK or MB_ICONERROR);

end;

procedure TMWrite.ChangeLengthMemory(NewSize: cardinal);
var p:pointer; TPos:cardinal;
begin
  if NewSize = 0 then begin MessageBox(0,'Длина не может быть - ''0'''+#10+#13+#10+#13+
                                   'The length can''t be - ''0''','Warning',MB_OK or MB_ICONERROR);
                            exit;
                      end;
  GetMem(p,NewSize);
  if NewSize > MSize then
          begin
            CopiPtoPP(Adres,p,MSize);
            TPos:=cardinal(Index)-cardinal(Adres);
            Index:=pointer(cardinal(p)+TPos);
            FreeMem(Adres,MSize);
            Adres:=p;
            MSize:=NewSize;

          end else
               begin
                 CopiPtoPP(Adres,p,NewSize);
                 FreeMem(Adres,MSize);
                 Adres:=p;
                 Index:=p;
                 MSize:=NewSize;
               end;
   EndAdres:=pointer(cardinal(Adres)+MSize-1)

end;

constructor TMWrite.Create(Size: cardinal);
begin
 inherited create;
 if Size = 0 then
      begin
         MessageBox(0,'Длинна не может быть - ''0'''+#10+#13+#10+#13+
                      'Be long can''t - ''0''','Warning',MB_OK or MB_ICONERROR);
         exit;
      end;
  if Assigned(Adres) then free;
  BoolMem:=true;
  GetMem(Adres,Size);
  MemNull(Adres,Size);
  Index:=Adres;
  MSize:=Size;
  EndAdres:=pointer(cardinal(Adres)+Size-1);
end;

destructor TMWrite.Destroy;
begin
Free;
 inherited Destroy;
end;

procedure TMWrite.Free;
begin
if not Assigned(Adres) then exit;
FreeMem(Adres,MSize);
Adres:=nil;
Index:=nil;
EndAdres:=nil;
MSize:=0;
BoolMem:=False;
end;

procedure TMWrite.NullMem;
begin
 MemNull(Adres,MSize);
 Index:=Adres;
end;

function TMWrite.OutMem: pointer;
begin
result:=Adres;
end;

function TMWrite.SaveToFile(NameFile: string): boolean;
var F:file;
begin
 AssignFile(f,NameFile);
 Rewrite(f,1);
 system.BlockWrite(f,Adres^,MSize);
 CloseFile(f);
 ///
end;

function TMWrite.SaveToFileAnIndex(NameFile: string): boolean;
var F:file;
begin
AssignFile(f,NameFile);
 Rewrite(f,1);
 system.BlockWrite(f,Adres^,cardinal(Index)-cardinal(Adres));
 CloseFile(f);
end;

procedure TMWrite.TransitionIndex(Position: cardinal);
begin
 if Position >= MSize then
      begin
         MessageBox(0,'Выход за пределы распределённой памяти'+#10+#13+#10+#13+
                      'Exit out of limits of the distributed memory','Warning',MB_OK or MB_ICONERROR);
         exit;
      end;
 Index:=pointer(cardinal(Adres)+Position);
end;

end.
Он ещё не доведён до ума, так сказать, черновик.
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #20  
Старый 30.06.2012, 09:30
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Посаветуйте, что тут можно добавить или убрать.
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #21  
Старый 30.06.2012, 09:35
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Советую сделать свой менеджер памяти и все.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #22  
Старый 30.06.2012, 09:54
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Советую сделать свой менеджер памяти и все.
А есть сомнения, что этот модуль не я написал?
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #23  
Старый 30.06.2012, 15:02
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Дак не, я имею ввиду, что выделение памяти пропускать через свою ф-ю, которая будет вести список выделенной/освобожденной памяти, т.о. все указатели, которые не в списке - левые, а те, которые в диапазонах - валидные.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #24  
Старый 30.06.2012, 15:39
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Вроде получилось нормально выложил
сюда
__________________
11011111 INED Home code
VK
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:24.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025