Главная страница
    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.51 MB
Время: 0.042 c
1-1122965509
Term
2005-08-02 10:51
2005.08.21
Добавление и удаление ключа на автозапуск


1-1122550878
Priest
2005-07-28 15:41
2005.08.21
Как сменить фон для неактивного OLEConteiner


1-1122368423
Dust
2005-07-26 13:00
2005.08.21
Создание логов


1-1123055174
TDionis
2005-08-03 11:46
2005.08.21
Проверка eidta на наличие цифр


1-1122705542
Igit
2005-07-30 10:39
2005.08.21
Неправильно читается файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский