Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

народ, оцените код   Найти похожие ветки 

 
Dust ©   (2005-08-01 13:58) [0]

писалось для склеивания пакетов пришедших из сети,
а так же для их сборки перед отправкой

http://nostdal.org/paste/327e65c87affb7475eb3e3215c543b05.html


 
Ega23 ©   (2005-08-01 14:02) [1]

А зачем конструктор нужен? Я не понял...


 
Defunct ©   (2005-08-02 02:09) [2]

pinging nostdal.org [193.246.214.118] with 32 bytes of data:

request timed out.
request timed out.
request timed out.
request timed out.

Ресурс вы выбрали неудачный..


 
Dust ©   (2005-08-02 14:03) [3]

я убрал несколько ошибок
кстати, нормальный хост...
http://nostdal.org/paste/5192e561ff56c3a9ce5900bced3b5b3a.html


 
Defunct ©   (2005-08-02 14:54) [4]

Dust ©   (02.08.05 14:03) [3]
> кстати, нормальный хост...
Днем доступен, ночью - нет ;>

destroy;override; поставьте.

class function imho лишняя, почему бы просто не описать второй конструктор. (и нужен ли он?)

функции
  function  FUnreadSize() : dword;
  function  FContainerSize() : dword;
  function  FDataPresent()  : boolean;

должны быть в private, иначе нет смысла создавать property для каждой из них

flatlist imho вообще ненужная запись, можно просто все ее поля включить в private секцию.

> procedure PushRaw(const packet: pointer; const count : dword);
Делают обычно так:
procedure PushRaw(var Buf; const count : dword);
для чтения
procedure PopRaw(var Buf; var count : dword);


По офромлению кода:
код трудно читаем, например здесь

 if (Flatlist.shiftL + count)<=(Flatlist.shiftR) then begin
    p:=Pointer(dword(Flatlist.pFlat)+Flatlist.shiftL);
    CopyMemory(packet, p, count);
    flatlist.isDataPresent :=true;
    if not KeepMarker then Flatlist.shiftL:=Flatlist.shiftL+count;     end;


не видно к чему относится end, и не ясно из названия полей на что указывает p. В выделенной строчке непонятно зачем нужны поля shiftL и shiftR;

в общем, я бы весь класс переписал..


 
Ega23 ©   (2005-08-02 15:38) [5]

Всё-таки непонятно, зачем нужен constructor, у которого только inherited вызов идёт?


 
Dust ©   (2005-08-03 09:37) [6]

2Ega23

> Всё-таки непонятно, зачем нужен constructor, у которого
> только inherited вызов идёт?

Я до сих пор считаю, что именно конструктор создаёт объект.

и именно поэтому вызовов конструктора я поместил в функцию класса
class function TFIFORawQueue.CreateFIFORawQueue(
 const size: dword): TFIFORawQueue;
begin
 Result:=TFIFORawQueue.Create();      
Result.flatlist.pFlat:=AllocMem(size);
 Result.flatlist.size   :=size;
 Result.flatlist.shiftR :=0;
 Result.flatlist.shiftL :=0;
 Result.flatlist.isDataPresent :=false;
end; //class function TFIFORawQueue.CreateFIFORawQueue


 
Dust ©   (2005-08-03 09:47) [7]

2 Defunct
 class function  я сделал потому, что если переопределить параметры вызова конструктора, то вызов inherited;
становится недоступным.
вообще я не силён в ООП.
насчёт структуры - в начале она вообще присутствовала в рамках друго объекта, а полей у него было!!! тьма тьмущая, я принял решение упростить объект, и разделить его на несколько частей, потому как чем дальше этот объект(т.ч. класс) я описывал тем более дремучим он становился, а если уже есть готовая структура... почему бы ею же и не воспользоваться


 
Digitman ©   (2005-08-03 09:47) [8]


> до сих пор считаю, что именно конструктор создаёт объект


TFIFORawQueue = class(...)
public
 constructor Create(ASize: DWord);
 destructor Destroy; override;
end;

constructor TFIFORawQueue.Create(ASize: DWord);
begin
 inherited;
 with flatlist do
 begin
   GetMem(pFlat, Size);
   Size := Asize;
 end;
end;

destructor TFIFORawQueue.Destroy;
begin
 FreeMem(flatlist.pFlat);
 inherited;
end;

...

FIFORawQueueInstance := TFIFORawQueue.Create(100);


 
Dust ©   (2005-08-03 10:06) [9]

люди, объясните пожалуйста, что за вызов inherited? и почему, когда я переопределяю актуальные параметры конструктора
constructor TFIFORawQueue.Create(ASize: DWord);
компилер на него ругается
[Error] FIFORawQueueClass.pas(47): Incompatible types
столкнувшись именно с этим я  создал функцию класса


 
Digitman ©   (2005-08-03 10:16) [10]


> актуальные параметры


что за "актуальные" ?

есть формальные параметры и есть фактические параметры ..


> переопределяю


что значит "переопределяю" ?

либо определяешь новый метод, либо перекрываешь одноименный виртуальный метод предка ..


 
evvcom ©   (2005-08-03 10:26) [11]


> когда я переопределяю актуальные параметры конструктора

