- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
Label 1, 2;
var
M,n:integer;
B:real;
Begin
Read(m,n);
2:
B:=m mod n;
If b=0 then goto 1 else
Begin
M:=n; n:=b;
Goto 2;
End;
1:
Write(n);
End.
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+93
Label 1, 2;
var
M,n:integer;
B:real;
Begin
Read(m,n);
2:
B:=m mod n;
If b=0 then goto 1 else
Begin
M:=n; n:=b;
Goto 2;
End;
1:
Write(n);
End.
Кaк бэ прогрaммноe рeaлизaциё aлгоритмa Евклидa, нaхождeниe мaксимaльного дeлитeля двух чисeл, кaк-то тaк.
+93
if Length(PP.curdir)<36 then
pt:=' '+PP.curdir+' '
else pt:=' \...'+Copy(PP.curdir,Length(PP.curdir)-30,31)+' ';
Ptr:=PP.f_ptr;
if PP.vol='' then PP.vol:='No Label';
WriteString(1,cc+(40-length(pt)) div 2,pt,Pal[8]);
WriteString(22,cc+1+(cc*(34-length(PP.vol))) div 40,'['+PP.vol+']',Pal[7]);
if PP.vol='No Label' then PP.vol:='';
{if PP.empty then exit;}
inc(ptr,sizeof(filrec)*row);
for i:=row to n+row do begin
if (i <PP.files) and (not PP.empty) then begin fname:=ptr^.filename;
{if (ptr^.fileattr and 16) = 0 then StrLwr(fname);}
if (Ptr^.fileattr and 2) <> 0 then fname[1]:=upcase(fname[1]);
if ((Ptr^.fileattr and Hidden) <> 0) and (Pos('.',Fname)>0) then fname[Pos('.',Fname)+1]:=upcase(fname[Pos('.',Fname)+1]);
SortFIle(fname);
for a := length(fname) to 11 do fname:=fname+' ';
fname:=fname+'│';
if (Ptr^.fileattr and 16) = 0 then Str(Ptr^.filesize:10,pt)
else if fname[1]='.' then pt:='UP──-DIR'
else pt:='SUB─-DIR';
fname:=fname+pt+'│';
DateTimeCnv(pt,Ptr^.filedttm);
fname:=fname+pt; {SetFattr}
if Ptr^.selected then WriteString(2+i-row,cc,fname,Pal[1]) else
WriteString(2+i-row,cc,fname,Pal[2]);
inc(ptr,sizeof(filrec));
end
else WriteString(2+i-row,cc,' │ │ │ ',Pal[1]);
end;
end;
procedure Put_File(PP:Panel;cc,row,x:word;active:boolean);
var
fname,pt:string;
{ptr:P_filrec;}
begin
if PP.empty then exit;
ptr:=PP.F_ptr;
inc(ptr,sizeof(filrec)*(row+x));
fname:=ptr^.filename;
{if (ptr^.fileattr and 16) = 0 then StrLwr(fname);}
if (Ptr^.fileattr and 2) <> 0 then fname[1]:=upcase(fname[1]);
if ((Ptr^.fileattr and Hidden) <> 0) and (Pos('.',Fname)>0) then fname[Pos('.',Fname)+1]:=upcase(fname[Pos('.',Fname)+1]);
SortFile(fname);
for a := length(fname) to 11 do fname:=fname+' ';
fname:=fname+'│';
if (Ptr^.fileattr and 16) = 0 then Str(Ptr^.filesize:10,pt)
else if fname[1]='.' then pt:='UP──-DIR'
else pt:='SUB─-DIR';
fname:=fname+pt+'│';
DateTimeCnv(pt,Ptr^.filedttm);
fname:=fname+pt;
if active then If Ptr^.selected then WriteString(2+x,cc,fname,Pal[3]) else
WriteString(2+x,cc,fname,Pal[4])
else if Ptr^.selected then WriteString(2+x,cc,fname,Pal[1]) else
WriteString(2+x,cc,fname,Pal[2])
Файловый менеджер по-типу NC. Pascal, 7-ой класс школы. Участок формирования одной из панелей.
PS: Вообще, это даже как-то работало: http://habrastorage.org/storage1/84736ecc/b4711597/5b1d2618/5b60c662.png
+92
// к говнокоду 7101:
interface
type TObjectAuto = class;
TSmartPtr = packed record
data: TObjectAuto;
end;
TSmartPtrA = array of TSmartPtr;
//-------------------------------------------------------------------------------------------
// класс с "авто"-деструктором
TObjectAuto = class(TObject)
n: integer; // для тестов
constructor Create(var ptr: TSmartPtrA);
destructor Destroy(); override;
end;
implementation
uses Windows;
var winheap: Cardinal;
var savedlinks: array of integer; // в тестовом примере сойдет, а вообще надо хеш-таблицу
//-------------------------------------------------------------------------------------------
constructor TObjectAuto.Create(var ptr: TSmartPtrA);
begin
inherited Create();
SetLength(ptr, 1);
ptr[0].data := self;
// сохраняем адрес выделенной памяти под массив (у него еще есть длина и счетчик ссылок)
SetLength(savedlinks, Length(savedlinks) + 1);
savedlinks[Length(savedlinks) - 1] := integer(ptr) - 2 * sizeof(integer);
end;
//-------------------------------------------------------------------------------------------
destructor TObjectAuto.Destroy();
begin
n := 0; // сюда брякпойнт поставим:)
inherited;
end;
//-------------------------------------------------------------------------------------------
function WinGetMem(Size: Integer): Pointer;
begin
Result := HeapAlloc(winheap, 0, Size);
end;
//-------------------------------------------------------------------------------------------
function WinFreeMem(P: Pointer): Integer;
var i, j: integer;
begin
// ищем адрес освобождаемой памяти среди сохраненных
i := 0; j := 0; while(i < Length(savedlinks))do begin
// если нашли, то вызываем "авто"-деструктор
if (savedlinks[i] = integer(P)) then
TSmartPtrA(integer(p) + 2 * sizeof(integer))[0].data.Free()
else begin
savedlinks[j] := savedlinks[i];
inc(j);
end;
inc(i);
end;
SetLength(savedlinks, j);
HeapFree(winheap, 0, P);
Result := 0;
end;
//-------------------------------------------------------------------------------------------
function WinReallocMem(P: Pointer; Size: Integer): Pointer;
begin
Result := HeapReAlloc(winheap, 0, P, Size);
end;
//-------------------------------------------------------------------------------------------
var winmem: TMemoryManager = (
GetMem: WinGetMem;
FreeMem: WinFreeMem;
ReallocMem: WinReallocMem);
oldmem: TMemoryManager;
//-------------------------------------------------------------------------------------------
initialization
begin
winheap := GetProcessHeap();
GetMemoryManager(oldmem);
SetMemoryManager(winmem);
SetLength(savedlinks, 0);
end;
//-------------------------------------------------------------------------------------------
finalization
begin
SetLength(savedlinks, 0);
SetMemoryManager(oldmem);
end;
//-------------------------------------------------------------------------------------------
end.
// пример использования:
procedure TfrmTest.Button1Click(Sender: TObject);
var ptr: TSmartPtrA;
obj: TObjectAuto;
begin
obj := TObjectAuto.Create(ptr);
obj.n := 222; // ptr[0].data.n := 222;
// тут obj удалится сам
end;
примерно так можно реализовать автодеструктор в delphi
для передачи в функцию нужно использовать ptr и работать с ним как ptr[0].data - неудобно конечно.
ЗЫ: код тестовый - в нем полно кривостей.
+110
unit HRTimer;
interface
uses Windows;
type
// --------------------- Класс - высокоточный таймер -------------------------
THRTimer = class(TObject)
constructor Create;
function StartTimer: Boolean; // Обнуление таймера
function ReadTimer: Double; // Чтение значения таймера в миллисекундах
private
StartTime: Double;
ClockRate: Double;
public
Exists: Boolean; // Флаг успешного создания таймера
end;
var
Timer: THRTimer; // Глобальая переменная. Создаётся при запуске программы
{ Фукнция высокоточной задержки.
Delphi:
Синтаксис: function HRDelay(const Milliseconds: Double): Double;
Milliseconds: Double - задержка в миллисекундах (может быть дробной)
Результат функции - фактически произошедшая задержка с погрешностью.
Пример вызова функции: X:= HRDelay(100.0); или HRDelay(100.0);
C++Builder:
Синтаксис: double HRDelay(const double Milliseconds);
Double Milliseconds - задержка в миллисекундах (может быть дробной)
Результат функции - фактически произошедшая задержка с погрешностью.
Пример вызова функции: double X = HRDelay(100.0); или HRDelay(100.0);}
function HRDelay(const Milliseconds: Double): Double;
implementation
function HRDelay(const Milliseconds: Double): Double;
begin
Timer.StartTimer();
repeat
Result:= Timer.ReadTimer();
until Result >= Milliseconds;
end;
{ THRTimer }
constructor THRTimer.Create;
var
QW: LARGE_INTEGER;
begin
inherited Create;
Exists := QueryPerformanceFrequency(Int64(QW));
ClockRate := QW.QuadPart;
end;
function THRTimer.StartTimer: Boolean;
var
QW: LARGE_INTEGER;
begin
Result := QueryPerformanceCounter(Int64(QW));
StartTime := QW.QuadPart;
end;
function THRTimer.ReadTimer: Double;
var
ET: LARGE_INTEGER;
begin
QueryPerformanceCounter(Int64(ET));
Result := 1000.0 * (ET.QuadPart - StartTime) / ClockRate;
end;
initialization
Timer:= THRTimer.Create();
finalization
Timer.Free();
end.
классический шайзберг посреди майских роз (ну почти розы)
+89
// qsort.inc:
procedure SortRow(var A: array of T);
procedure sort(l,r: integer);
var
i,j: integer;
x,y: T;
begin
i := l;
j := r;
x := a[random(r-l+1)+l];
repeat
while LESS(a[i],x) do inc(i);
while LESS(x,a[j]) do dec(j);
if i<=j then begin
y := a[i];
a[i] := a[j];
a[j] := y;
inc(i);
dec(j);
end;
until i>=j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
begin
Sort(Low(A), High(A));
end;
// unit1.pas
T = TPoint;
function LESS(const a,b: T): boolean;
begin
result := a.x<b.x;
end;
{$I qsort.inc}
var
a: array of TPoint;
begin
...
SortRow(a);
...
end;
Я использую шаблоны в Дельфи-7 ололо.
+115
procedure info_();
var
i:integer;
ActivityCategory,stroka,strok,stroka_sopr,http1100,http_sopr,tag,tag_sopr,until_date,date_:string;
f1100,f_sopr,inf:textfile;
begin //главный
clear();
if form1.radioGroup1.ItemIndex=0 then begin
http1100:='\\server1\Отдел 1\Program Files\Prof\profiki\1100\'+m+'.smc';
http_sopr:='\\server1\Отдел 1\Program Files\prof\profiki\сопроводительное\'+m+'.smc';
end;
if form1.radioGroup1.ItemIndex=1 then begin
http1100:='\\server1\Отдел 1\Program Files\Prof\banki\1100\'+m+'.smc';
http_sopr:='\\server1\Отдел 1\Program Files\prof\banki\сопроводительное\'+m+'.smc';
end;
if form1.radioGroup1.ItemIndex=2 then begin
http1100:='\\server1\Отдел 1\Program Files\Prof\YK\1100\'+m+'.smc';
http_sopr:='\\server1\Отдел 1\Program Files\prof\YK\сопроводительное\'+m+'.smc';
end;
if form1.radioGroup1.ItemIndex=3 then begin
http1100:='\\server1\Отдел 1\Program Files\Prof\NPF\1100\'+m+'.smc';
http_sopr:='\\server1\Отдел 1\Program Files\prof\NPF\сопроводительное\'+m+'.smc';
end;
if form1.radioGroup1.ItemIndex=4 then begin
http1100:='\\server1\Отдел 1\Program Files\Prof\REGISTRATOR\1100\'+m+'.smc';
http_sopr:='\\server1\Отдел 1\Program Files\prof\REGISTRATOR\сопроводительное\'+m+'.smc';
end;
Пытался перенести в другую папку программу, после чего она по сути перестала работать, ругаясь ошибкой 63. Нашел ее исходники и увидел ЭТО... это лишь 5-10% всей процедуры, которая мало того, что ищет XML-файлы по определенному пути, так еще и парсит их...
+155
uses crt;
var s:integer;
begin
readln(s);
writeln(ord(s[0]));
readln;
end.
+92
var
CommHandle:integer;
DCB:TDCB;
Stat:TComStat;
Kols,TransMask,Errs:DWord;
Ovr:TOverlapped;
s:string;
i:integer;
{Чтение канала n}
function ReadChannel(n:integer):string;
begin
inc(n,32); //код запроса для прибора (это по спецификации прибора)
s:=chr(n); //символ запроса
WriteFile(CommHandle,s[1],length(s),Kols,@Ovr); //оправили этот код в прибор
TransMask:=0; //маска любого события в порте
Ovr.hEvent:=CreateEvent(nil, True, False, nil); //хз
repeat
if not WaitCommEvent(CommHandle, TransMask, @Ovr) then //если приём закончен не до конца, то...
if GetLastError = ERROR_IO_PENDING then WaitForSingleObject(Ovr.hEvent, INFINITE); //при условии "хз" подождать ещё чуть-чуть
ClearCommError(CommHandle,Errs,@Stat); //скинуть длину байт из буфера порта в переменную Stat
Kols:=Stat.cbInQue; //выяснить длину символов
until (Kols=1) or (Kols=14); //закончить, если в канале пусто (1) или данные есть (14)
SetLength(s,Kols); //установить переменную s длиной Kols
ReadFile(CommHandle,s[1],Kols,Kols,@Ovr); //прочитать данные из порта в s, обнулив буфер
if length(s)=1 then ReadChannel:='Пусто'; //дальше просто идёт обработка полученных данных
if length(s)=14 then ReadChannel:=copy(s,5,7);
end;
{Основной код}
for i:=1 to 60 do Value:=ReadChannel(i); //ПОЛУЧИТЬ ДАННЫЕ ИЗ ПОРТА n
Имеется прибор с хранением данных в 60 каналах. Связь осуществляется по RS-232.
Чтобы получить данные, нужно отправить № кода нужного канала. В ответ придут данные этого канала.
Если канал пустой, то приходит 1 байт, если данные есть, то 14 байт.
Создана функция ReadChannel(n) с запросом данных из канала n.
ПРОБЛЕМА:
Прочитать все 60 каналов удаётся иногда 3 раза, иногда 15 раз. Но обязательно когда-нибудь программа зависнет на
WaitCommEvent(CommHandle, TransMask, @Ovr), так ничего и не получив из порта.
Если между командами
WriteFile и WaitCommEvent
поставить sleep(50) //9600 бод = 1200 б/с, то бишь 12 мс на 1 байт
то всё пашет. Но это не дело же привязываться ко времени?
Как избавиться от зависания на WaitCommEvent, чтобы процесс продолжился?
Если прибор не получил байт, из-за чего не ответил, как это проверить? "Данных нет уже 0,5 с, значит и не будет; отправлю этот байт ещё раз".
+96
Assign(F, FileName);
IOResult;
Reset(F);
if IOResult = 0 then begin
for i := 0 to MaxModelNamesCount-1 do ModelKind[i] := mkVagon;
Result := True;
BlockRead(F, W, 2);
if W = OldWDim then begin // старый формат
// 20 строк пропущено
end else if W = WDim then begin // новый формат
BlockRead(F, FormatVersion, 4); // версия нового формата
if FormatVersion <= 4 then begin
BlockRead(F, EditorDate, 4);
BlockRead(F, C, 4);
LCount := C;
for i := 0 to LCount - 1 do begin
BlockReadLine(F, Lines[i], 16);
if (FormatVersion <= 2) and (Lines[i].Attr[3] and $0F = 5) then Lines[i].Attr[0] := 0
else if (Lines[i].Attr[3] and $0F = k3DObject) then ModelKind[Lines[i].IntAttr[1]] := mkStatic;
end;
if FormatVersion <= 1 then begin
ModelNamesCount := 8; // для 1й версии список жёстко задан
ModelNames[0] := 'ГЗРВ-10';
ModelNames[1] := 'ГЗРВ-10М';
ModelNames[2] := 'КТМ-5М3';
ModelNames[3] := 'ЛМ-68';
ModelNames[4] := 'ЛМ-68М';
ModelNames[5] := 'ЛМ-68ММ';
ModelNames[6] := 'ЛВС-86';
ModelNames[7] := 'ЛВС-97';
for i := 8 to MaxModelNamesCount-1 do ModelNames[i] := '';
end else if FormatVersion <= 3 then begin
ModelNamesCount := 0;
for i := 0 to 255 do begin
j := 0;
BlockRead(F, j, 1);
SetLength(ModelNames[i], j);
for j := 1 to Length(ModelNames[i]) do Read(F, byte(ModelNames[i, j]));
if ModelNames[i] <> '' then Inc(ModelNamesCount);
end;
end else begin
BlockRead(F, ModelNamesCount, 4); // кол-во моделей
for i := 0 to MaxModelNamesCount - 1 do ModelNames[i] := '';
for i := 0 to ModelNamesCount-1 do begin
BlockRead(F, k, 4); // номер считываемой модели
j := 0;
BlockRead(F, j, 1); // длина имени, не более 255
SetLength(ModelNames[k], j);
for j := 1 to Length(ModelNames[k]) do Read(F, byte(ModelNames[k, j]));
end;
end;
for i := 0 to 8 do
for j := 0 to 12 + Byte(FormatVersion >= 2) do with Routes[i, j] do begin
BlockRead(F, PCount, 2);
SetAllowedModels(Routes[i,j], 0, -1);
if FormatVersion <= 1 then begin
BS := [];
BlockRead(F, BS, 4);
AllowedModelsCount := 0;
for k := 0 to 255 do if k in BS then begin
Inc(AllowedModelsCount);
AllowedModels[k] := True;
end;
end else if FormatVersion <= 3 then begin
BlockRead(F, BS, 32);
AllowedModelsCount := 0;
for k := 0 to 255 do if k in BS then begin
Inc(AllowedModelsCount);
AllowedModels[k] := True;
end;
end else begin
BlockRead(F, AllowedModelsCount, 4);
for k := 0 to AllowedModelsCount-1 do begin
BlockRead(F, n, 4); // номер модели
AllowedModels[n] := True;
end;
end;
for k := 0 to PCount - 1 do begin
if FormatVersion >= 3 then BlockRead(F, c, 4)
else begin
c := 0;
BlockRead(F, c, 2);
end;
Points[k] := c;
end;
BlockRead(F, DefVagons, 1);
SpeedRoute := boolean(DefVagons shr 4);
DefVagons := DefVagons and $0F;
BlockRead(F, Interval, 1);
end;
end else Result := False;
end else Result := False;
Close(F);
Короче, лапша из if FormatVesion такой-то...
Обратная совместимость формата файла.
Формату уже 4 года.
+111
function str_transfer(str: string; c: Integer): String;
var
i:Integer;
begin
i:= c;
while PosEx(' ',str,i) > 0 do
begin
if PosEx(' ',str,i) > 0 then
begin
i:= PosEx(' ',str,i);
Insert(#10#13,str,i+1);
i:= i+c;
end;
end;
Result:= str;
end;
"решил написать вот такую функцию, которая вставляет в строку переносы после определенного кол. символов, перенос строки вставляется между словами. Может кому пригодится...."