MATLAB: Using a structure as a global variable

globalstructurestructure array

I want to use a structure as a global variable. This code is an example of the function:
function setGlobalx()
global measBuff
measBuff(1:6) = struct('timeUtc',1,'timePeakOff',2,'peak',3,'mean',4,'eventT',5); %initialize structure


If I call it using:
setGlobalx
global measBuff
display(measBuff)
I get an error on line 3 of the function:
The following error occurred converting from struct to double:
Error using double
Conversion to double from struct is not possible.
Error in setGlobalx (line 3)
measBuff(1:6) = struct('timeUtc',1,'timePeakOff',2,'peak',3,'mean',4,'eventT',5); %initialize structure
Error in Untitled7 (line 3)
setGlobalx
However, if I change the function to:
function setGlobalx2()
measBuff(1:6) = struct('timeUtc',1,'timePeakOff',2,'peak',3,'mean',4,'eventT',5); %initialize structure
global x
x=measBuff
and run
%call function having global variable x
setGlobalx2
global x
display(x);
I get no errors and the structure x is global.
Can anyone tell me why the first method doesn't work? Thanks.

Best Answer

DO NOT USE GLOBALS.
You could avoid the whole problem by not using globals. Just because some beginners like to use global variables does not make them a good way to code: it makes debugging very difficult, and produces bugs that are quite opaque. Avoid globals, and simply pass your data using any of the preferred and reccomended methods given in the MATLAB documentation: passing arguments, nested functions, etc.:
In any case, your bug is easy to figure out, once you actually read the global documentation, which clearly states that "if the global variable does not exist the first time you issue the global statement, it is initialized to an empty 0x0 matrix."
In your first function the global does not exist at the point where you declare it to be global, then MATLAB creates it as an empty matrix (of the default class double). Clearly an empty matrix does not have elements one to six, and is not a structure, so you attempt to force a structure into it is an error. So, you are basically doing this:
>> A = [];
>> A(1:6) = struct('x',1)
??? The following error occurred converting from struct to double:
Error using ==> double
Conversion to double from struct is not possible.
The solution? Avoid using globals. Pass you data properly.