Page 1 of 2

NXC NXT 2.0 test_release20111215 file error

Posted: 17 Dec 2011, 16:48
by h-g-t
Decided to change the first part of a program which was working but now get a "file error!".

It compiles on both my older version and the latest version of BCC without any syntax errors but only runs down to line 196.

When I press the centre button there is a beep, a very brief pause, then the error message appears.

This is the first time I have used arrays so the problem might be there.

I have tried changing bits here and there but to no avail and am now totally stumped.

What I am trying to do is put names on the left side of the screen, a marker which will either be "+" or " " to the side of each name, and a moving pointer "<<" beside the name currently selected.

It is probably something simple but I just can't see it.

Any assistance would be appreciated.
Scrap ZZ V1-5.zip
Part of file which gives error message.
(2.88 KiB) Downloaded 326 times

Re: NXC NXT 2.0 test_release20111215 file error

Posted: 17 Dec 2011, 18:16
by mattallen37
It doesn't look like you set the size of the array "MM_Bool". To do so, you can statically set it while declaring it, like this:

Code: Select all

bool MM_Bool[5];
where the "5" is the number of elements to assign to it. If you want to resize it after declaration, you can use the "ArrayInit" function.

Also, array elements are addressed from 0 through (n-1), not 1 though n, where "n" is the number of elements.

For example, declaring MM_Bool to 5 elements, you address them using MM_Bool[0], MM_Bool[1], MM_Bool[2], MM_Bool[3], and MM_Bool[4].

Edit: and you program should have crashed at line 175 (where you tried to set the value of MM_Bool [1] before initializing the size of MM_Bool).

Edit2:
h-g-t wrote:This is the first time I have used arrays so the problem might be there.
Welcome to the wonderful world of programs crashing because of tiny writing errors, forgotten initializations, and all the rest :| It's worth it though, to be able to address variables by number :D

Re: NXC NXT 2.0 test_release20111215 file error

Posted: 17 Dec 2011, 18:45
by spillerrec
It is actually not just the MM_Bool variable, but the MM_Text and MM_Display variables too (as they are arrays of strings).
What surprises me is that it doesn't crash when you try to set an element in an array which does not exists, but does crashes when you try to read it again... I'm not using the most up-to-date firmware, but shouldn't it crash at both?

Edit:
Notice that "File error" also gives a number, you get -1 when you try to access an inaccessible element in an array and you get -5 if it cannot create an array because of memory constrains.

Re: NXC NXT 2.0 test_release20111215 file error

Posted: 17 Dec 2011, 18:47
by mattallen37
I think you're right, it probably should.

Re: NXC NXT 2.0 test_release20111215 file error

Posted: 17 Dec 2011, 19:04
by h-g-t
Thanks for the help.

I have now included a section to initialise the relays

ArrayInit (MM_Text," ",MM_Array_Size)
ArrayInit (MM_Bool,false,MM_Array_Size)
ArrayInit (MM_Display," ",MM_Array_Size)

MM_Text [1] = "<9vRELAY" ; // No if using Mindsensors relay driver
MM_Text [2] = "AUTFOCUS" ; // No if using manual focus
MM_Text [3] = "MIRROR" ; // No if mirror lock off
MM_Text [4] = "BRACKET" ; // No of exposure bracketing not set
MM_Text [5] = "LIMITED" ; // No if shooting limited pano

I no longer get a 'file error' message but the program now loops round (as it is supposed to), beeping every time but the only thing it displays is the '<<' pointer and the battery voltage!

Seems like the contents of MM_Text do not appear.

Re: NXC NXT 2.0 test_release20111215 file error

Posted: 17 Dec 2011, 19:45
by spillerrec
It worked just fine for me, but again, I'm haven't updated the compiler and firmware for some time now. And I cannot test it anymore as I just packed my NXT for transport as I'm going home to my parents for Christmas on Monday...

But you could try changing the ArrayInit()s to initiate to something else than " " like "empty MM_Text" so you can see if it actually writes anything.

Re: NXC NXT 2.0 test_release20111215 file error

Posted: 17 Dec 2011, 19:51
by h-g-t
Thanks, spellerrec, that worked!

But why are the values not getting changed by the subsequent re-assignment of different text to each element?

I have removed the gaps between the array name and the square brackets but that makes no difference.

EDITED

I put values into all the arrays during the initial definition and it worked.

Does that mean that an array which has been set up using ArrayInit can never be changed again?''

EDITED

It seems that the initial values in the array (whether set up initially or using ArrayInit) are not being changed by the subsequent re-assignments.

Re: NXC NXT 2.0 test_release20111215 file error

Posted: 17 Dec 2011, 20:15
by mattallen37
h-g-t wrote:...
Does that mean that an array which has been set up using ArrayInit can never be changed again?''
...
It seems that the initial values in the array (whether set up initially or using ArrayInit) are not being changed by the subsequent re-assignments.
Unless you use constants, you should always be able to re-assign values of elements.

I don't know that using arrays for strings is really a good idea. I haven't done much of it, as it always seems to give unexpected results. I'd suggest you use 5 "normal" strings, and then if needed, somehow address them with numbers (maybe using a switch).

Re: NXC NXT 2.0 test_release20111215 file error

Posted: 17 Dec 2011, 21:01
by h-g-t
Yes, I think you are right. Been looking around and the answer seems to lie in using the modified firmware, but I want the program to run on any brick with standard software so that is out.

I wanted to use arrays because I hoped to be able to expand it into a routine that I could reuse, but I will just have to make up some program-specific code, probably using cases as suggested.

Thanks for the help.

Re: NXC NXT 2.0 test_release20111215 file error

Posted: 20 Dec 2011, 16:12
by afanofosc
Any 2d array will not work with the standard firmware due to its bug in the REPLACE opcode. You need to use the enhanced NBC/NXC firmware if you want to use 2d arrays. An array of strings happens to be a 2d array since a string is an array of bytes.

John Hansen