jruelan Posted October 11, 2007 Share Posted October 11, 2007 can autoit do linked list? and OOP? Link to comment Share on other sites More sharing options...
weaponx Posted October 11, 2007 Share Posted October 11, 2007 (edited) You could fake it (maybe): $string = "char firstname[128];char lastname[128];ptr next" $head = DllStructCreate ($string) DllStructSetData($head,1,"John") DllStructSetData($head,2,"Smith") DllStructSetData($head,3,"") $headPtr = DllStructGetPtr ( $head) $firstElement = DllStructCreate ($string) DllStructSetData($firstElement,1,"John") DllStructSetData($firstElement,2,"Smith") DllStructSetData($firstElement,3,"") DllStructSetData($head,3,DllStructGetPtr ($firstElement)) EDIT - changed last line Edited October 11, 2007 by weaponx Link to comment Share on other sites More sharing options...
SkinnyWhiteGuy Posted October 11, 2007 Share Posted October 11, 2007 (edited) You could fake it (maybe): $string = "char firstname[128];char lastname[128];ptr next" $head = DllStructCreate($string) DllStructSetData($head,1,"John") DllStructSetData($head,2,"Smith") DllStructSetData($head,3,"") $headPtr = DllStructGetPtr($head) $firstElement = DllStructCreate($string) DllStructSetData($firstElement,1,"John") DllStructSetData($firstElement,2,"Smith") DllStructSetData($firstElement,3,"") DllStructSetData($head,2,DllStructGetPtr($firstElement)) I think you meant that last line to be DllStructSetData($head,3,DllStructGetPtr($firstElement)) Otherwise, the first John Smith no longer has a last name. Edit: As to OOP, that is not currently supported, see here. Edited October 11, 2007 by SkinnyWhiteGuy Link to comment Share on other sites More sharing options...
weaponx Posted October 11, 2007 Share Posted October 11, 2007 The problem with the above code is that in order to loop through a linked list you need to be able to read a structure by it's pointer, and although you can get a structures pointer, the DllStructGetData() function uses the handle of the structure to read from it and not the pointer. Someone correct me if i'm wrong. So i guess instead of storing a pointer to the next element perhaps you could store the autoit handle of the structure? I tried this code below but I don't know what datatype the Autoit structure handle is so it doesn't work as expected: ;$string = "char firstname[128];char lastname[128];ptr next" $string = "char firstname[128];char lastname[128];hwnd next" $head = DllStructCreate ($string) DllStructSetData($head,1,"John") DllStructSetData($head,2,"Smith") DllStructSetData($head,3,"") ;$headPtr = DllStructGetPtr ( $head) $firstElement = DllStructCreate ($string) DllStructSetData($firstElement,1,"Steve") DllStructSetData($firstElement,2,"Jones") DllStructSetData($firstElement,3,"") ;Assign next pointer by actual pointer ;DllStructSetData($head,3,DllStructGetPtr ($firstElement)) ;Assign next pointer by autoit handle DllStructSetData($head,3,$firstElement) ;Expecting: Steve ;Actual: 0 MsgBox(0,"",DllStructGetData(DllStructGetData($head,3),1)) ;Display all elements $nodePtr = $head While $nodePtr <> "" ;Get next element MsgBox(0,"",DllStructGetData($nodePtr,1)) $nodePtr = DllStructGetData($nodePtr,3) WEnd Link to comment Share on other sites More sharing options...
weaponx Posted October 11, 2007 Share Posted October 11, 2007 Does anyone know if there is a way to store the handle from DllStructCreate() in an already created structure? (i.e. what datatype is the internal AutoIt handle) - or - How can you use DllStructGetData() if you only have a pointer to a previously created structure? Link to comment Share on other sites More sharing options...
weaponx Posted December 19, 2007 Share Posted December 19, 2007 Here is a working example of a linked list. I'm not sure how well it performs though. I thought I read somewhere that DllStruct* commands can be much slower than reading from an array for example. Credit goes to Valik for pointing out the mistakes in the previous post. Local $string = "char firstname[128];char lastname[128];ptr next" Local $head = DllStructCreate ($string) Local $headPtr = DllStructGetPtr ( $head) DllStructSetData($head,1,"First Name 1") DllStructSetData($head,2,"Last Name 1") DllStructSetData($head,3,0) Local $firstElement = DllStructCreate ($string) DllStructSetData($head, 3, DllStructGetPtr($firstElement)) DllStructSetData($firstElement,1,"First Name 2") DllStructSetData($firstElement,2,"Last Name 2") DllStructSetData($firstElement,3,0) Local $pNext = $headPtr While $pNext <> 0 Local $current = DllStructCreate($string, $pNext) ConsoleWrite(DllStructGetData($current, 1) & @CRLF) ConsoleWrite(DllStructGetData($current, 2) & @CRLF) $pNext = DllStructGetData($current, 3) WEnd Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now