Jump to content
Sign in to follow this  
qsek

Possible Maps Bug #2 - (Moved)

Recommended Posts

Im not sure if this is intended but normally Autoit variables are always passed as copies (except objects i think).

But below i observed an unconsistency when copying maps with nested maps inside.

Issue:

If you create a nested map1 and copy it to a new map2, changing a nested value in map2 will also change the nested value in map1

Dim $player[]
Dim $sub[]

$player.test1 = 1
$player.test2 = $sub
$player.test2.child1 = "org"
$player.test2.childext = $sub
$player.test2.childext.child1 = "org2"

$playerold = $player ; make a copy of the whole map

ConsoleWrite("player.test2.child1   : "& $player.test2.child1 & @CRLF); original nested value in $player

$playerold.test2.child1 = "changed" ; edit a nested value in $playerold

ConsoleWrite("player.test2.child1   : "& $player.test2.child1 & @CRLF) ; original nested value in $player changed

ConsoleWrite("---------------------" & @CRLF)

ConsoleWrite("player.test2.childext.child1   : "& $player.test2.childext.child1 & @CRLF); original level2 nested value in $player

$playerold.test2.childext.child1 = "changed2" ; edit a level2 nested value in $playerold

ConsoleWrite("player.test2.child1   : "& $player.test2.child1 & @CRLF); original level1 nested value in $player stayed the same

ConsoleWrite("player.test2.childext.child1   : "& $player.test2.childext.child1 & @CRLF); original level2 nested value in $player changed

 

Edited by qsek

Teamspeak 3 User Viewer - Quick and functional TS3 Query script, which shows online users.Cached Screenshot Deleter - Deletes older Fraps Screenshots if they exceed a specified limit.Unresolved Topics:Intercept and modify dragdrop text behaviour in scite

Share this post


Link to post
Share on other sites

That's how Map behaved. I used the past since it appears the implementation has a number of issues which precludes general public consumption.

Future will tell if they reappear in release versions but for now don't rely on beta Maps for serious apps.


This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Share this post


Link to post
Share on other sites

@qsek I just tried playing around with scripting dictionaries as they have similar uses, and they seem to behave the same way (although I could not get it to add a key/value pair to the nested, nested dictionary); updates to the nested dict updated the original.

#include <Array.au3>

Local $oPlayer = _DictionaryCreate()
Local $oSub = _DictionaryCreate()

$oPlayer.Add("test1", 1)
$oPlayer.Add("test2", $oSub)
$oPlayer("test2").Add("child1", "org")
$oPlayer("test2").Add("childext", $oSub)
;~ $oPlayer("test2").("childext").Add("child1", "org2")

Local $aItems = $oPlayer.Items
_ArrayDisplay($aItems,"oPlayer")

$aItems = $oPlayer.Item("test2").Items
_ArrayDisplay($aItems,"oPlayer.test2")


$oPlayer.Item("test2").Item("child1") = "childchanged"

$aItems = $oSub.Items
_ArrayDisplay($aItems,"oSub")


Func _DictionaryCreate()
    Local $oDict = ObjCreate("Scripting.Dictionary")
    If @error Then Return SetError(@error, 0, 0)
    Return $oDict
EndFunc

 

Edited by spudw2k

Share this post


Link to post
Share on other sites

@spudw2k not really the same. As expected because it is an object that will execute Methods on its own and give the data to the parent.

That is also why you cannot add the 2nd level "child1" in

$oPlayer.Item("test2").Item("childext").Add("child1", "org2")

Because you already added it one level higher before to the same $oSub:

$oPlayer.Item("test2").Add("child1", "org")

Essentially what you are doing is

$oPlayer.Item("test2").{ $oSub.Add("child1", "org") }
$oPlayer.Item("test2").Item("childext").{ $oSub.Add("child1", "org") }

Also your $oSub on its own fills with items as you use it with $oPlayer as parent.

My Map $sub on the other hand will not fill with items. It is empty if you look at it after filling it with data with $player as parent. So internally it will create a new Map everytime you assign a submap like so.

