Текущий архив: 2002.12.26;
Скачать: CL | DM;
Внизкласс Найти похожие ветки
← →
Relict (2002-12-15 14:10) [0]каждый экземпляр класса должен представлять собой массив значений(кокого типа неважно...можно любой)
обеспечить возможность работы с элементами этого массива как и с обычным массивом...
вот лаба такая задана...низнаю как подступиться..
если с обычным массивом:
a: array[1..5] of Integer;
....
a[i]:=....
а как к своему классу приделать квадратные скобки?
← →
Alx2 (2002-12-15 14:13) [1]>Relict (15.12.02 14:10)
property ValueByIndex[Index:integer]:integer read GetValueByIndex write SetValueByIndex; default;
← →
han_malign (2002-12-15 14:14) [2]function getItem(Index: integer{string, etc}): TMyType;
procedure putItem(Index: integer{string, etc}; Value: TMyType);
property Items[Index: integer{string, etc}]: TMyType read GetItem write PutItem; default;
← →
Сергей Бушин (2002-12-15 14:40) [3]А что TList не поможет?
← →
Relict (2002-12-15 14:56) [4]не, TList не поможет...надо ручками...
а как потом обьявлять экземпляр класса?
← →
Alx2 (2002-12-15 14:59) [5]A : ТипаМойДинамическийМассив;
Begin
A := ТипаМойДинамическийМассив.Create;
A[10] := 25;
A.Free
End;
← →
han_malign (2002-12-15 15:00) [6]vectord : TVector;
......................
vector:=TVector.Create(...)
??????????????????????????????????????????????????????????
З.Ы. Шел бы ты книжку читать, пока не зафлеймили...
← →
Relict (2002-12-15 15:17) [7]а где задавать скока элементов массива будет....?
← →
han_malign (2002-12-15 15:22) [8]Add,Insert,Remove,Delete,SetLength,Count,Create(666)..................................................................................
← →
Relict (2002-12-15 17:23) [9]все равно немного не догоняю
вот допустим мой класс
unit MyClass;
interface
type TMassiv = class (TObject)
I_Test: Integr;
public
function GetItem (Index: integer):TMassiv;
procedure PutItem (Index: integer; Value:TMassiv);
property Items[Index: integer]: TMassiv read GetItem write PutItem;default;
end;
implementation
procedure TMassiv.PutItem(Index: integer; Value:TMassiv);
begin
end;
function TMassiv.GetItem (Index: integer):TMassiv;
begin
end;
end.
вот так я в основном модуле делаю:
procedure TForm1.Button1Click(Sender: TObject);
var a: TMassiv;
i: Integer;
begin
a:= TMassiv.Create();
for i:=0 to 10 do
begin
a[i].I_Test:=i;
end;
for i:=0 to 10 do a[i].I_Test:=i;
for i:=0 to 10 do memo1.Lines.Add( IntToStr(a[i].I_Test));
end;
а в memo у меня одни десятки....)
я так понимаю что пишу в один и тот же объект...а почему тогда скобочки прокатывают...
и что надо написть в GetItem и PutItem?
← →
han_malign (2002-12-15 17:53) [10]слов нет...
Это не падает с жутким треском только потому, что перед неявным вызовом пустого метода GetItem, в EAX помещается адрес на тот единственный созданный экземпляр, котрый через тот же EAX и выдается как значение элемента(функции GetItem), то-есть ты всегда обращаешься к одному и тому-же экземпляру класса.
ВНИМАНИЕ: Когда ты поймешь все, что я здесь написал, и что к чему - вот ТОГДА задавай следущий вопрос на этом форуме.
← →
Relict (2002-12-15 18:06) [11]так я сказал что понимаю что пишу в один и тот же...и что методы пустые...
я нипанимаю массив как зделать...понимаешь...я не прошу за меня написать...я прошу мне объяснить!
← →
Relict (2002-12-15 18:23) [12]кстати экземпляр и должен быть один единственные...покрайней мере как я пинимаю...
а вот I_Test внутри этого экземпляра должны быть разные в зависимости от индекса у экземпляра...
то есть в медоте Create экземпляра должна выделится память под все эти I_Test, но как связать нужный I_Test с индексом...
допустим I_Test будет указателем на область памяти выделенную для хранения этих I_Test (то есть если они типа Integer - по 4 байта на каждый) и GetItem будет вытаскивать нужный I_Test из этой области : I_Test(как указатель) + на сколько байт сместится (в зависимости от индекса)...вообщето чушь какая то получается...поэтому и начал спрашивать...
хотя может и снова в первый класс пора...
← →
Anatoly Podgoretsky (2002-12-15 18:24) [13]Тебе не нужны классы, тебе достаточно простых динамических массивов, тем более стоы в твоей постановке не удастся получить такой синтаксис OBJ[n] для класса
← →
Relict (2002-12-15 18:35) [14]так задание такое класс "динамический массив"
...
и если просто использовать динамический массив у него нижний индекс 0 а мне нужно еще при выполнение программы менять и верхний и нижний индек произвольно...[1..8] а потом допустим [5..20]..лишние удалять...
← →
Anatoly Podgoretsky (2002-12-15 18:46) [15]Термине "класс" хдесь явно в другом контексте, как например класс Целые, строки и т.д.
Ты тогда выясни у задавшего тему, думаю это предподователь, что здесь понимается и вперед за буквари по Паскалю, аозможно речь идет и о классах с членами класса динамический массив, тогда будет оправдано замечание о верхнем нижнем индексе. Тема в хелпе "indexed properties"
← →
Reindeer Moss Eater (2002-12-15 18:48) [16]Преподаватель, давая задание "создать класс "динамический массив" " не всегда имеет ввиду конкретный тип данных в Object Pascal. Создай класс с массивом, допускающим ресайзинг (используя все что тебе удобно) и задание будет считаться выполненным
← →
Anatoly Podgoretsky (2002-12-15 18:59) [17]Ой сдается мне в институтах начались какие то сдачи, если судить по вопросам на форумах за последнее время
← →
Fantasist (2002-12-15 22:32) [18]
> GetItem будет вытаскивать нужный I_Test из этой области
> : I_Test(как указатель) + на сколько байт сместится (в зависимости
> от индекса)...вообщето чушь какая то получается...поэтому
> и начал спрашивать...
> хотя может и снова в первый класс пора...
Почему чушь? Что тут такого сложного?
unit MyClass;
interface
type
PInteger=^Integer;
TMassiv = class (TObject)
private
mData: PIntegr;
function GetItem (Index: integer):Integer;
procedure PutItem (Index: integer; Value:Integer);
public
constructor Create(Size:integer);
destructor Destroy; virtual;
public
property Items[Index: integer]: Integer read GetItem write PutItem;default;
end;
implementation
constructor TMassiv.Create(Size:integer);
begin
GetMem(mData,sizeof(Integer)*Size);
end;
destructor TMassiv.Destroy;
begin
FreeMem(mData);
end;
procedure TMassiv.PutItem(Index: integer; Value:Integer);
begin
PInteger(Integer(mData)+Index*sizeof(Integer))^:=Value;
end;
function TMassiv.GetItem (Index: integer):Integer;
begin
Result:=PInteger(Integer(mData)+Index*sizeof(Integer))^;
end;
Проверки и остальные примочки на тебе.
Страницы: 1 вся ветка
Текущий архив: 2002.12.26;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.006 c