Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с памятью [Delphi, Windows]


Страницы:   1 2

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.Забыл сказать в чём проблема, хотя и сами наверное
догадались, короче нужно чтоб такой фигни небыло.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо