WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Suche mit strfind findet genau ein Treffer zu viel

 

bmtil
Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2016, 16:22     Titel: Suche mit strfind findet genau ein Treffer zu viel
  Antworten mit Zitat      
Hallo,
ich habe mittlerweile gut 30% meines Algorithmus zur Suche und Reduktion von Variablen in einem Assemblercode hinbekommen. Momentan habe ich eine Routine implementiert, welche mir die gelesenen und geschriebenen Variablen sortiert.

Eigenschaften des zu verarbeitenden Assemblercodes:
Jede Zeile hat exakt 4 Leerzeichen
Eine Variable, welche nach dem dritten Leerzeichen steht, wird in das Register geschrieben.

Mein Algorithmus macht folgendes:
1. Sucht jede Assemblerzeile nach den Variablennamen ab
2. Sucht jede Assemblerzeile nach Leerzeichen ab
3. Berechnet die "Länge" der Assemblerzeile über die Anzahl von Leerzeichen
4. Sortiert jedes Vorkommnis eines Variablennamen, nach dem dritten Leerzeichen in VAR_write
5. Sortiert alle anderen Vorkommnisse in VAR_read

Ich habe ein Screenshot angehangen. Im Screenshot sieht man die 12 zu verarbeitenden Assemblercode Zeilen. Man sieht das Cell Array J, in welchem meine Leerzeichen stehen. Man sieht das Cell Array VAR_write, in dem die Stellen der Variablenvorkommnisse stehen.

Die [27] in VAR_write ist falsch, die darf nicht gefunden werden. Die dazugehörige [26] (halt den Variablennamen findet der direkt nach dem Leerzeichen) steht bei J Column 6.

Hier mein Algorithmus:
Code:
for codeidx = 1:length(node_list)  %jede zeile durchgehen
          for elementidx = 1: length(cell_new_name)  %jede variable durchgehen
               k = (strfind((proc_asm{codeidx}), (cell_new_name{elementidx})));
           %k = [k, ';'];
           k = num2cell(k);    %zellen fuer zugriff bauen
           K = [K k];
          end

           j = strfind((proc_asm{codeidx}), ' ');  %nach leerzeichen suchen
           l = length(j)-1;                                  %vorletztes leerzeichen bestimmen
           j = num2cell(j);    %zellen fuer zugriff bauen
           J = [J j];
    end
 
    for d_K_max = 1 : length(K)
        if K{d_K_max} < J{l}  %überprüft wo, nach welchem, leerzeichen sich var befindet
           var_read = num2cell(K{d_K_max});
           VAR_read = [VAR_read var_read];
        else
            var_write = num2cell(K{d_K_max});
            VAR_write = [VAR_write, var_write];
        end
    end
   
   % VAR_read
    VAR_write


var_positions.JPG
 Beschreibung:

Download
 Dateiname:  var_positions.JPG
 Dateigröße:  62.75 KB
 Heruntergeladen:  372 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.12.2016, 13:01     Titel: Re: Suche mit strfind findet genau ein Treffer zu viel
  Antworten mit Zitat      
Hallo bmtil,

Was genau ist Deine Frage?

"k" und "K" ist tückisch. Variablennamen sollten sich nicht nur due Groß/Kleinschreibung unterscheiden.


Code:
for elementidx = 1: length(cell_new_name)  %jede variable durchgehen
               k = (strfind((proc_asm{codeidx}), (cell_new_name{elementidx})));
           %k = [k, ';'];
           k = num2cell(k);    %zellen fuer zugriff bauen
           K = [K k];
         end

ist wahrscheinlich so einfacher:
Code:
K = strfind(proc_asm{codeidx}, cell_new_name)

strfind nimmt nämlich auch ein Cell-String als Input an.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2016, 13:34     Titel:
  Antworten mit Zitat      
Hallo,
naja ich verstehe einfach nicht, warum dort ein Treffer zu viel ist. Das würde heissen da ist irgendwo ein Leerzeichen, welches der Algorithmus extra findet. Alle anderen Treffer sind ja korrekt und auch sonst funktioniert es wunderbar bis jetz.

Ich probier das gleich mal aus mit der einfacheren Lösung. -> Funktioniert so nicht, der zweite input muss ein character array sein.

