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

Problem mit der handles-Variable

 

MorrisThorne
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 07.12.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2008, 14:05     Titel: Problem mit der handles-Variable
  Antworten mit Zitat      
Hallihallohallöle liebe Community,

wiedereinmal habe ich ein kleines Problemchen mit Matlab.

Vorneweg: Ich habe mit vermittels GUIDE ein (momentan noch rudimentäres) GUI gestrickt und anschliessend mir das *.m-file erzeugen lassen.

Nun kann man sich ja in der OpeningFunc zusätzliche Variablen definieren und initialisieren. So habe ich das z.B. dann gemacht:


Code:

.
.
.
handles.Temperature = 298;           %[K]
.
.
.
guidata(hObject, handles);
 



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');

   switch measuringStation
      case(1)
         readMessplatz_1(hObject, handles, fid)
      case(2)
         readMessplatz_2(hObject, handles, fid)
      otherwise
         msgbox('Irgendeine Fehlermeldung')
   end
   guidata(hObject, handles);  
 


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.

Code:

function readMessplatz_01(hObject, handles, fid)
.
.
.
   findTemperature(hObject, handles, fid);
   guidata(hObject, handles);  

function findTemperature(hObject, handles, fid)
   actualLine=0;
   endOfFile =700;
   for j=1:endOfFile
      actualLine=fgetl(fid)
      if findstr(actualLine, 'T = ')
         handles.Temperature = str2double(actualLine(5:end-2))
         break
      end
   end
   guidata(hObject, handles);  
 



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!*
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.03.2008, 19:06     Titel:
  Antworten mit Zitat      
Hallo,

ich vermute, dass du einfach die Werte überschreibst. Und zwar in der Funktion
readMessplatz_01

und Zwar genau an dieser Stelle:
Code:

findTemperature(hObject, handles, fid);
guidata(hObject, handles);
 

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
Code:

findTemperature(hObject, handles, fid);
handles=guidata(hObject);
guidata(hObject, handles);
 


oder du rufst mit Rückgabewert

Code:

handles=findTemperature(hObject, handles, fid);
guidata(hObject, handles);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
MorrisThorne
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 07.12.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2008, 10:20     Titel:
  Antworten mit Zitat      
Hallo Denny,

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)
if findstr(actualLine, 'T = ')
handles.Temperature = str2double(actualLine(5:end-2));
'Vor dem guidata-Update'
handles.Temperature

handles = guidata(hObject);
guidata(hObject, handles);

'Nach dem guidata-Update'
handles.Temperature
break
end
end
guidata(hObject, handles);
 


Was mir der Prompt jetzt liefert ist:


ans =

Vor dem guidata-Update


ans =

298.1500



und


ans =

Nach dem guidata-Update


ans =

298


Also kann Matlab schon innerhalb einer Routine auf diese Weise den Wert gar nicht korrekt in die Variable handles.Temperature speichern.

Da bin ich nun leider komplett überfragt, warum. Ich dachte, das ganze sei so gestrickt, dass es genau so funktionieren sollte?

Ein ratlos dreinblickender und auf weitere Antworten hoffender MorrisThorne
_________________

*Oink oink, kommt her, ihr Schweinchen! Oink oink!*
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 11.03.2008, 13:36     Titel:
  Antworten mit Zitat      
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);
  if findstr(actualLine, 'T = ')
     handles.Temperature = str2double(actualLine(5:end-2));
     break;
  end
end
guidata(hObject, handles);
 




Code:

function findTemperature(hObject, handles, fid)
actualLine=0;
endOfFile =700;

for j=1:endOfFile
actualLine=fgetl(fid)
if findstr(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);

 


Ich weiss nicht, ob es dir hilfreich war?
Private Nachricht senden Benutzer-Profile anzeigen
 
MorrisThorne
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 07.12.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2008, 09:17     Titel:
  Antworten mit Zitat      
Danke Denny, ich glaube ich habe es nun geblickt - zumindest gibt mir der Erfolg bei der unten folgenden Variante Recht Smile

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
 


und in der Temperaturfunktion

Code:

function findTemperature(hObject, handles, fid)
   actualLine=0;
   endOfFile =700;

   'findTemperature'
   for j=1:endOfFile
      actualLine=fgetl(fid);
      if findstr(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



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
Code:

handles = guidata(hObject);
 

aktualisieren muss, um mit den korrekten Werten weiter zu arbeiten? Hab ich das so richtig Verstanden?


Grüßle, MorrisThorne


P.S.: die Schleife habe ich noch nicht angepasst, werd ich aber noch probieren, danke auch hierfür
_________________

*Oink oink, kommt her, ihr Schweinchen! Oink oink!*
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.03.2008, 16:01     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:

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. Smile

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
Private Nachricht senden Benutzer-Profile anzeigen
 
MorrisThorne
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 07.12.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2008, 16:50     Titel:
  Antworten mit Zitat      
Super, vielen herzlichen Dank, Denny, du hast mir wirklich nicht nur beim akuten Problem sondern auch beim grundlegenden Verständis sehr weitergeholfen Smile

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 Smile


Grüßle MorrisThorne
_________________

*Oink oink, kommt her, ihr Schweinchen! Oink oink!*
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.03.2008, 17:17     Titel:
  Antworten mit Zitat      
Oh, schade

ich war mir aber sicher, dass es funktionieren wird.
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 - 2024 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.