Verfasst am: 16.01.2017, 14:11
Titel: Merken der Zeilennummer
Hallo, in meinem Algorithmus muss ich generierte Code-Zeilen durchgehen und diese nach Variablennamen durchsuchen. In 10 Schritten ist der Algorithmus zusammengefasst:
Code:
1) Ich erstelle mir eine Liste von Variablen, die in den erzeugtem Code verwendet werden.
2) Für jede Variable erstelle ich mir eine Zaehlvariable
3) Ich geh den erzeugten Code Zeile fuer Zeile durch, und suche nach der ersten Variable aus der Liste
4)Falls eine Variable in der Zeile gefunden wurde, erhoeht sich die Zaehlvariable countvar, die countvar kann folgende Werte einnehmen: 0, 1, 2, 3. Countvar ist die Enstcheidungsvariable, was mit der generierten Codezeile gemacht werden muss.
5)Merke die Zeilennummer t, wo die Variable gefunden wurde
6)Entscheide ob die Variable in der Zeilennumer t gelesen oder geschrieben wird
7)Falls die Variable nur gelesen wird, und ab da nicht mehr geschrieben, markiere die nächste generierte Zeile t+1 8)ersetze in der t+1 den Variablennamen, der in t+1 geschrieben wird, mit dem Variablennamen, nach dem gesucht wurde. Merke ersetzten Namen
9)suche alle Codezeile t+rest nach den ersetzten Namen aus t+1 und ersetze diesen mit dem Variablennamen aus 8).
10)geh zu 3), nimm nächste Variable.
11)End, wenn Variablenliste durch ist.
Ich habe angefangen den Algorithmus in Matlab zu gießen und bin erstmal bis Schritt 5 gekommen und habe dabei festgestellt, ich weiss nicht wie ich die Variable t erstellen und speichern soll.
Code:
cell_new_name = {'t_1'; 't_2'; 't_5'; 't_6';};
node_list = regexp(fileread('overhalf.txt'), '\n', 'split');
for elementidx = 1:length(cell_new_name)
nks=strfind(ln, cell_new_name{elementidx}); %search for variables in the line if ~isempty(nks) % if found, split the line string into components (parsing of the line)
compons = strsplit(ln, delim);
% find position in compons for t = 1:length(node_list) for ks=1:length(compons) ifstrcmp(compons{ks}, cell_new_name{elementidx});
if ks > 3; %if found positions is greater than third space position within the same row
str3 = [str3 't=' num2str(codeidx) ' v=' cell_new_name{elementidx} '; ']; %save write variable
else
str2 = [str2 't=' num2str(codeidx) ' v=' cell_new_name{elementidx} '; ']; %save read variable
end end end end end
Habe einfach nur nicht daran gedacht mir eine zusaetzliche Zaehlvariable einzufuegen.
Aber ich habe eine dennoch eine zusaetzliche Frage:
Var_write ist eine Cell, mit der Größe 1x1. Kann ich irgendwie diese einzelne Zelle in kleine aufteilen, so dass ich auf die einzelnen l und die einzelnen v Werte zugreifen kann? Also, dass quasi die Zelle Var_write noch mal in Zellen Var_write_L mit Elementen l hat und Var_write_V, wo die v stehen?
Alles cool, ich habe alles hinbekommen mit den Zeilennummern und Zugriff auf die einzelnen Elemente aus dem String. Habe ein bisschen an der Ausgabe rumgefeilt.
Code:
if ks > 3; %if found positions is greater than third space position within the same row
str3 = cellstr([str3 ['l=' num2str(codeidx) ' v=' cell_new_name{elementidx} '; ']]); %save write variable
l_write = num2cell(codeidx);
%l_write
%cell_new_name{elementidx}
L_write = [L_write l_write];
else
str2 = cellstr([str2 ['l=' num2str(codeidx) ' v=' cell_new_name{elementidx} '; ']]); %save read variable
l_read = num2cell(codeidx);
%l_read
L_read = [L_read l_read];
%cell_new_name{elementidx} end
L_read und L_write sind jetzt meine Zeilenindexe, von den Codezeilen wo entweder gelesene oder geschriebene Variablen gefunden wurden. Jetzt stehen folgende Schritte noch aus:
1)Vergleich Variablen aus Var_write{length(L_write)} (Ich kann length(L_write) als Index nehmen, da pro Zeile immer nur max eine Variable geschrieben werden kann) mit denen aus Var_read. Dazu möchte ich einfach strcmp nutzen.
2)Falls eine Übereinstimmung in Var_read gefunden wurde, und die dazugehörige L_write L_write Max ist,
3)dann überprüfe ob L_write_max, kleiner ist als die dazugehörige L_read,
4)falls ja, ersetze in der nachfolgenden Codezeile codeidx das vierte Element (compons{4}, siehe erster post) mit der Variable aus Var_write
Entschuldigung fuer die Textwand und viele Grueße.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.