$player.test2 = $sub

  and also when creating a second version on a deeper level in one parentmap. I think this is intended as you dont have a ObjCreate with Maps. However if the whole map is copied, it creates references of the individual submaps in the copied one, which i think is not intended.

 

 


Teamspeak 3 User Viewer - Quick and functional TS3 Query script, which shows online users.Cached Screenshot Deleter - Deletes older Fraps Screenshots if they exceed a specified limit.Unresolved Topics:Intercept and modify dragdrop text behaviour in scite

Share this post


Link to post
Share on other sites

After some trying i found a workaround:

Dim $player[]
Dim $sub[]

$player.test1 = 1
$player.test2 = $sub
$player.test2.child1 = "org"
$player.test2.childext = $sub
$player.test2.childext.child1 = "org2"

$player.a = $player     ; make a temporary copy of the whole map inside an unused key of the map to be copied.
                        ; This also forces the submaps to get their unique copies and all references to 'root' $player are cut.
$playerold = $player.a  ; So $playerold will recieve a independent copy of $player
MapRemove($player, "a") ; Temporary copy not needed any more

ConsoleWrite("player.test2.child1   : "& $player.test2.child1 & @CRLF); original nested value in $player

$playerold.test2.child1 = "changed" ; edit a nested value in $playerold

ConsoleWrite("player.test2.child1   : "& $player.test2.child1 & @CRLF) ; original nested value in $player changed

ConsoleWrite("---------------------" & @CRLF)

ConsoleWrite("player.test2.childext.child1   : "& $player.test2.childext.child1 & @CRLF); original level2 nested value in $player

$playerold.test2.childext.child1 = "changed2" ; edit a level2 nested value in $playerold

ConsoleWrite("player.test2.child1   : "& $player.test2.child1 & @CRLF); original level1 nested value in $player stayed the same

ConsoleWrite("player.test2.childext.child1   : "& $player.test2.childext.child1 & @CRLF); original level2 nested value in $player changed

 

Edited by qsek