Noch eine Frage, kann ich mir irgendwie zusätzlich zu den eigentlichen Treffern K auch die Indizes der dazugehörigen Cells aus cell_new_name, die dort stehen, anzeigen lassen (quasi die elementidx)? -> Jo kann ich, sieht noch nicht sehr schön aus, und nicht nach Zeilen geordnet, aber geht:

Code:

  for codeidx = 1:length(node_list)
        for elementidx = 1 : length(cell_new_name)
           p = strfind((proc_asm{codeidx}), (cell_new_name{elementidx}));
            if  p > 0
               %k = [k, ';'];
                p = num2cell(p);
                K = [K p];
                idx = cell_new_name{elementidx};
                idx = [idx, ';']                                %zu den zeilen gehörige treffer
                IZ = [IZ idx];
            end
        end


Leider, seh ich nur bei meiner Lösung, dass er irgendwas gefunden hat, nicht wie oft. Da muss ich mir noch was einfallen lassen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.12.2016, 15:06     Titel:
  Antworten mit Zitat      
Hallo bmtil,

Sorry, stimmt, strfind nimmt die String-Liste nur im ersten Input entgegen, das Pattern muss aber ein String sein.

Zitat:
naja ich verstehe einfach nicht, warum dort ein Treffer zu viel ist.

Um das nachvollziehen zu können, muss man Deinen Code durcharbeiten, verstehen und die genaue Absicht dahinter erkennen. So tief wird sich aber in einem Forum kaum ein Leser einarbeiten.

Versuche mit dem Debugger den Code Zeile für Zeile durchzuarbeiten bis Du den Befehl mit den Inputs findest, der nicht wie gewünscht arbeitet. Wenn Du dann die Inputs und die Zeile postest, kann man leichter erklären, wie man das anpassen kann.

Überflüssige Klammern reduzieren die Lesbarkeit.

"IZ = [IZ idx]" ist ein iteratives Vergrößern eines Arrays. Das ist ein typischer Anfängerfehler, der dazu führt, dass die Testdaten zügig bearbeitet werden, bei echten Daten mit 100'000 Inputs aber die Laufzeit überraschen Jahre beträgt. Versuche das zu vermeiden, wann immer es möglich ist.

Code:
p = strfind(proc_asm{codeidx}, cell_new_name{elementidx});
if  p > 0

strfind gibt immer nur Werte größer 0 zurück. Meinst Du:
Code:

? Wenn Matlab bei eienm IF-Befehl ein nicht-skalares Input erhältm, wird intern dies ausgeführt:
Code:
if all(p > 0) && ~isempty(p > 0)

In Deinem Fall kommt da wegen des intern eingefügten isempty zwar das gleiche heraus, das ist aber mehr oder weniger Zufall.

Code:

  for codeidx = 1:length(node_list)
        match = zeros(1, length(cell_new_name));
        for elementidx = 1 : length(cell_new_name)
           match(elementidx) = length(strfind(proc_asm{codeidx}, cell_new_name{elementidx}));
         end
         Z = sprintf('%s;', cell_new_name{match ~= 0});
     end

Vielleicht ließe sich so Dein "K" auch einfacher konstruieren. Hier steht dann in "match", wie oft ein String gefunden worden ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2016, 16:35     Titel:
  Antworten mit Zitat      
Leider lässt sich mein K, so nicht bauen. Z liefert mir nur die letzte Variable "avoid".
Was gibt es noch für Wege außer über X = [X x] oder sprintf sich Arrays zu bauen?

Ja, ich meine ~isempty(p).

EDIT: Ich glaube mittlerweile, dass der Bug mit dem extra Treffer nur dann auftaucht, wenn ganz bestimmte "mov_X" Anweisungen in den Assemblerzeilen durchsucht werden müssen.

