|
Forum Index : Microcontroller and PC projects : PicoMite BASIC STRUCTs
| Author | Message | ||||
| Mark Regular Member Joined: 26/11/2022 Location: United StatesPosts: 90 |
I have been programming in PicoMite BASIC 6.02 and really enjoy it. I've been experimenting with the new STRUCT's and find them powerful. I find that arrays of STRUCTs inside a STRUCT don't behave as I am expecting; TYPE KeyLink Link AS INTEGER Key AS STRING LENGTH 15 END TYPE TYPE Tree TreeD AS INTEGER KeyLinks(20) AS KeyLink END TYPE DIM T as Tree, KL AS KeyLink DIM L as INTEGER, K as STRING This works, but there are couple things that don't work the way I expect based on my experience with other languages. When declaring an array outside of a STRUCT, you can define a CONST and use that to define the array size, but inside a STRUCT (KeyLInks), it seems like. you have to use a number. It seems like you can't use a subscript to access a KeyLinks member: KL = T.KeyLinks(10) This always seems to assign the value off T.KeyLinks(0) regardless of the subscript, but code like L = T.KeyLInks(10).Link K = T.KeyLinks(10).Key Seems to work as expected. |
||||
| toml_12953 Guru Joined: 13/02/2015 Location: United StatesPosts: 572 |
I wouldn't expect T.KeyLinks(10) to work. Each KeyLinks element is made up of a Link and a Key. You have to specify which one you want when referencing KeyLinks |
||||
| Mark Regular Member Joined: 26/11/2022 Location: United StatesPosts: 90 |
Thanks for responding. What I want to do is copy both the Key and Link parts of the KeyLink STRUCT at element 10 of the KeyLinks() array to the Key and Link parts of a scalar (non array) KeyLink variable. Why don't you expect it to work? (It doesn't). Mark |
||||
| bfwolf Senior Member Joined: 03/01/2025 Location: GermanyPosts: 191 |
Sometime during the development phase of "Structs" in MMBasic, I also had some idea, but Peter said it was impossible because the UDTs (Type .. End Type) are created in a "pre-scan phase" even before the program is finally started. Constants defined with 'CONST' are treated essentially the same way as variables, meaning they receive their value at runtime. They just can't be changed later with [LET] constName=<expression>. Therefore, it makes sense that arrays within 'Type .. End Type' must have a literal as their MaxIndex. As I see it, MS-VBA handles it the same way: https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/type-statement Surprisingly (I didn't know this), MS then switched from 'Type .. End Type' to 'Structure .. End Structure' in VB.NET, possibly to get closer to C/C++. No need to understand it — MS logic... https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/data-types/user-defined-data-type https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/structure-statement @Peter: This seems to be a bug - would also expect KL = T.KeyLinks(10) to work.. Regards, bfwolf Edited 2026-03-18 19:22 by bfwolf |
||||
| Mark Regular Member Joined: 26/11/2022 Location: United StatesPosts: 90 |
More playing with STRUCTs. This is just information, STRUCTs are working fine. I appreciate all the work that has gone into PicoMite BASIC. I'm treating my PicoMite as a retro computer and having a blast programming as I did (or should have) in the 1980's. Outside of STRUCTs, BASIC doesn't like array with 1 element. OPTION BASE 0 DIM I%(0) and OPTION BASE 1 DIM I%(1) Both cause Error: Dimensions But OPTION BASE 0 TYPE Test I(0) AS INTEGER END TYPE Is fine. However, it appears that MMBASIC treats this as if the I array has two elements. OPTION BASE 0 ... Test.I(0) = 0 Test.I(1) = 1 PRINT Test.I(0), Test.I(1) Prints 0 and 1 as expected. STRUCT(SIZEOF "Test") Reports the same size (16) regardless of whether you use I(0) or I(1). If I add an additional element to the STRUCT TYPE Test I(0) AS INTEGER J AS INTEGER END TYPE STRUCT(OFFSET "Test", "J") Reports 16, regardless of I(0) or I(1). Note, I noticed this behavior with a more complex STRUCT and simplified it for this post. These examples aren't intended to be useful code. Thanks Edited 2026-03-18 21:32 by Mark |
||||
| matherp Guru Joined: 11/12/2012 Location: United KingdomPosts: 11099 |
Both will be fixed in next RC |
||||
| Mark Regular Member Joined: 26/11/2022 Location: United StatesPosts: 90 |
Thanks for the information. |
||||
| The Back Shed's forum code is written, and hosted, in Australia. | © JAQ Software 2026 |