Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312 Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :
Message
par Le Soldat Inconnu » jeu. 21/juil./2005 8:42
Moi, pour faire ce genre de chose dans un code, je serais passer par une seule liste chainée avec un index qui différencie chaque liste stockée dedans, je m'explique :
j'aurai fait une Structure de ce type
Structure
Index.l
...
Le reste
...
EndStructure
Et après, suivant la liste qu'on souhaite, on recherche l'index que l'on souhaite.
Certainement plus lent au niveau code, mais un bon apprentissage pour ceux qui aime la bidouille
et on n'a pas besion de connaitre les pointeurs. Si ça peut donner des idées d'algo
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64) ]
VPureBasic
Messages : 7 Inscription : lun. 11/juil./2005 22:33
Localisation : Quebec - Canada
Message
par VPureBasic » jeu. 21/juil./2005 12:19
Salut Nico,
Je suis du meme avis que Le Soldat Inconnu. Je t'ai coder un petit exemple... pas parfait... mais surement un bon depart.
Code : Tout sélectionner
Structure NODE
*NextNode.NODE
*PrevNode.NODE
NumberID.l
EndStructure
Structure LIST
*HeadNode.NODE
*TailNode.NODE
*PredNode.NODE
*StopNode.NODE
SizeNode.l
NodePads.l
EndStructure
Structure MASTER_LIST
NumberID.l
ListAddr.l
EndStructure
NewList LIST_MasterList.MASTER_LIST()
; Fontion interne
Procedure.l LIST_GetAddress( ListID.l )
;
ResetList( LIST_MasterList() )
While NextElement( LIST_MasterList() )
If LIST_MasterList()\NumberID = ListID
ProcedureReturn LIST_MasterList()\ListAddr
EndIf
Wend
ProcedureReturn 0
;
EndProcedure
Procedure.l LIST_GetElement( *ListAddr.LIST,ElementID.l )
;
*ReadNode.NODE = *ListAddr\HeadNode
*StopNode.NODE = *ListAddr\StopNode
;
While *ReadNode <> *StopNode
If *ReadNode\NumberID = ElementID
ProcedureReturn *ReadNode
EndIf
*ReadNode = *ReadNode\NextNode
Wend
ProcedureReturn 0
;
EndProcedure
Procedure LIST_InitList ( *ListAddr.LIST,NodeSize.l )
;
*ListAddr\PredNode = *ListAddr
*ListAddr\HeadNode = *ListAddr + 4
*ListAddr\StopNode = *ListAddr + 4
*ListAddr\SizeNode = NodeSize
*ListAddr\TailNode = 0
*ListAddr\NodePads = 0
;
EndProcedure
Procedure LIST_ClearItem ( *NodeAddr.NODE )
;
*NextNode.NODE = *NodeAddr\NextNode
*PrevNode.NODE = *NodeAddr\PrevNode
;
*NextNode\PrevNode = *PrevNode
*PrevNode\NextNode = *NextNode
;
FreeMemory( *NodeAddr )
;
EndProcedure
Procedure LIST_ClearList ( *ListAddr.LIST )
;
While *ListAddr\PredNode <> *ListAddr
LIST_ClearItem( *ListAddr\PredNode )
Wend
;
EndProcedure
;
; fonctions de travail
Procedure LIST_DelElement( ListID.l,ElementID.l )
;
*ListAddr.LIST = LIST_GetAddress(ListID)
If *ListAddr <> 0
*NodeAddr.NODE = LIST_GetElement( *ListAddr,ElementID)
If *NodeAddr <> 0
LIST_ClearItem( *NodeAddr )
*ListAddr\NodePads = *ListAddr\NodePads - 1
EndIf
EndIf
;
EndProcedure
Procedure.l LIST_AddElement( ListID.l,ElementID.l )
;
If ElementID >= 0
If ListID >= 0
;LIST_DelElement( ListID,ElementID )
;
*ListAddr.LIST = LIST_GetAddress( ListID )
If *ListAddr <> 0
*NodeAddr.NODE = AllocateMemory( *ListAddr\SizeNode )
If *NodeAddr <> 0
*PrevNode.NODE = *ListAddr\PredNode
*PrevNode\NextNode = *NodeAddr
*NodeAddr\PrevNode = *PrevNode
*NodeAddr\NextNode = *ListAddr + 4
*NodeAddr\NumberID = ElementID
*ListAddr\PredNode = *NodeAddr
*ListAddr\NodePads = *ListAddr\NodePads + 1
ProcedureReturn *NodeAddr
EndIf
EndIf
EndIf
EndIf
ProcedureReturn 0
;
EndProcedure
Procedure LIST_DeleteList( ListID.l )
;
If ListID >= 0
ListAddr = LIST_GetAddress(ListID)
;
If ListAddr <> 0
LIST_ClearList( ListAddr )
DeleteElement( LIST_MasterList() )
EndIf
;
EndIf
;
EndProcedure
Procedure.l LIST_CreateList( NumberID.l,NodeSize.l )
;
If ListID >= 0
LIST_DeleteList(ListID)
;
If AddElement( LIST_MasterList() )
ListAddr = AllocateMemory(SizeOf(LIST))
;
If ListAddr <> 0
LIST_MasterList()\NumberID = ListID
LIST_MasterList()\ListAddr = ListAddr
LIST_InitList(ListAddr,NodeSize)
ProcedureReturn ListAddr
EndIf
;
EndIf
EndIf
ProcedureReturn 0
;
EndProcedure
Roger
La seule limite du PureBasic... c'est notre imagination!