EDIT 2: habe es hinbekommen, dass Z nicht nur leer ist, es enthält die richtigen Variablen. Die Anzahl der Treffer match passt noch nicht (zum Beispiel muss t_1 in der ersten Zeile zwei mal vorhanden sein), aber sind es nicht nur Nullen.
Screenshot habe ich hochgeladen.
Habe das jetzt so:
Code:
   match = zeros(1, length(cell_new_name));
    for codeidx = 1:length(node_list)
         for elementidx = 1 : length(cell_new_name)
            p = strfind(proc_asm{codeidx}, cell_new_name{elementidx});
            p = num2cell(p);
            if  ~isempty(p)
                match(elementidx) = length(strfind(proc_asm{codeidx}, cell_new_name{elementidx}));
                Z = sprintf('%s;', cell_new_name{match ~= 0});
               %p = [p, ';'];
                 K = [K p];
                 idx = cell_new_name{elementidx};
                 IZ = [IZ idx];
            end      
        end


Die alten Codeteile sind noch drin, damit ich die neue Methode mit meiner alten Variante vergleichen kann.

Vielen Dank und Grüße.

positions_matches.PNG
 Beschreibung:

Download
 Dateiname:  positions_matches.PNG
 Dateigröße:  21.33 KB
 Heruntergeladen:  363 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.12.2016, 11:57     Titel:
  Antworten mit Zitat      
Hallo bmtil,

Meinen Vorschlag mit "match" darf nicht in die innere Schleife gezogen werden. In der jetzigen Form ist der Befehl sinnlos. Auch Z wird so immer wieder überschrieben.
Da ich nicht wirklich verstehe, was Du vorhast und meine Vorschläge Dich wohl auch eher verwirren, weiß ich nicht, wie ich Dir effizient helfen kann.
Das iterative Erweitern der Outputs springt mir beim Betrachten des Codes so sehr in die Augen, dass ich abgelenkt bin.
Mir fehlen Kommentar-Zeilen, die erklären, was die Code-Abschnitte machen sollen. Eigentlich hast Du hier ja nur 2 Cell-Arrays und suchst danach, wieviele von den Ausdrücken aus dem einen pro Zeile im anderen vorkommen. Oder? Wenn das so klar irgendwo stünde, würde ich die Doppel-Schleife gerade durch etwas effizienteres ersetzen. Mir bleibt z.B. unklar, ob das num2cell nicht vollkommen überflüssig ist. Da ich aber die Absicht dahinter nicht kenne, kann ich das nicht überschauen.

Wie gehst Du damit um, wenn Du nach "MOV" suchst und "MOV_A" oder "MOV_MOV" vorkommt?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2016, 14:09     Titel:
  Antworten mit Zitat      
Korrekt, ich habe nur zwei Arrays und suche wie oft Elemente aus Array B in Array A vorkommen und möchte die Treffer pro Zeile in Array A zählen. Siehe in Screenshot, wo zwar die Treffer bis auf den Bug passen, aber noch nicht klar ist, wie oft zum Beispiel t_1 in der ersten Zeile vorkommt, zwei mal.

num2cell benutze ich damit ich die Werte von p in Zellen speichern kann, damit ich diese dann Später als Indizes für ein Vergleichkriterium nutzen kann. Ich vergleiche später im Algorithmus die Positionen der Variablen (Array B) K mit den Positionen der Leerzeichen in Assemblercodezeilen (Array A) und werte so aus, ob die Variablen, die in den Zeilen stehen, gelesen oder geschrieben werden. Später möchte ich mit Hilfe dieser Information eine Variablenreduktion durchführen, indem ich rausfinde, ab welcher Zeile im Assemblercode, die Variablen das letzte mal gelesen wurden, ab diesem Zeitpunkt, kann ich diese nämlich mit neuen Werten belegen und somit die Gesamtanzahl der Variablen verringern.

Wenn ich "match" aus der inneren For-Schleife rausziehe, bekomme ich die Fehlermeldung, dass der Index die Matrix Größe übersteigt -> muss wohl match(codeidx) statt match(elementidx) heissen, damit es Treffer pro Zeile sind, jedoch ist auch dabei die selbe Fehlermeldung.

