Scirra / Construct-bugs

Public bug report submissions for Construct 3 and Construct Animate. Please read the guidelines then click the 'Issues' tab to get started.
https://www.construct.net
107 stars 83 forks source link

dictionary and function problem #4583

Open eleanorjmorel opened 3 years ago

eleanorjmorel commented 3 years ago

Problem description

I'm trying to make a fibonacci with the built in function if i do it like this: image

the key that was just created in the add key action is not found in the set return value action and it returns 0

but if i do it like this image

it'S basically the same thing, as far as I know, but it returns the correct key ( i think?)

Attach a .c3p

https://drive.google.com/file/d/19a5mE1WErW8TA1Oyb-XMQped05FWhFDB/view?usp=sharing

Steps to reproduce

  1. run the project
  2. enter a number in the text input box
  3. press the broken fast fib button
  4. it prints 0
  5. press either slow fib (if the number is small enough, below 30 is prefered) or working fast fib
  6. the correct number should appear

Observed result

it returns 0

Expected result

it returns the correct number

More details

Affected browsers/platforms:

First affected release:

System details

View details Platform information Browser: Chrome Browser version: 88.0.4324.150 Browser engine: Chromium Browser architecture: 64-bit Context: webapp Operating system: Windows Operating system version: 10 Operating system architecture: 64-bit Device type: desktop Device pixel ratio: 1 Logical CPU cores: 12 Approx. device memory: 8 GB User agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 C3 release: r234.4 (stable) Language setting: en-US Local storage Storage quota (approx): 251 gb Storage usage (approx): 705 mb (0.3%) Persistant storage: Yes Browser support notes This list contains missing features that are not required, but could improve performance or user experience if supported. Nothing is missing. Everything is OK! WebGL information Version string: WebGL 2.0 (OpenGL ES 3.0 Chromium) Numeric version: 2 Supports NPOT textures: yes Supports GPU profiling: yes Supports highp precision: yes Vendor: Google Inc. Renderer: ANGLE (NVIDIA GeForce GTX 980 Ti Direct3D11 vs_5_0 ps_5_0) Major performance caveat: no Maximum texture size: 16384 Point size range: 1 to 1024 Extensions: EXT_color_buffer_float EXT_color_buffer_half_float EXT_disjoint_timer_query_webgl2 EXT_float_blend EXT_texture_compression_bptc EXT_texture_compression_rgtc EXT_texture_filter_anisotropic EXT_texture_norm16 KHR_parallel_shader_compile OES_texture_float_linear WEBGL_compressed_texture_s3tc WEBGL_compressed_texture_s3tc_srgb WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_lose_context WEBGL_multi_draw OVR_multiview2 Audio information System sample rate: 48000 Hz Output channels: 2 Output interpretation: speakers Supported decode formats: WebM Opus (audio/webm; codecs=opus) Ogg Opus (audio/ogg; codecs=opus) WebM Vorbis (audio/webm; codecs=vorbis) Ogg Vorbis (audio/ogg; codecs=vorbis) MPEG-4 AAC (audio/mp4; codecs=mp4a.40.5) MP3 (audio/mpeg) FLAC (audio/flac) PCM WAV (audio/wav; codecs=1) Supported encode formats: WebM Opus (audio/webm; codecs=opus) Video information Supported decode formats: WebM AV1 (video/webm; codecs=av01.0.00M.08) MP4 AV1 (video/mp4; codecs=av01.0.00M.08) WebM VP9 (video/webm; codecs=vp9) WebM VP8 (video/webm; codecs=vp8) Ogg Theora (video/ogg; codecs=theora) H.264 (video/mp4; codecs=avc1.42E01E) Supported encode formats: WebM VP9 (video/webm; codecs=vp9) WebM VP8 (video/webm; codecs=vp8)
AshleyScirra commented 3 years ago

This turns out to be an extremely complicated recursion problem in the event engine. The problem is that in the broken case, it is recursing in to a function that manipulates the dictionary object, in the middle of an "Add key" action that itself manipulates the dictionary object. In other words you end up nesting 'Add key' actions, which the event system was not designed to support. The working case avoids this by first doing all the recursion and saving the result in a local variable, then doing a simple "Add key" action that does not involve recursion, so is guaranteed to work correctly.

I'll see if any changes can be made to the event engine to support this case, but I'd advise that the working case is the right way to do this anyway, since nesting recursive dictionary operations within one another is a mind-bendingly complicated thing to do.

Emmaheroe commented 3 years ago

did you try to add a wait 0.1sec between the data and the function? maybe it helps too