Bug in Persistent variables? Simulink M-function

I am unable to initialize a Persistent variable. Here's a snippet of code in a Simulink M-function which does not actually set 'a' no matter what I do:
persistent a
if isempty(a)
a = 1;
end
Either printing out 'a' or evaluating 'a' gives
a=[]
...NOT a=1 as it should.
It doesn't matter what the variable name is, or what I try to set it to, or how many variables there are. This bug happens with two different sets of Persistent Variables.
However, oddly, later on in the SAME M-function, I do another persistent declaration using the exact same method and there initialization DOES work.
I tried this in both R2016a and 2017b
What is going on?

4 comentarios

John Pryce
John Pryce el 25 de Mayo de 2019
Editada: John Pryce el 25 de Mayo de 2019
This bug exists. My "main program" is a function with input arguments and the crash occurs some levels down inside an a function that is called by fzero(), so isolating the error was tricky.
I confirm what John says "It doesn't matter what the variable name is, or what I try to set it to". Further:
  • If it crashes and I immediately re-run with the same inputs it always goes on crashing.
  • If I then run with different inputs it may work correctly.
  • If after doing something else I re-run with the original inputs that caused the crash it may work correctly.
  • Changing the layout of code, or changing nearby code, may change it between working and crashing. E.g. I originally had if nargin>4, it = it0; end below, and changing it to what's written cured the problem – so I thought! But it reappeared with other inputs.
  • Stepping through in the debugger, with argument it0 absent so nargin>4 is false, I found that though it skipped the it = it0; statement, it nonetheless changed the value of it to an unpredictable value (e.g. 165) while going from if to end.
  • Once past this perilous initialisation, it seems it behaves as it should do.
The piece of code in question is
function [x,xp,it1] = searchAndInterp(tt,xx,xxp,t,it0)
% some comments
persistent it %Seems most economical way to implement this
itbefore=it %!!!DEBUGGING
if nargin>4
it = it0;
end
if isempty(it), it=1; end
itafter=it %!!!DEBUGGING
%...
That evidence should help locate where in the compiler the error is located. I have a file of relevant command window output but can't see how to attach it.
I'm using
-----------------------------------------------------------------------------------------------------
MATLAB Version: 9.5.0.944444 (R2018b)
Operating System: Mac OS X Version: 10.14.4 Build: 18E226
Java Version: Java 1.8.0_152-b16 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
-----------------------------------------------------------------------------------------------------
John
John el 25 de Mayo de 2019
Mathworks, any comment?
Odd indeed that it's still not fixed.
They never responded to the original bug either.
amin ya
amin ya el 29 de En. de 2020
I can confirm that this is a bug. I am on Matlab 2019b Update 3
John
John el 29 de En. de 2020
Amin, it's sad to see this major bug still exists after 2 years.
There has been no reply from Mathworks -- Mathworks, are there any plans to resolve this bug?

Iniciar sesión para comentar.

Respuestas (1)

John
John el 31 de En. de 2018
Okay, now I'm certain it's a BUG. The code WILL -- or will NOT -- properly initialize a variable depending on where it is located in the function, and what is around it. Even if the init is unrelated to the surrounding code.
Eg
<code 1>
persistent a
if isempty(a)
a = 1;
end
<code 2>
<code 3>
might NOT work, but
<code 1>
<code 2>
persistent a
if isempty(a)
a = 1;
end
<code 3>
WILL work.
The surrounding Code 1, 2, 3 are completely unrelated to the variable 'a'. Likewise, an init that DID work at a certain section will no longer work if it is moved.
Unfortunately, I cannot make the code work in places that I need it to, as it seems to be random why it works or is buggy.
Mathworks -- any response?

2 comentarios

I also have the same problem has it been solved?
John
John el 8 de Sept. de 2022
Editada: John el 8 de Sept. de 2022
Not resolved to my knowledge, unfortunately. You could try my workaround of finding a code order that may work for your code.

Iniciar sesión para comentar.

Categorías

Más información sobre Startup and Shutdown en Centro de ayuda y File Exchange.

Preguntada:

el 30 de En. de 2018

Editada:

el 8 de Sept. de 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by