Ohne Fehlermeldung läuft es so:
Code:
   for codeidx = 1:length(node_list)    %Bestimme die Anzahl der AsmZeilen
         for elementidx = 1 : length(cell_new_name) %Anzahl der variablen
             match(elementidx) = length(strfind(proc_asm{codeidx}, cell_new_name{elementidx}));   %suche nach Treffern pro Zeile
             Z = cellstr(sprintf('%s;', cell_new_name{match ~= 0}));  %schreibe die Treffer in Z
            p = strfind(proc_asm{codeidx}, cell_new_name{elementidx}); s. match
            p = num2cell(p);  %bau Zellen für späteren Zugriff
            if  ~isempty(p)  
               %p = [p, ';'];
                 K = [K p];        %bei Treffern fülle das Array, wird ersetzt, sobald klappts
                 idx = cell_new_name{elementidx};
                 IZ = [IZ idx];
            end      
        end
        lz = strfind((proc_asm{codeidx}), ' ');   %suche nach den Leerzeichen in Asm
         l = length(lz)-1;                %laenge bis zum vorletzten leerzeichen bestimmen, da nach diesem nur noch write vars kommen
         lz = num2cell(lz);
         J = [J lz];
    end


Habe auch ein Screenshot zum jetzigen Ergebnis hochgeladen.

Damit ich in den Mnemonics keine Variablennamen finde, werte ich nur die Treffer aus, die nach dem ersten Leerzeichen erscheinen. Der Aufbau einer Assemblerzeile ist (bis jetzt, wahrscheinlich wird es nach mir erweitert)
Code:
Mnemonic Variable Variable Variable ;
, wobei die ersten beiden Variablen gelesen werden, die dritte ist die Zielvariable.

positions_matches.PNG
 Beschreibung:

Download
 Dateiname:  positions_matches.PNG
 Dateigröße:  16.49 KB
 Heruntergeladen:  363 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.12.2016, 23:12     Titel:
  Antworten mit Zitat      
Hallo bmtil,

Wir reden an einander vorbei.
Ich kann Deinen Beschreibungen nicht folgen, weil ich nicht in das Problem eingearbeitet bin, das Du bearbeitest.

Zitat:
ich habe nur zwei Arrays und suche wie oft Elemente aus Array B in Array A vorkommen und möchte die Treffer pro Zeile in Array A zählen.

Das wäre ein Satz. Wenn Du dann noch kurze relevante Beispiel-Daten in Matlab-Syntax angibst, wäre das Problem hier im Forum schnell gelöst.
Screenshots sind grundsätzlich ungeeignet außer um etwas an einer Grafik zu zeigen.

Zitat:
Siehe in Screenshot, wo zwar die Treffer bis auf den Bug passen, aber noch nicht klar ist, wie oft zum Beispiel t_1 in der ersten Zeile vorkommt, zwei mal.

Was sind "die Treffer"? Welches ist "der Bug"? Was ist "t_1"? Wieso ist nicht klar, wie oft "t1" vorkommt, wenn doch strfind das bereits ermittelt?

Zitat:
num2cell benutze ich damit ich die Werte von p in Zellen speichern kann, damit ich diese dann Später als Indizes für ein Vergleichkriterium nutzen kann.

Das kann ich auch nicht nachvollziehen. Wenn Du unterschiedlich lange Vektoren in einem Cell-Array speichern willst, geht das so einfacher und klarer:
Code:
C = cell(1, 10);
for k = 1:10
  C{k} = find(rand(1,5) > 0.5);
end


Zitat:
Ich vergleiche später im Algorithmus die Positionen der Variablen (Array B) K mit den Positionen der Leerzeichen in Assemblercodezeilen (Array A) und werte so aus, ob die Variablen, die in den Zeilen stehen, gelesen oder geschrieben werden.

Kannst Du verstehen, dass ich davon kein Wort kapiere? Und das ist zur Lösung der Fragen auch bestimmt nicht notwendig. Der Sinn der Variablen istr nicht ausschlaggebend, sondern für Matlab selbst sind das einfach nur Arrays.

Zitat:
Wenn ich "match" aus der inneren For-Schleife rausziehe, bekomme ich die Fehlermeldung, dass der Index die Matrix Größe übersteigt

Man kann nur nachvollziehen, was Du machst, wenn Du den Code postest. Ich kann mit dieser Aussage gar nichts anfangen.

Der gepostete Code ist "verwurstelt":
Code:
   match(elementidx) = length(strfind(proc_asm{codeidx}, cell_new_name{elementidx}));   %suche nach Treffern pro Zeile
             Z = cellstr(sprintf('%s;', cell_new_name{match ~= 0}));
 

