powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Вопросы по IT / Русская смекалка в IT
9 сообщений из 9, страница 1 из 1
Русская смекалка в IT
    #770459
Droog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу поделиться такими идеями (для Delphi):

1)
Я ставил в коде todo, но убедился что не так просто пользоваться этими тегами – туды они бывают разные) Поэтому я стал использовать более сложные названия, например такие:

TODOSOON
TOREMOVEAFTERDEBUG

По названию понятно что они означают. А чтобы не напутать буквы в этих словах (т.к. нужно чтобы их всегда находил автопоиск по проекту), я сделал такие константы в одном из базовом (или как их называть, глобальных или низовых) модулей:

const

ToRemoveAfterBackup=false;
ToDoSoon=false;

Теперь в коде я набираю ToRe, нажимаю Ctrl+пробел и получаю полное имя, после чего уже это имя комментирую.

2) Ещё у меня есть пустая процедура dbnop – иногда она нужна чтобы поставить брекпоинт на пустом месте.

3) Я до недавнего времени не знал что такое ассерт, поэтому использовал вместо него собственную процедуру (в таком же низовом модуле). Так вот, стандартный ассерт лучше заменить на такой:
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure MyAssertProc(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
var
  str:string;
  strprogname:string;
begin
  str:='Algorithm assert error: ';
  str:=str+message;
  str:=str+' line '+inttostr(linenumber);

  strprogname:=application.Name;
  application.MessageBox(pchar(str),pchar(strprogname));

  dbnop; //Для брейкпоинта
end;

...
begin//Начало работы программы
AssertErrorProc := MyAssertProc;
Это пока то, чем я могу сейчас быстро поделиться, а так вообще у меня масса новых идей.
...
Рейтинг: 0 / 0
Русская смекалка в IT
    #770464
Tayfur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я в Colobot вместо стандартной drop () использую своё:
Код: C++
1.
2.
3.
4.
void object::dropAnyway (){
  while (0 != drop ())
    goto (space ());
}
Это если нужно просто освободить руку бота.
...
Изменено: 30.11.2018, 07:55 - Tayfur
Рейтинг: 0 / 0
Русская смекалка в IT
    #773792
Droog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю угадать, что делает этот код (и для чего он нужен):
Спойлер
Код: Delphi
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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
type

TSafeObject=class
public
  constructor Create;
  destructor Destroy; override;
end;

TGarbageCollector=class
private
  FObjects:tlist;
  FObjectsSaved:tlist;
  FSaveRepFileName:tfilename;
  FReport:tstringlist;
  FSectionStarted:boolean;
  FSectionsCount:integer;
  FTwiceDestroyedObjectsCount:integer;
  FTotalObjectsNotDestroyedCount:integer;
  FTotalTwiceDestroyedObjectsCount:integer;
public
  procedure StartSection;
  procedure FinishSection;
  procedure ObjectCreated(obj:tsafeobject);
  procedure ObjectDestroyed(obj:tsafeobject);
  constructor Create(repfilename:tfilename);
  procedure FinalizeReport;
  procedure WriteReportToFile;
  destructor Destroy; override;
end;

var
ProjectGarbageCollector:TGarbageCollector;

implementation

{ TSafeObject }

constructor TSafeObject.Create;
begin
  inherited;
  if GarbageCollectorActive then begin
    ProjectGarbageCollector.ObjectCreated(self);
  end;
end;

destructor TSafeObject.Destroy;
begin
  if GarbageCollectorActive then ProjectGarbageCollector.ObjectDestroyed(self);
  inherited;
end;

{ TGarbageCollector }

constructor TGarbageCollector.Create(repfilename:tfilename);
begin
  fobjects:=tlist.Create;
  FObjectsSaved:=tlist.Create;
  freport:=tstringlist.Create;
  if RepFileName='' then RepFileName:=extractfilepath(application.ExeName)+'garbreport.txt';

  FSaveRepFileName:=repfilename;
end;

destructor TGarbageCollector.Destroy;
begin
  if GarbageCollectorActive then begin
    WriteReportToFile;
  end;
  fobjects.Free;
  FObjectsSaved.Free;
  FReport.Free;
  inherited;
end;

procedure TGarbageCollector.FinalizeReport;
begin
  if FSectionStarted then freport.Add('Started section not ended!');
  freport.Add('Total:');
  freport.Add(inttostr(FSectionsCount)+' sections.');
  freport.Add(inttostr(FTotalObjectsNotDestroyedCount)+' objects not destroyed.');
  freport.Add(inttostr(FTotalTwiceDestroyedObjectsCount)+' objects destroyed twice.');
end;

procedure TGarbageCollector.FinishSection;
var
  q:integer;
  curstr:string;
  curobject:tobject;
  curoldnum:integer;
begin
  if not FSectionStarted then assert(false,'Section must have been already started.');

  curstr:='section finished: '+inttostr(FObjects.Count)+' objects remaining';
  if fobjects.Count>0 then curstr:=curstr+':' else curstr:=curstr+'.';
  freport.Add(curstr);

  curstr:=inttostr(FTwiceDestroyedObjectsCount)+' objects which were possibly destroyed twice were found.';
  freport.Add(curstr);

  for q:=0 to min(FObjects.Count-1,100) do begin
    curobject:=fobjects[q];
    curoldnum:=FObjectsSaved.IndexOf(curobject);
    curstr:=inttostr(curoldnum)+': '+curobject.ClassName;
    freport.Add(curstr);
  end;

  FTotalObjectsNotDestroyedCount:=FTotalObjectsNotDestroyedCount+fobjects.Count;
  FTotalTwiceDestroyedObjectsCount:=FTotalTwiceDestroyedObjectsCount+FTwiceDestroyedObjectsCount;

  FSectionStarted:=false;
end;

procedure TGarbageCollector.ObjectCreated(obj: tsafeobject);
begin
  FObjects.Add(obj);
  fobjectssaved.Add(obj);
end;

procedure TGarbageCollector.ObjectDestroyed(obj: tsafeobject);
var
  objnum:integer;
begin
  objnum:=fobjects.IndexOfItem(obj,fromend);
  if objnum=-1 then begin
  inc(FTwiceDestroyedObjectsCount); exit;
end;
  FObjects.Delete(objnum);
end;

procedure TGarbageCollector.StartSection;
begin
  if FSectionStarted then assert(false,'Section must have not been already started.');

  inc(fsectionscount);

  freport.Add('Section N'+inttostr(fsectionscount)+' started.');
  FObjects.clear;
  FObjectsSaved.Clear;
  FSectionStarted:=true;
  FTwiceDestroyedObjectsCount:=0;
end;

procedure TGarbageCollector.WriteReportToFile;
begin
  FinalizeReport;
  freport.SaveToFile(FSaveRepFileName);
end;

initialization
begin
  ProjectGarbageCollector:=TGarbageCollector.Create('');
end;

finalization
begin
  ProjectGarbageCollector.Free;
end;

end.
...
Рейтинг: 0 / 0
Русская смекалка в IT
    #773808
Tayfur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Droog  01.12.2018, 09:37
Предлагаю угадать, что делает этот код (и для чего он нужен):
Не для того я в токари пошёл.
...
Рейтинг: 1 / 0
Нравится: Владайка
Русская смекалка в IT
    #776358
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
Droog  01.12.2018, 09:37
Предлагаю угадать, что делает этот код (и для чего он нужен):
Спойлер
Код: Delphi
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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
type

TSafeObject=class
public
  constructor Create;
  destructor Destroy; override;
end;

TGarbageCollector=class
private
  FObjects:tlist;
  FObjectsSaved:tlist;
  FSaveRepFileName:tfilename;
  FReport:tstringlist;
  FSectionStarted:boolean;
  FSectionsCount:integer;
  FTwiceDestroyedObjectsCount:integer;
  FTotalObjectsNotDestroyedCount:integer;
  FTotalTwiceDestroyedObjectsCount:integer;
public
  procedure StartSection;
  procedure FinishSection;
  procedure ObjectCreated(obj:tsafeobject);
  procedure ObjectDestroyed(obj:tsafeobject);
  constructor Create(repfilename:tfilename);
  procedure FinalizeReport;
  procedure WriteReportToFile;
  destructor Destroy; override;
end;

var
ProjectGarbageCollector:TGarbageCollector;

implementation

{ TSafeObject }

constructor TSafeObject.Create;
begin
  inherited;
  if GarbageCollectorActive then begin
    ProjectGarbageCollector.ObjectCreated(self);
  end;
end;

destructor TSafeObject.Destroy;
begin
  if GarbageCollectorActive then ProjectGarbageCollector.ObjectDestroyed(self);
  inherited;
end;

{ TGarbageCollector }

constructor TGarbageCollector.Create(repfilename:tfilename);
begin
  fobjects:=tlist.Create;
  FObjectsSaved:=tlist.Create;
  freport:=tstringlist.Create;
  if RepFileName='' then RepFileName:=extractfilepath(application.ExeName)+'garbreport.txt';

  FSaveRepFileName:=repfilename;
end;

destructor TGarbageCollector.Destroy;
begin
  if GarbageCollectorActive then begin
    WriteReportToFile;
  end;
  fobjects.Free;
  FObjectsSaved.Free;
  FReport.Free;
  inherited;
end;

procedure TGarbageCollector.FinalizeReport;
begin
  if FSectionStarted then freport.Add('Started section not ended!');
  freport.Add('Total:');
  freport.Add(inttostr(FSectionsCount)+' sections.');
  freport.Add(inttostr(FTotalObjectsNotDestroyedCount)+' objects not destroyed.');
  freport.Add(inttostr(FTotalTwiceDestroyedObjectsCount)+' objects destroyed twice.');
end;

procedure TGarbageCollector.FinishSection;
var
  q:integer;
  curstr:string;
  curobject:tobject;
  curoldnum:integer;
begin
  if not FSectionStarted then assert(false,'Section must have been already started.');

  curstr:='section finished: '+inttostr(FObjects.Count)+' objects remaining';
  if fobjects.Count>0 then curstr:=curstr+':' else curstr:=curstr+'.';
  freport.Add(curstr);

  curstr:=inttostr(FTwiceDestroyedObjectsCount)+' objects which were possibly destroyed twice were found.';
  freport.Add(curstr);

  for q:=0 to min(FObjects.Count-1,100) do begin
    curobject:=fobjects[q];
    curoldnum:=FObjectsSaved.IndexOf(curobject);
    curstr:=inttostr(curoldnum)+': '+curobject.ClassName;
    freport.Add(curstr);
  end;

  FTotalObjectsNotDestroyedCount:=FTotalObjectsNotDestroyedCount+fobjects.Count;
  FTotalTwiceDestroyedObjectsCount:=FTotalTwiceDestroyedObjectsCount+FTwiceDestroyedObjectsCount;

  FSectionStarted:=false;
end;

procedure TGarbageCollector.ObjectCreated(obj: tsafeobject);
begin
  FObjects.Add(obj);
  fobjectssaved.Add(obj);
end;

procedure TGarbageCollector.ObjectDestroyed(obj: tsafeobject);
var
  objnum:integer;
begin
  objnum:=fobjects.IndexOfItem(obj,fromend);
  if objnum=-1 then begin
  inc(FTwiceDestroyedObjectsCount); exit;
end;
  FObjects.Delete(objnum);
end;

procedure TGarbageCollector.StartSection;
begin
  if FSectionStarted then assert(false,'Section must have not been already started.');

  inc(fsectionscount);

  freport.Add('Section N'+inttostr(fsectionscount)+' started.');
  FObjects.clear;
  FObjectsSaved.Clear;
  FSectionStarted:=true;
  FTwiceDestroyedObjectsCount:=0;
end;

procedure TGarbageCollector.WriteReportToFile;
begin
  FinalizeReport;
  freport.SaveToFile(FSaveRepFileName);
end;

initialization
begin
  ProjectGarbageCollector:=TGarbageCollector.Create('');
end;

finalization
begin
  ProjectGarbageCollector.Free;
end;

end.
Сборщик мусора
...
Рейтинг: 0 / 0
Русская смекалка в IT
    #777552
Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей кроме]
[не активирован]
sql server
Flash
Windows
1C
Unity3D
eNose,

Я так же думаю
...
Рейтинг: 0 / 0
Русская смекалка в IT
    #777691
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
Green2  03.12.2018, 08:57
eNose,

Я так же думаю
при чем отладочный, судя по записи лога
...
Рейтинг: 0 / 0
Русская смекалка в IT
    #779923
Droog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNose  03.12.2018, 10:09
Green2  03.12.2018, 08:57
eNose,

Я так же думаю
при чем отладочный, судя по записи лога
Ну да, я могу в финальной версии поставить GarbageCollectorActive=false, а лучше закомментировать TSafeObject и заменить его например на TSafeObject = type(TObject).
Как я понимаю, для C++ можно написать точно такую же штуку? Я сам в C вообще не разбираюсь.
...
Рейтинг: 0 / 0
Русская смекалка в IT
    #779926
Енот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я больше не пишу на Делфи.
По-моему, вполне находчиво.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Вопросы по IT / Русская смекалка в IT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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