Soweit so gut. Nun habe ich es in meinem Programm mit mehreren Datenformaten zu tun, entsprechend brauche ich verschiedene Einlesefunktionen für die verschiedenen Datenformate. Diese werden über eine zentrale Einlesefunktion angesteuert
Diese heissen z.B.
Code:
function readData(hObject, handles, fid)
measuringStation = get(handles.PM_tab_01_measuringStation,'Value');
So. In den einzelnen Einlesemethoden möchte ich über die normalen Messdaten (sind Spalten) auch noch gezielt einzelne Zeilen einlesen, so z.B. eine Zeile, in der sich die Temperatur befindet. Da ich die Temperatur auch in den anderen Einlesefunktionen einlesen möchte, diese dort jedoch an anderen Stellen des Files steht möchte ich natürlich auch dies über eine Funktion steuern.
So. Nun zu meinem Problem. Wenn ich mir in der letzten Funktion "handles.Temperature" ausgeben lasse, so wird mir im Prompt die richtige Größe angezeit. Ich habe mir aber nun Testweise die Variable "handles.Temperature" NACH ausführen der Einlesefunktion einfach mal in einem anderen Funktionsaufruf ausgeben lassen, und siehe da, die Variable wurde nicht "nach oben" übernommen.
Wo steckt mein Denkfehler?
Vielen Dank schon im Vorraus für Tipps und Anregungen
Grüßle, MorrisThorne
P.S.: Wenn mir jemand einen Tipp hat, wie ich in der letzten Funktion aus der "endOfFile" Variable - die ich einfach mal willkürlich auf 700 gesetzt habe, damit genug Zeilen eingelesen werden - eine Art echtes endOfFile setzen kann, dann wäre ich auch hierrüber äusserst dankbar.
_________________
*Oink oink, kommt her, ihr Schweinchen! Oink oink!*
Es passiert bei dir hier folgendes, du rufst die Funktion findTemperature aus Funktion readMessplatz, am Ende schreibt diese Funktion dir Temperatur in handles. Wenn aber die Prozedur zurückkehrt zu readMessplatz, werden für diese Funktion im Speicher abgelegte handles genutzt.(die bereits veraltet sind)
Also musst diese aktualisieren, z.B so
vielen Dank für die Tipps. Leider haben sie nicht funktioniert. Ich habe mal ein wenig weiter rumgespielt. Und dabei folgendes in der letzten Funktion getestet.
Code:
function findTemperature(hObject, handles, fid)
actualLine=0;
endOfFile =700;
for j=1:endOfFile
actualLine=fgetl(fid) iffindstr(actualLine, 'T = ')
handles.Temperature = str2double(actualLine(5:end-2));
'Vor dem guidata-Update'
handles.Temperature
Hallo MorrisThorne,
du hast mich wohl falsch verstanden.
Ich wollte dass du an anderen Stellen guidata einsetzt. Wie soll ich dir das erklären.
Stell dir eine Funktion wie ein Container, die Funktion kennt nur die Elemente die in diesem Container abgelegt wurden. Man kann zusätzlich eigene Elemente in dieser Funktion definieren. Wenn die Funktion aber das Ende erreicht hat, werden diese Elemente gelöscht.( Für jede Funktion ist ein eigener lokaler Speicherbereich definiert)
Guidata ist auch ein Funktion und die legt an einer bestimmten Speicherstelle ab (guidata(Speicherort, Daten)) oder holt abgelegte Daten von dieser Stelle wieder ab( Daten=guidata(Speicherort)).
Nun musst du beachten, dass die Daten synchronisiert werden müssen.
Die Daten können entweder an Speicherort veraltet oder in der Funktion, welche die Werte in eigenem Speicher hält.
Schaue doch noch mal deine Code und frag was passiert an der Stelle wo du guidata ausführst? Ist der Aufruf sinnvoll?
Code:
function readData(hObject, handles, fid)
measuringStation = get(handles.PM_tab_01_measuringStation,'Value');
switch measuringStation
case(1)
readMessplatz_1(hObject, handles, fid) case(2)
readMessplatz_2(hObject, handles, fid) otherwise msgbox('Irgendeine Fehlermeldung') end % ist guidata an dieser Stelle sinnvoll, denn in readMessplatz_01 % speicherst du die handles bereits % und hier sind Werte in handles älter als readMessplatz_01 % würdest an dieser Stelle handles an Speicherort überschreiben guidata(hObject, handles);
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
function readMessplatz_01(hObject, handles, fid)
.
.
.
findTemperature(hObject, handles, fid);
% ist guidata an dieser Stelle sinnvoll, weil in findTemperature % speicherst du die handles bereits % und hier sind Werte in handles älter als findTemperature guidata(hObject, handles);
%
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
function findTemperature(hObject, handles, fid)
actualLine=0;
% fgetl liefert immer -1 wenn end of line erreicht wird while actualLine~=-1
actualLine=fgetl(fid);
iffindstr(actualLine, 'T = ')
handles.Temperature = str2double(actualLine(5:end-2));
break;
end end guidata(hObject, handles);
function findTemperature(hObject, handles, fid)
actualLine=0;
endOfFile =700;
for j=1:endOfFile
actualLine=fgetl(fid) iffindstr(actualLine, 'T = ')
handles.Temperature = str2double(actualLine(5:end-2));
'Vor dem guidata-Update'
handles.Temperature
%zuerst abspeichern und dann kann die Werte aus Speicherort auslesen,
% da handles in Funktion aktueller als an guidata's Speicherort sind. % ist es aber sinnvoll erst abzulegen und dann wieder es in Speicher der Funktion zu holen? guidata(hObject, handles);
handles = guidata(hObject);
'Nach dem guidata-Update'
handles.Temperature break end end guidata(hObject, handles);
Danke Denny, ich glaube ich habe es nun geblickt - zumindest gibt mir der Erfolg bei der unten folgenden Variante Recht
Nur zum Verständnis nochmals:
mit guidata(hObject, handles) speichere ich die werte in der handles-Struktur
mit handles = guidata(hObject) lese ich die aktualisierten Werte in einer entsprechenden Funktion.
D.h., ich habe nun folgenden Ansatz verfolgt, und er wurde von Erfolg gekrönt:
Code:
function readMessplatz_01(hObject, handles, fid)
.
.
.
findTemperature(hObject, handles, fid);
handles = guidata(hObject);
handles.Temperature %Liefert mir nun den korrekten Wert
function findTemperature(hObject, handles, fid)
actualLine=0;
endOfFile =700;
'findTemperature'
for j=1:endOfFile
actualLine=fgetl(fid);
iffindstr(actualLine, 'T = ')
handles.Temperature = str2double(actualLine(5:end-2));
break end end
%Schreibt die Daten nun in die handles-Struktur
guidata(hObject, handles);
%Und liest die Daten zurück aus der handles-Struktur
handles = guidata(hObject);
'Nach dem guidata-Update'
handles %Test, ob der korrekte Wert da steht - mit dem Ergebnis das alles passt
Nur zum Verständnis nochmals:
mit guidata(hObject, handles) speichere ich die werte in der handles-Struktur
mit handles = guidata(hObject) lese ich die aktualisierten Werte in einer entsprechenden Funktion.
Richtig.
Zitat:
Heisst das nun im Klartext, wann immer ich in einer Funktion etwas mit einer der handles Variablen anstellen/abrufen möchte, das ich immer zuerst mit handles = guidata(hObject);
aktualisieren muss, um mit den korrekten Werten weiter zu arbeiten? Hab ich das so richtig Verstanden?
Ja, nur wenn die Daten in der Funktion bereits veraltet sind
Super, vielen herzlichen Dank, Denny, du hast mir wirklich nicht nur beim akuten Problem sondern auch beim grundlegenden Verständis sehr weitergeholfen
Das mit der Schleife hat nicht wirklich geklappt, Matlab ist da schon gar nicht auf die Bedingung der While-Schleife eingegangen, aber das bekomme ich auch noch in den Griff
Grüßle MorrisThorne
_________________
*Oink oink, kommt her, ihr Schweinchen! Oink oink!*
ich war mir aber sicher, dass es funktionieren wird.
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.