In "match ~= 0" fragst Du einen Index-Vektor ab, den Du gar nicht vorher vollständig befüllt hast, sondern nur von 1 bis elementindex. Das cellstr ist nich nachvollziehbar. Wozu soll das nutzen?

Ich denke, ich gebe hier auf. Das ist sowieso ein Brownfield-Projekt und durch meine Ratschläge wird es hier von Beitrag zu Beitrag verworrener.
Versuche die Probleme so zu betrachten und formulieren, dass es nur noch um die Matlab-Vorgänge geht. Versuche deutlich einfacheren und klareren Code zu schreiben. Ich programmiere seit 20 Jahren in Matlab, aber ich kann Dir zu keinem der Code-Abschnitte sagen, was die Absicht dahinter ist.
Wenn ich das Projekt professionell angehen würde, würde ich den gesamten bisherigen Code löschen und neuschreiben, weil das viel weniger Probleme verursachen würde. Schon die hier besprochenen 20 Zeilen finde ich undebugbar. Sorry für die pessimistische Ansicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2016, 13:12     Titel:
  Antworten mit Zitat      
Na dann, sehr entmutigend. Thx.
Zum Thema Brownfield -> ich fasse das vorhandene Projekt gar nicht mehr an, da ich alle notwendigen Daten daraus mittlerweile habe (hoffe ich zumindest). Es geht wirklich nur noch darum im vorhandenem Text nach Strings zu suchen.
Ich erklärs Schritt für Schritt, wie in der Grundschule eine Matheaufgabe.

Gegeben: Text A (entweder in Array Form so wie jetzt, sind aber auch als .txt Files vorhanden. Die Zeilen können im Text folgende Struktur haben:

Code:
Mnemonic Quellvariable_1 Quellvariable_2 Zielvariable ;
Mnemonic QuellVariable ? Zielvariable ;


Wobei das "?" als Trennzeichen funktioniert. Alle Zeilen haben die Gemeinsamkeit, dass sie immer 4 Leerzeichen besitzen. Weitere Gemeinsamkeit ist, dass "Mnemonic" niemals der selbe String seien kann wie ein Variablenstring. Ich habe das entsprechende .txt File angehangen.

Das zweite was gegeben ist, ist eine Liste der Namen der Variablen. Jedoch wenn man möchte, kann man sich diese auch aus dem .txt File holen -> Variablen ist alles was in den Zeilen steht, die mit einem "dq" anfangen und keine Constanten sind.

Nun möchte ich Zeilenweise die .txt Datei, bzw. das Array durchgehen und die vorkommenden Variablen zählen und zwar welche, wie oft in einer Zeile vorkommen. Dazu benutze ich die strfind Funktion. Leider weiss ich nicht von der strfind Funktion, wenn sie was gefunden hat, dann was sie gefunden hat.

Zum Beispiel habe ich zwei Zeilen:
Code:
Mnemonic QuellVariable_1 QuellVariable_2 Zielvariable ;
Mnemonic Quellvariable_3 ? Zielvariable ;


Jetzt möchte ich für diese zwei Zeilen wissen:
a) wieviele Variablen es pro Zeile gibt -> strfind macht mit das
b) Welche Variablen Quell und ZielVars sind -> macht mir auch strfind, wenn ich nach Leerzeichen suche, und dann die Position des Leerzeichens mit Position der gefunden Variable vergleiche
c) Vergleich ob der Name QuellVariable_1 = Quellvariable_2 = Zielvariable ist
-> sollte auch mit strfind gehen

Im wesentlichen habe ich es hinbekommen, bis der blöde Bug aufgetaucht ist -> es wurde eine Variable als Zielvariable gefunden, obwohl nach ihr noch ein Leerzeichen kommt und noch eine Vaiable, die auch gefunden wurde.

Drücke ich mich so unverständlich aus? Falls ja, schnappe ich mir mein Russisch-Deustch Wörterbuch.

overhalf.txt
 Beschreibung:

Download
 Dateiname:  overhalf.txt
 Dateigröße:  509 Bytes
 Heruntergeladen:  336 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.12.2016, 19:57     Titel:
  Antworten mit Zitat      
Hallo bmtil,