Это как раз формальные параметры. Чтобы использовать то же имя с другими типами параметров функцию/процедуру/метод надо перегружать, используя волшебное слово overload; А можно, чтобы меньше путаться свой новый конструктор назвать несколько иначе. Ключевым здесь является слово constructor, а не само имя Create.


 
Dust ©   (2005-08-03 10:27) [12]


> Digitman ©   (03.08.05 10:16) [10]
>
> > актуальные параметры
>
>
> что за "актуальные" ?
>
> есть формальные параметры и есть фактические параметры ..

оговорился, формальные параметры.

определяю конструктор с входными параметрами


 
Digitman ©   (2005-08-03 10:29) [13]


> Dust ©   (03.08.05 10:27) [12]


покажи полный текст (декларация и реализация) класса, в том виде в каком "компилер на него ругается" ..


 
Ega23 ©   (2005-08-03 10:34) [14]

Тебе надо было написать

TFIFORawQueue=class (...)
 ....
 public
  constructor Create(ASize: DWord);
 end;

constructor TFIFORawQueue.Create(ASize: DWord);
begin
inherited Create;
.......
end;



И не нужно никаких class-функций...


 
ЮЮ ©   (2005-08-03 10:37) [15]

>TFIFORawQueue=class (...)

многое зависит от того, что скрывается за ...


 
Ega23 ©   (2005-08-03 10:41) [16]

2 ЮЮ ©   (03.08.05 10:37) [15]
Конкретно в случае автора - вообще TObject


 
Dust ©   (2005-08-03 11:17) [17]


> Digitman ©   (03.08.05 10:29) [13]
> покажи полный текст (декларация и реализация) класса, в
> том виде в каком "компилер на него ругается" ..

декларация:
...
constructor TFIFORawQueue.Create(ASize: DWord);
...

реализация:
constructor TFIFORawQueue.Create(ASize: DWord);
begin
 inherited; //<<----Error in compilling
end; //constructor

> [Error] FIFORawQueueClass.pas(47): Incompatible types
именно после этого я придумал функцию класса. На самом деле я не знаю зачем нужен вызов inherited
Остальной текст вы можете найти по ссылке чуть-чуть выше


 
Ega23 ©   (2005-08-03 11:34) [18]


реализация:
constructor TFIFORawQueue.Create(ASize: DWord);
begin
inherited Create; //<<----Error in compilling
end; //constructor


Должно заработать.


 
Alexander Panov ©   (2005-08-03 11:36) [19]

Dust ©   (03.08.05 9:47) [7]
class function  я сделал потому, что если переопределить параметры вызова конструктора, то вызов inherited;


В классе может быть несколько конструкторов с различными параметрами.
при вызове inherited-конструктора(а это просто-напросто вызов конструктора класса-предка) имя конструктора можно указать явно, передав ему соответствующие параметры(если список параметров не совпадает со текущего конструктора), либо опустив параметры в случае полного совпадения.

И вообще, ключевое слово inherited, примененное к любому методу класса, означает всего лишь вызов метода предка.


 
Digitman ©   (2005-08-03 11:43) [20]


> Dust ©   (03.08.05 11:17) [17]


если ты написал

inherited;

то компилятор пытается обнаружить у класса-предка одноименный констр.метод с ТАКИМИ ЖЕ параметрами, и если таковой не найден, то ты получаешь как раз ту самую ошибку

если же ты написал

inherited Create(такие-то параметры, если они есть);

то компилятор пытается обнаружить у класса-предка констр.метод с ЯВНО указанным тобой именем (т.е. Create в дан.случае) с такими-то указанными тобой параметрами


 
Dust ©   (2005-08-03 13:55) [21]

а вообще это делать нужно?
нужно ли вызывать inherited если класс порождён от TObject?


 
Digitman ©   (2005-08-03 14:10) [22]


> Dust ©   (03.08.05 13:55) [21]


нужно.. если ты не уверен, что завтра по каким-либо (неочевидным сегодня) причинам тебе не придется сменить предка своего объекта

тело констр.метода TObject.Create - пустое, вызов этого метода холостой, но нет гарантий, что завтра Борланд не наполнит тело этого метода какой-либо функц-ю


 
tesseract ©   (2005-08-04 11:03) [23]

Возможно оффтопик:  но есть набор функций EZDSL от автора книге "Фундаментальные алгоритмы и основы данных на делфи" где реализованы Стеки ,очереди, и тд и тп. Если хочешь посмотреть как это выглядит в идеале и с поддержкой многопоточности лучше посмотри как сделано там. А ещё лучше книгу надыбай ИМХО MustHave.


 
Dust ©   (2005-08-04 13:32) [24]


2 tesseract ©   (04.08.05 11:03) [23]

спасибо за совет, обязательно найду и прочитаю.

2 Digitman ©   (03.08.05 14:10) [22]
спасибо за разъяснение

2ALL
я считаю, что здесь получил ответы на свои вопросы, и тему можно закрывать



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.063 c
14-1122371868
MBo
2005-07-26 13:57
2005.08.21
Пляшущие человечки наномира ;)


14-1122752153
Michael5
2005-07-30 23:35
2005.08.21
Объясните, что с поиском на этом сайте???


14-1122450466
BJValentine
2005-07-27 11:47
2005.08.21
Помогите DOS мамонту


1-1122583733
Katya21
2005-07-29 00:48
2005.08.21
Memo Richedit и Steam


3-1121071009
bendela
2005-07-11 12:36
2005.08.21
ado+ms Access редактирование записи