Can a function access variable which were not input variables?
27 views (last 30 days)
Show older comments
I'm trying to write a function to avoid repetition in my code, I and noticed that one task always comes in pairs. So I tried to write a function to do two at a time like this:
function [intlat, intlon] = diffhy(varin)
lat = eval(strcat(varin, 'intlat')
lat = eval(strcat(varin, 'intlon')
intlat = diff(lat,1))/-2;
intlon = diff(lat,1))/-2;
end
The problem is that it identifies variables to perform an operation, but they are in another workspace (the main code), so it can't do anything with them. Is there a solution to this? I've heard of global variable but also that they really aren't recommended.
4 Comments
Stephen23
on 12 Oct 2018
Edited: Stephen23
on 12 Oct 2018
The simplest solution would be for you to put those variables into a structure, and then simply pass that structure as an input argument: this would be simple, efficient, easy to debug... which is why it is the recommended way to pass many parameters to a function.
This is NOT recommended:
lat = eval(strcat(varin, 'intlat')
lat = eval(strcat(varin, 'intlon')
DO NOT DO THIS.
Your approach is forcing you down a very bad path. Using eval and/or magically accessing variables in other workspace is one way that beginners force themselves into writing slow, complex, buggy code that is hard to debug. Read this to know why:
"Is there a solution to this? I've heard of global variable but also that they really aren't recommended."
Global variables should be avoided. Magically accessing variable names should be avoided. The best way to pass data from one function to another is to simply pass it as input/output arguments. This is exactly what the MATLAB documentation recommends:
Answers (1)
Stephen23
on 12 Oct 2018
Edited: Stephen23
on 12 Oct 2018
"Can a function access variable which were not input variables?"
function mainfun()
a = 'not an input to NESTFUN';
nestfun()
function nestfun()
disp(a)
end
end
And tested:
>> mainfun()
not an input to NESTFUN
Or just put the data into one structure and pass that as an input argument: simple, efficient, easy to debug.
6 Comments
Stephen23
on 12 Oct 2018
Edited: Stephen23
on 12 Oct 2018
"What I want to know is whether it's possible not whether you like it."
It is possible, but not really with eval: the link I gave you lists the functions that you could use to magically access variables in a calling function, so I am sure that you didn't miss them.
"I'm not sure why you've got such a bee in your bonnet about it."
Lol. I guess this means the authors of MATLAB must also have bees in their bonnets, because they devoted a whole page of the help specifically advising users to avoid doing what you are trying to do (note that while this page uses eval for its examples, it applies to all methods of string evaluation):
See Also
Categories
Find more on Scope Variables and Generate Names in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!