Die Art, wie Du bisher meine Vorschläge in den Code eingebaut hast, hat die Probleme vergrößert. Deshalb sind meine Vorschläge hier bereits das Arbeiten in einem Brownfield-Projekt.

Zitat:
Ich erklärs Schritt für Schritt, wie in der Grundschule eine Matheaufgabe.

Du musst es ja nicht mir erklären, sondern Matlab.
Und dann lies Deinen text nochmal durch: Kein Grundschüler hätte dem folgen können. Und auch ich kann es nicht. Ich wüsste nicht, was ich darauf antworten könnte, außer das gesamte Programm für Dich zu schreiben.

Zitat:
Gegeben: Text A (entweder in Array Form so wie jetzt, sind aber auch als .txt Files vorhanden.

Was genau bedeutet "so wie jetzt"? In einem CHAR-Array oder einem Cell-String?
Bitte netscheide Dich, ob Du die Daten als Array anlieferst oder ob der Teil mit dem Text-File-Einlesen auch noch zur Frage dazu gehört.

Zitat:
Die Zeilen können im Text folgende Struktur haben:
Code:
Mnemonic Quellvariable_1 Quellvariable_2 Zielvariable ;
Mnemonic QuellVariable ? Zielvariable ;

Zusätzlich scheint es da noch Kommentar-Zeilen zu geben und Kommentare nach dem abschließenden Semikolon. ODer hast Du alle Kommentare schon entfernt?

Zitat:
Das zweite was gegeben ist, ist eine Liste der Namen der Variablen.

In welcher Form? Die Angabe eines Beispiels, dass per Copy&Paste verwendbar ist, hilft sehr dabei, Code für Vorschläge zu erstellen.

Zitat:
Jedoch wenn man möchte, kann man sich diese auch aus dem .txt File holen ->

Und? Möchte "man" das oder möchte man es nicht. Ich kann das nicht erraten und ich selbst habe da natürlich keine Präferenz. Entscheide, was Du möchtest. Andernfalls kann ich ja keinen konkreten Code vorschlagen.

Zitat:
Variablen ist alles was in den Zeilen steht, die mit einem "dq" anfangen und keine Constanten sind.

Woher weiß man eindeutig, was "Constanten" sind?

Zitat:
Leider weiss ich nicht von der strfind Funktion, wenn sie was gefunden hat, dann was sie gefunden hat.

Das verstehe ich nicht. STRFIND findet natürlich die gegebenen Inputs.

Zum Beispiel habe ich zwei Zeilen:
Code:
Mnemonic QuellVariable_1 QuellVariable_2 Zielvariable ;
Mnemonic Quellvariable_3 ? Zielvariable ;


Zitat:
a) wieviele Variablen es pro Zeile gibt -> strfind macht mit das

Es gibt immer 3, es sei denn es ist ein Fragezeichen enthalten, denn dann sind es nur 2. Was genau ist das Problem?

Zitat:
b) Welche Variablen Quell und ZielVars sind -> macht mir auch strfind, wenn ich nach Leerzeichen suche, und dann die Position des Leerzeichens mit Position der gefunden Variable vergleiche

Klingt umständlich. Die letzte Variable ist immer die Ziel-Variable, oder?
Dann hilft ein strsplit und man extrahiert die letzte Variable.

Zitat:
c) Vergleich ob der Name QuellVariable_1 = Quellvariable_2 = Zielvariable ist

Was möchtest Du vergleichen? Was soll das Ergebnis sein? Dir ist bestimmt sonnenklar, was diese Zeile bedeutet. Als Leser im Forum erfordert das aber Interpretationen.
Du hast nach strsplit 4 Strings. Sollen die letzten 3 nun unterschiedlich sein? Dann könnte unique helfen. Bei 3 Strings lässt sich das aber schneller mit 2 strcmp lösen.

Zitat:
Im wesentlichen habe ich es hinbekommen, bis der blöde Bug aufgetaucht ist

Tja, das ist das blöde beim Programmieren: Läuft "fast" bringt gar nichts.

