Показать сообщение отдельно
Старый 18.03.2011, 09:56   #5
Venom2
 
Сообщений: n/a
Ответ: Как обратиться к экземпляру структуры по индексу?

Type Door
	Field ID%
End Type

Local Door.Door, i%

For i = 1 To 10
	Door = New Door
	; Функция Handle формирует индексную карту
	; записывая туда указатель на объект под его порядковым номером
	; возвращает соответственно порядковый номер
	Door\ID = Handle(Door)
Next

; Достаем из карты объект по индексу - порядковому номеру (1...N)
Door = Object.Door(3)
; Обязательно проверяем на нуль
; т.к. после удаления обьекта слот карты остается
; и под тем же индексом уже будет нуль
If Door <> Null Then Print(Str(Door\ID)) Else Print("Слот пустой!")

; Ну и еще один трюк, удаление всех объектов встроеным циклом
Delete Each Door

WaitKey()

End
И пример подобной карты на блице
Type Door
	; обязательные поля для размещения в индексной карте
	Field Link.Door, Index%
	; тут какие-то свои поля
End Type

;
; Кол-во слотов в индексной карте
;
Const MapSize% = 1024

;
; Создает дверь с индексом Index и размещает в карте Map
;
Function NewDoor.Door(Map.Door[MapSize], Index%)
	Local Door.Door
	Door = New Door
	Door\Index = Index
	Index = Index Mod MapSize
	Door\Link = Map[Index]
	Map[Index] = Door
	Return Door
End Function

;
; Удаляет дверь по индексу Index из карты Map
;
Function DeleteDoor(Map.Door[MapSize], Index%)
	Local Temp.Door, Door.Door
	Temp = Null
	Door = Map[Index Mod MapSize]
	While Door <> Null
		If Door\Index = Index Then
			If Temp <> Null Then
				Temp\Link = Door\Link
			Else
				Map[Index Mod MapSize] = Door\Link
			End If
			Delete Door
			Exit
		End If
		Temp = Door
		Door = Door\Link
	Wend
End Function

;
; Возвращает дверь по индексу Index из карты Map
;
Function GetDoor.Door(Map.Door[MapSize], Index%)
	Local Door.Door
	Door = Map[Index Mod MapSize]
	While Door <> Null
		If Door\Index = Index Then Return Door
		Door = Door\Link
	Wend
	Return Null
End Function

;
; Пример
;

Local DoorMap.Door[MapSize]

Local Door.Door, i%

For i = 1 To 10
	Door = NewDoor(DoorMap, i)
Next

Door = GetDoor(DoorMap, 3)
If Door <> Null Then Print(Str(Door\Index)) Else Print("Слот пустой!")

DeleteDoor(DoorMap, 3)

Door = GetDoor(DoorMap, 3)
If Door <> Null Then Print(Str(Door\Index)) Else Print("Слот пустой!")

WaitKey()

End
Т.е. получается массив однонаправленных списков, список растет в случае добавления обьекта в уже занятый слот, зависит от размера массива и функции распределения указателей (в данном элементарном случае это Mod)
 
Ответить с цитированием