Explanation of the following eval expression

3 vues (au cours des 30 derniers jours)
Jacek Soroko
Jacek Soroko le 25 Jan 2021
Modifié(e) : Stephen23 le 26 Jan 2021
Hello everyone,
I am trying to understand how these two lines below works. Would appreciate if someone could help.
eval(['cd(''',filePath,''')'])
&
eval(['cd(''',cdold,''')']);
These two lines are taken from the following code:
...
cdold = cd;
[file, filePath] = uigetfile('lkDAT*.m','Please select a file');
eval(['cd(''',filePath,''')']); data = strtok(file,'.');
[LNK, dist, CSA, VNL, VNCalc, tn] = feval(data);
fprintf( '\nRead data from m-file %s',data);
eval(['cd(''',cdold,''')']);
fd=fopen(outputFile,'wt');
fprintf(fd,'\n*** %s - line parameters ***', outputFile);
fprintf(fd,'\n Date: %5d-%2d-%2d hour. %2d, %2dmin, %2.0fs',clock);
fprintf(fd,'\nRead data from m-file: %s', data);
...
Thanks.
  1 commentaire
Stephen23
Stephen23 le 26 Jan 2021
Modifié(e) : Stephen23 le 26 Jan 2021
"Explanation of the following eval expression"
Totally pointless eval usage by someone who does not understand MATLAB basics (i.e. command vs. function syntax).
Totally pointless cd when it is much more efficient to use absolute/relative filenames (which anyone who has progressed past the "MATLAB learner"-stage would know).
Goodness gracious me... this code is writen in a book: "Analiza w Matlabie stanów ustalonych i zwarciowych systemów elektroenergetycznych"! This code indicates that its author does not know how to write simple, efficient MATLAB code. No wonder MATLAB suffers from the reputation of being slow, when this is the appalling standard of code that is being taught to well-meaning students who diligently buy such books.
Please add your own reviews to online retailers selling this book, warning others from learning from this abomination.

Connectez-vous pour commenter.

Réponse acceptée

the cyclist
the cyclist le 25 Jan 2021
Modifié(e) : the cyclist le 25 Jan 2021
The first, and most important, thing to mention here is that eval is almost never the best coding solution. Just as you are experiencing now, it typically obscures what one is trying to do.
Next, I'll note that those two lines of code are equivalent to
cd(filePath)
and
cd(cdold)
The cd command takes a character array as input, and goes to the corresponding directory. Since filePath and cdold are character arrays, they can be used directly as input.
Lastly, I will describe what the author of that code appeared to be doing, only because it can be useful in other contexts (but hopefully never using eval). What they are doing is creating one long character array, by concatenating individual char arrays. This syntax
['cd(''',filePath,''')']
is putting together three individual char arrays. The reason for the seemingly awkward use of
'cd('''
is because the author wanted a single quote in their char array. Supposed the filepath is '/Users/MATLAB/Noob'. So, they are splicing together
cd('
and
/Users/MATLAB/Noob
and
')
into the one longer string, which will be executed by the eval command.
It's an abomination, and yet another excellent example of why eval should not be used. Please go educate whoever you got this code from.
  1 commentaire
Jacek Soroko
Jacek Soroko le 25 Jan 2021
Thanks you very much. Your explanation is very helpful.

Connectez-vous pour commenter.

Plus de réponses (1)

John D'Errico
John D'Errico le 25 Jan 2021
Modifié(e) : John D'Errico le 25 Jan 2021
Lol. Whoever wrote the code should learn to use MATLAB, as this is just an abuse of eval, for absolutely no good reason.
For example, this:
eval(['cd(''',cdold,''')']);
is equivalent to the far simpler line of code:
cd(cdold)
All that line of code does is change the current directory, using cd.
Likewise,
eval(['cd(''',filePath,''')'])
is equivalent to
cd(filepath)
Sorry, but anyone writing code like that should have their license revoked. :-) :-)
  6 commentaires
Stephen23
Stephen23 le 26 Jan 2021
@Jacek Soroko: I tried searching for the title that you gave, but cound not find an exact match. Could you please write the full, correct title of this book and the author's name, so that internet searches have a chance to find this thread.
Jacek Soroko
Jacek Soroko le 26 Jan 2021
Modifié(e) : Jacek Soroko le 26 Jan 2021
I did not mention that, but it is not exact title of the book. The book was writen in polish language and I had to translate some lines into english. The title is: "Analiza w Matlabie stanów ustalonych i zwarciowych systemów elektroenergetycznych." On this page you will be able to see the autors of this book. The origin code is as shown in the attached "lk.m" file. Do you know any english equivalent of this book? I am generally looking for the book that show how to use Matlab and Newton-Raphson method for power system (load flow) analysis.

Connectez-vous pour commenter.

Catégories

En savoir plus sur MATLAB dans Help Center et File Exchange

Produits


Version

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by