Ich würde so anfangen:
1. Wie ist die Liste der Variablen definiert?
2. File einlesen, z.B. mit textscan . Das kann gleich alles nach einem Semikolon entfernen, falls das gewünscht ist. Falls das Einlesen schon erledigt ist, erkläre genau, in welcher Form der Text vorliegt.
3. Zeile für Zeile mit strsplit in Symbole teilen.
4. Hier kann man die Anzahl der Symbole untersuchen.
5. Die Inhalte der Symbole untersuchen: Abgleich mit der Variablen-Liste. Wahrscheinlich hilft any(strcmp) oder ismember weiter.
6. Genau definieren, was in welchem Fall ausgeschlossen ist.

Wenn in einem Teil-Schritt Probleme auftauchen, poste die Inputs der entsprechenden Zeile, den Code der Zeile und den gewünschten Output. Für eine Problemlösung müssen weder die Leser noch Matlab etwas über die Bedeutung der Strings wissen, das lenkt nur ab.

Wie lösen hier im Forum nur Matlab-Probleme. Wenn die Versuche Dich zu unterstützen nur noch mehr Verwirrung stiften und weder die eigentliche Frage noch der Code durchschaubar werden, kann ich mir auch keine Motivation aus den Fingern saugen.
Programmieren ist wirklich schwierig, weil man einserseits das Gesamt-Problem im Kopf haben muss, aber Matlab ganz abstrakt nur nackte Daten serviert, nur Zahlen und Buchstaben. Das sauber zu trennen ist einfach schwer und erfordert viel Übung. Das Problem in kristallklare Einzelschritte zu teilen und dabei eine elegante Aufteilung zu finden, erfordert eine Menge Erfahrung. Also lass Dich nicht entmutigen, nur weil ein Leser im Forum aussteigt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2016, 11:23     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:


Ich würde so anfangen:
1. Wie ist die Liste der Variablen definiert?
2. File einlesen, z.B. mit textscan . Das kann gleich alles nach einem Semikolon entfernen, falls das gewünscht ist. Falls das Einlesen schon erledigt ist, erkläre genau, in welcher Form der Text vorliegt.
3. Zeile für Zeile mit strsplit in Symbole teilen.
4. Hier kann man die Anzahl der Symbole untersuchen.
5. Die Inhalte der Symbole untersuchen: Abgleich mit der Variablen-Liste. Wahrscheinlich hilft any(strcmp) oder ismember weiter.
6. Genau definieren, was in welchem Fall ausgeschlossen ist.


Ok, das ist sehr hilfreich. Kann man schön Punkt für Punkt abarbeiten.
1. Die Liste der Variable ist ein Cell, mit der Größe 1x6 (in diesem Beispiel). Diese Liste ist immer die Cell Klasse.

2. Hier gibt es für mich zwei Optionen. Entweder File mit textscan einlesen oder sich den Inhalt des Files in dem Brownfield Teil generieren lassen. Ich lasse den Text mit generieren, entferne dabei bereits alle Kommentare (sonst wäre ja die Suche nutzlos, wenn in Kommentaren irgendwelche Strings gefunden werden). In meinem Fall, ist der zu untersuchende Text (Assembler Code) auch ein Cell mit der Größe 1x12 (12 Zeilen halt).

3. strsplit diese Funktion kenne ich noch gar nicht. Wenn ich mit ihr in jeder Zeile, einfach nur die letzte Variable extrahieren kann, wäre es super.

4. Das erledige ich ja, indem ich die Anzahl der Leerzeichen pro Zeile zähle. Und ich versuche gleich mal, hier die strsplit anzuwenden.

5. Und genau hier komme ich nicht weiter. Ich wüsste nicht, wie ich in diesem Fall strcmp anwenden soll. ismember kenne ich auch noch nicht, Werde gleich mal ausprobieren.

6. Das passiert bei der "Vorverarbeitung" der Variablen Liste (von Klasse Cell). In der Vorverarbeitung werden die Variablennamen vom Systemnamen und von allen Konstanten getrennt (diese heisen dann bei der Deklaration im Assemblercode tatsächlich nur "_ConstantX", wobei X eine beliebige Zahl ist. Diese lösche ich aus der Liste, noch bevor die ganze Suche losgeht.

Neuer Tag, neue Funktionen -> neues Glück+Wissen. Hoffentlich klappts. Vielen Dank aufjedenfall für die Mühe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.