Teamspeak 3 User Viewer - Quick and functional TS3 Query script, which shows online users.Cached Screenshot Deleter - Deletes older Fraps Screenshots if they exceed a specified limit.Unresolved Topics:Intercept and modify dragdrop text behaviour in scite

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Mbee
      Hi!
      I'm using Maps (and I love 'em!), so I have to use the latest AutoIt Beta. I've switched to Beta mode, and the graphical debugger doesn't even show up in the Explorer context menu (not surprising). So I'd like to use _Dbug (rather than a large number of MsgBox statements), but it fails when it encounters a Map function (such as MapExists). I've made a request for a version that will work with the Beta, but going on past history, I don't expect an answer anytime soon.
      I'm not necessarily asking for someone else to modify _Dbug, because I can probably do it myself, as long as I know how to adapt it to use the Beta. Can someone please enlighten me as to how to adapt a UDF or other function to use AutoIt Beta?
      Thanks!
    • By MarcoMonte
      Hello Everyone,
      Hoping someone can help me,
      I am totally stuck on this problem,

      I cannot reach the textarea and the button in a maps page that I get by clicking on a button in a previus page, the only way I can interact with this is using tab and mouseclick but this is a danger method as  you know.

      I get the handle by using: $Posizione = _IEAttach("Ricerca Indirizzo su mappa")

      then I tried a lot of things but nothing works, can someone give me a hint?
      --------------------
      WinWait("Ricerca Indirizzo su mappa")
      sleep(1000)
      $Posizione = _IEAttach("Ricerca Indirizzo su mappa")
      WinSetState ("Ricerca Indirizzo su mappa", "", @SW_MAXIMIZE  )
      WinActivate("Ricerca Indirizzo su mappa")
      sleep(500)
      ;~ $oForm = _IEFormGetObjByName($Posizione, "form1");Punta il Form
      $oText = _IEFormElementGetObjByName($Posizione,"indirizzo")
      $oText = _IEFormElementGetObjByName($Posizione,"writeAddress")

      ;~ $LenteTestoMess = _IEFormElementGetValue($oText);Inserisce il PrimoRepertorio nella variabile
      ;~ _IELinkClickByText($Posizione, $oForm);Clicca su Aggiorna ed invia il form
      _IEFormElementSetValue ($oText,"via Ravenna 12" );Completamento campo testo
      ----------------------------------------------------
      Mappa.odt Ricerca Indirizzo su mappa.htm
    • By argumentum
      #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) Global $edit, $GuiChild = 0 GuiExample() Func GuiExample() ; https://www.autoitscript.com/forum/topic/202986-parent-child-guis-and-input-control-fails/ Local $GuiMain = GUICreate("GuiExample w/child (parent)", 350, 300) GUISetOnEvent($GUI_EVENT_CLOSE, "GuiOnEvent_CLOSE", $GuiMain) GUISetState(@SW_SHOW, $GuiMain) $edit = GUICtrlCreateEdit("", 10, 70, 300, 200) ; It does not matter what GUI is on, GUICtrlSetData($edit, "play around with the inputs" & _ ; the parent's controls will @CRLF & "and press enter." & _ ; bleed through a $WS_CHILD gui. @CRLF & @CRLF & "It should trigger the" & _ @CRLF & " GUICtrlSetOnEvent()") GUICtrlCreateButton("reload alt.", 225, 40, 120, 25) ; run alternate versions, GUICtrlSetOnEvent(-1, "OnBttnRunAlt") ; with and without child GUI. GUICtrlSetTip(-1, "run alternate versions," & @LF & "with and without child GUI.") ;I need this child(s), but with it, it does not behave as expected. ;..for this test you can comment it out, to see that it should work. ;..but with the child, instead it executes after clicking another control. If Not StringInStr($CmdLineRaw, "/ExampleOnlyParent") Then $GuiChild = GUICreate("GuiExample w/child (child)", 320, 280, 5, 5, $WS_CHILD, $WS_TABSTOP, $GuiMain) EndIf If $GuiChild Then GUISetBkColor(0x888888, $GuiChild) ; for the dramatic effect :) If $GuiChild Then GUISwitch($GuiChild) ; ..just in case.. tho should not matter. GUICtrlCreateInput("This text 1", 5, 10, 200, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_WANTRETURN)) GUICtrlSetOnEvent(-1, "OnInputEnterKeyOne") GUICtrlCreateInput("This text 2", 5, 35, 200, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_WANTRETURN)) GUICtrlSetOnEvent(-1, "OnInputEnterKeyTwo") If $GuiChild Then GUICtrlCreateButton("flash child", 220, 8, 120, 25) GUICtrlSetOnEvent(-1, "OnFlashBttn") GUISetState(@SW_SHOW, $GuiChild) OnFlashBttn() EndIf MainLoopExample() EndFunc Func MainLoopExample() While 1 Sleep(100) WEnd EndFunc Func OnInputEnterKeyOne() GUICtrlSetData($edit, @SEC &'.' & @MSEC& ' - Func OnInputEnterKey One ()' & @CRLF) EndFunc Func OnInputEnterKeyTwo() GUICtrlSetData($edit, @SEC &'.' & @MSEC& ' - Func OnInputEnterKey Two ()' & @CRLF) EndFunc Func OnFlashBttn() WinSetTrans($GuiChild, "", 50) Sleep(300) WinSetTrans($GuiChild, "", 255) EndFunc Func OnBttnRunAlt() If StringInStr($CmdLineRaw, "/ExampleOnlyParent") Then ShellExecute(@ScriptFullPath, "") Else ShellExecute(@ScriptFullPath, "/ExampleOnlyParent") EndIf GuiOnEvent_CLOSE() EndFunc Func GuiOnEvent_CLOSE() GUIDelete() Exit EndFunc I need this child(s), but with it, it does not behave as expected.
      ..for this test you can comment the child GUI out, to see that it should work.
      With the child, instead it executes after clicking another control.
      Thanks
      Edit: Modified the example for dramatic effect  
      Edit 2: Solved my problems at a post somewhere down this thread.
    • By EmilyLove
      What is Rollbar?
      Rollbar provides real-time error alerting & debugging tools for developers. Learn more about it at https://rollbar.com/product/
      Demo: https://rollbar.com/demo/demo/
      Screenshot:
      Instructions: (RollbarTest.au3)
      ; Include RollbarSDK #include "RollbarSDK.au3" ;Turns on ConsoleWrite debugging override. ;Global $Rollbar_Debug=False ; Initialize RollbarSDK with the project's API key. ; Parameters ....: $__Rollbar_sToken - [Required] Go to https://rollbar.com/<User>/<ProjectName>/settings/access_tokens/ for your project. Use the token for post_server_item. _Rollbar_Init("eaa8464a4082eeabd9454465b8f0c0af") ; Write code that causes an error you want to catch, then call ; _Rollbar_Send ; Parameters ....: $__Rollbar_sErrorLevel - [Required] Must be one of the following values: Debug, Info, Warning, Error, Critical. ; $__Rollbar_sMessage - [Required] The message to be sent. This should contain any useful debugging info that will help you debug. ; $__Rollbar_sMessageSummary - [Optional] A string that will be used as the title of the Item occurrences will be grouped into. Max length 255 characters. If omitted, Rollbar will determine this on the backend. _Rollbar_Send("Debug", "This is an debug message. If you received this, you were successful!", "Debug Message") _Rollbar_Send("Info", "This is a test message. If you received this, you were successful!", "Info Message") _Rollbar_Send("Warning", "This is an warning message. If you received this, you were successful!", "Warning Message") _Rollbar_Send("Error", "This is an error message. If you received this, you were successful!", "Error Message") _Rollbar_Send("Critical", "This is an critical message. If you received this, you were successful!", "Critical Message") _Rollbar_Send("Info", "This is a test message. If you received this, you were successful!") ;No Message ; Rollbar_Send's helper functions ; Parameters ....: $__Rollbar_sMessage - [Required] The message to be sent. This should contain any useful debugging info that will help you debug. ; $__Rollbar_sMessageSummary - [Optional] A string that will be used as the title of the Item occurrences will be grouped into. Max length 255 characters. If omitted, Rollbar will determine this on the backend. _Rollbar_SendDebug("This is an debug message. If you received this, you were successful!", "Debug Message") _Rollbar_SendInfo("This is a test message. If you received this, you were successful!", "Info Message") _Rollbar_SendWarning("This is an warning message. If you received this, you were successful!", "Warning Message") _Rollbar_SendError("This is an error message. If you received this, you were successful!", "Error Message") _Rollbar_SendCritical("This is an critical message. If you received this, you were successful!", "Critical Message") ; Usable Example Local $sImportantFile = "C:\NOTAREALFILE_1234554321.txt" Switch FileExists($sImportantFile) Case True MsgBox(0, "Example Script", "An important file was found. Continuing...") Case Else _Rollbar_SendCritical('An important file was missing. Halting... File: "' & $sImportantFile & '"', 'Important file "' & $sImportantFile & '" is missing.') EndSwitch Notes: Please comment your feedback, advice, & suggestions below. While this is only a proof of concept, I will expand its feature set for everyone to use. 
      Right now, it is fully functional but not tested in production.
       
       
      Changelog:
      RollbarSDK.au3
      RollbarTest.au3
      v0.2
       
      v0.1.1
       
    • By EmilyLove
      As the title says, when a script that is stored on a Google Drive File Stream drive is ran or compiled, it fails to work at all.
      Basically, Google Drive File Stream creates a G:\ drive where you can access all your files. The difference between this and Google Backup and Sync is your files are downloaded as needed rather than they always be downloaded and taking up storage. 
      How to Reproduce Bug
      1. Download and Install Google Drive File Stream
      2. Sign into Google Drive File Stream with a G Suite account. 
      3. Create a AutoIt Script and save it to Google Drive File Stream. (See attached file)
      4. Attempt to run or compile this AutoIt Script. 
       
      AutoIt appears to act like the script is (incorrectly) empty and ends immediately. (You can kind of tell based on file sizes from a successful and failed compile).
      I've also attached a Process Monitor log file. Hopefully someone can figure this out, because having to move the script out of the drive just to run or compile it is super annoying and I lose version revisioning Google Drive provides me.
      test.au3
      Logfile.PML
×
×
  • Create New...