![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с памятью [Delphi, Windows]
Proger © (2004-06-26 16:09:00)Возмоно это ламерский вопрос, но у меня есть проблемка в написании
движка.Предположим есть тип TSprite и Sprite1, Sprite2 этого типа,
я пишу:
Sprite1 := Sprite2;
Я так понял здесь передаётся адрес Sprite2, из-за чего естественно
при манипуляциях с Sprite1 меняется и Sprite2 и наоборот.Вроде понятно
выразился.
Proger (2004-06-28 10:04:00) [21]2 cyborg ©.Попробавал, опять хрень какая-то
Предположим я заношу спрайт Rocket c одними параметрами в ячейку SprList[0], далее в SprList[0], где находится
скопированая ракета параметр скорости перемещения увеличивается,
в то же время увиличивается параметр скорости и у ROCKET????
Из-за чего после занесения Rocket например в ячейку SprList[1]
скорость перемещения будет такая же как и в SprList[0] >:-0
smb (2004-06-28 09:51:00) [22]Как же утерянная? Это же именно указатели, мы же разорились только на адрес, не на вторую копию.
Насколько я понимаю, дело в том, что сначала было два экземпляра класса и два указателя на них, после присвоения указателей один экземпляр заимел два указателя, другой остался без оных вообще. Вот и получилась утерянная память.
Proger (2004-06-27 23:31:00) [23]2 MrAngel.Дык я так и делал а она...
2 cyborg.Попробую
cyborg (2004-06-27 09:10:00) [24]
> [11] Proger (27.06.04 00:11)
Всё подходит, справку нужно читать внимательно!
Move(Sprite2,Sprite1,SizeOf(TSprite))
Если Sprite - указатель, то:
Move(Sprite2^,Sprite1^,SizeOf(TSprite))
GrayFace (2004-06-27 04:39:00) [25]Наверняка, единственный способ - создавать новый объект и заполнять вручную.
MrAngel (2004-06-27 03:28:00) [26]Дело в том что если нет этого Assign, то надо его самому писать.
Внутри делаешь обыкновенные присваивания типа поле1 := поле2 и т.д.
Всё очень просто до безобразия.
Огромное Кулясище (2004-06-27 01:00:00) [27]2 Anatoly Podgoretsky:
Как же утерянная? Это же именно указатели, мы же разорились только на адрес, не на вторую копию.
Допустим, некий модуль, имеющий статус движка, работает с каким-то компонентом (PaintBox, например). Внутри он имеет глобальную переменную этого класса. При инициализации движка пользователь укажет, какой именно PaintBox формы использовать путём присвоения указателей.
GuAV (2004-06-27 00:56:00) [28]
> SizeOf(Spr)
SizeOf(Spr)=4
> if Num > Length then Num := Length;
к чему это?
GuAV (2004-06-27 00:48:00) [29]
> Не подкинешь ссылок на подобную тему?
по Assign TPersistent+F1
по классам class+F1->About class types, отсюда и далее
Proger (2004-06-27 00:11:00) [30]2 cyborg ©.Блин и твой метод неподходит.Вот кусок кода:
if (GetAsyncKeyState(VK_Space) <> 0) and (P2Count2 >= RocketTime) then
begin
P2Count1 := GetTickCount;
Rocket.X := Pad2.X + Pad2.GetSprWH div 4;
Rocket.Y := Pad2.Y + 32;
Rocket.MoveAngle := 90;
Rocket.SetFramePos(1);
for i := 0 to R2.GetListLength do
if R2.GetSpr(i) = nil then
begin
R2.SetSpr(Rocket, i);
break;
end;
end;
procedure TSpriteList.SetSpr(Spr: TSprite; Pos: word);
begin
if Num > Length then Num := Length;
Move(Spr, SprList[Pos], SizeOf(Spr));
end;
cyborg (2004-06-26 21:44:00) [31]Move()
Proger (2004-06-26 20:18:00) [32]2 Anatoly Podgoretsky ©.В том то и дело, что я немогу сделать
чтоб Sprite1 небыл указателем на Sprite2, ну или что то типа
того :-)
Anatoly Podgoretsky (2004-06-26 20:11:00) [33]Первый указатель равен второму - зачем два одинаковых указателя?
Anatoly Podgoretsky (2004-06-26 20:10:00) [34]Утереняя память
Огромное Кулясище (2004-06-26 20:01:00) [35]2 Anatoly Podgoretsky:
Почему такой совет?
Proger (2004-06-26 18:45:00) [36]2 MrAngel.Неполучается ,т.к в классе TSprite нет метода Assign:-(
2 GuAV ©.Не подкинешь ссылок на подобную тему?
MrAngel (2004-06-26 17:21:00) [37]Если хочешь что бы было обыкновенное присваивание значений свойств и полей то сделай так Sprite1.Assign(Sprite2);
Anatoly Podgoretsky (2004-06-26 16:49:00) [38]Proger (26.06.04 16:12) [1]
Не делай так
GuAV (2004-06-26 16:16:00) [39]Рекомендую почитать про классы. и про assign.
> Я так понял здесь передаётся адрес Sprite2, из-за чего естественно
> при манипуляциях с Sprite1 меняется иSprite2 и наоборот
заместо "и" писать "только", т.е. Sprite1 уже не меняется
Proger (2004-06-26 16:12:00) [40]Sorry.Забыл сказать в чём проблема, хотя и сами наверное
догадались, короче нужно чтоб такой фигни небыло.