Verfasst am: 01.02.2010, 16:55
Titel: Daten in GUI laden
Hallo zusammen.
Ich habe mittels nested functions ein GUI geschrieben in dem Daten gespeichert, weiter verarbeitet, geplottet und auch wieder geladen werden sollen.
Leider funktioniert das mit dem Laden der Daten, die in einer struct gespeichert sind, überhaupt nicht.
Dateiname ist gegeben über Datei und die Variable, die ich laden möchte heißt Daten.
Jetzt habe ich ein Problem mit dem Zusammenfügen der Daten, also, der geladenen Daten und der Daten, die ich zu diesen hinzufügen möchte.
Ich bekomme die Fehlermeldung:
CAT arguments are not consistent in structure field number.
Wenn ich mir die struct mal anzeigen lasse, bekomme ich folgendes:
Der Unterschied liegt darin, dass du einmal load mit Zuweisung und einmal ohne Zuweisung aufrufst.
Wenn du load mit Zuweisung aufrufst, dann wird Variable
in Mat-File als Strukturfeld zugewiesen.
Code:
alteDaten= load(Datei,'Daten')
%
% Daten Variable, wird als Struct-Feld an alteDaten zugewiesen % Zugriff auf Ursprungs-Struktur erfolgt dann so:
alteDaten.Daten
auch ich habe den Fehler "Undefined function or method 'evalin' for input arguments of type 'struct'." erhalten, als ich eine struct-Variable mit evalin('basic', ...) von einer Funktion aus verändern wollte. Bei der Vereinfachung des Problems habe ich weitere andere Fehlermeldungen erhalten, die durch die falsche Verwendung der Workspaces beruhen.
Auch wenn die Frage hier nicht hundertprozentig richtig ist, versuche ich es trotzdem einmal:
Ich möchte von einer Funktion aus eine Variable im 'basic'-WS speichern, die in der Funktion definiert ist (in der Funktion ist ihr ein Wert, ein Text oder eine Struktur zugewiesen). Allerdings weiß ich nicht, wie ich, einmal im 'basic' wieder in den functions-WS (temporär) zurück zeige?
Folgendes Minimalbeispiel veranschaulicht die Idee, funktioniert aber leider nicht.
evalin('base', 'testvar1=100')% Diese Zeile funktioniert evalin('base',['testvar2=',zahl])% Hier wird die Variable Zahl nicht gefunden, da nicht in 'basic' vorhanden
??? Error using ==> evalin
Undefined function or variable 'd'.
Später einmal soll eine Variable im 'basic' mit einer Variablen aus der Funktion überschrieben werden, wobei die Funktionsvariable über einen "Pointer" aufgerufen werden soll.
Wie schon in alle Beträgen hier erwähnt worden ist:
EVALIN akzeptiert nur Ausdrücke in STRING-Format!!!
Also Bitte aufpassen, daß der Ausdruck den Wunsch Vorstellung entspricht.
Jetzt zu deinem Fehler:
1) Die Variable zahl ist von Typ Double.
2) Du versuchst String mit Double zusammenzusetzen
3) EVALIN wertet jetzt den Ausdruck: testvar2=d
Also muss EVALIN testvar2 Variable d in Workspace zuweisen.
Diese Variable d existiert nicht in Workspace, also folglich kommt es zum oben genannten Fehler.
Also muss du entweder SPRINTF oder NUM2STR nutzen um den Ausdruck in String zu bringen
Mit deinem Rat habe ich das Ganze mittels sprintf() realisiert, allerdings habe ich nun mit evalin() ein Problem:
??? Undefined variable "myLocal" or class "myLocal.Value".
Zitat:
Ich möchte von einer Funktion aus eine Variable im 'basic'-WS speichern, die in der Funktion definiert ist (in der Funktion ist ihr ein Wert, ein Text oder eine Struktur zugewiesen). Allerdings weiß ich nicht, wie ich, einmal im 'basic' wieder in den functions-WS (temporär) zurück zeige?
Hier noch ein Minimalbeispiel:
Code:
function myfkt()
%% Eingabe Werte:
myLocal.Value= 10;
pointer = 'myLocal.Value';
%% Verarbeitung und Ausgabe Werte: % Im Funktions-WS: eval(sprintf('testvar_loc=%s',pointer))% funktioniert % Im Base-WS: evalin('base',sprintf('testvar_bas=%s',pointer))% führt zu einem Fehler end
Die Variable muss ja in Workspace definiert sein. Also in "base".
Jede Funktion hat eigenes Workspace, und sie können nur auf dieses Workspace zugreifen. Du hast diese Variable ja nur in der Funktion definiert.
Deswegen kommt es zu Fehlermeldung
EVALIN und ASSIGNIN sind dazu da, um zwischen Workspaces auszutauschen.
base ist dabei zentrales Workspace, wo du auch über die Konsole zugreifst.
caller ist der Workspace der Funktion, welche diese Funktion aufruft.
EVAL arbeitet dagegen nur in aktuellen Workspace
Code:
function myfkt()
%% Eingabe Werte:
myLocal.Value= 10;
pointer = 'myLocal.Value';
% vorher in base definieren evalin('base','myLocal.Value= 10') % Im Base-WS: evalin('base',sprintf('testvar_bas=%s',pointer)) end
Schade, wenn man die Variable vor der Zuweisung extra in den 'base' schiebt, dann ist ja einer der großen Vorteile (nämlich Kapselung) von function wieder weg.
Um die Variable vorher nicht in 'base' schreiben zu müssen, habe ich es mal mit assignin() versucht. Allerdings geht dies nur eingeschränkt für structs.
WARUM???
Problem hierbei ist, dass mit dieser Form das Unter-struct einfach überschrieben und nicht ergänzt wird. Damit wird meine gesamte Funktion, die meinen Substruct mit Elementen ergänzen soll und die ich gerade um diese unten beschriebene Teilfunktion herumbastle zunichte gemacht.
Schade, wenn man die Variable vor der Zuweisung extra in den 'base' schiebt, dann ist ja einer der großen Vorteile (nämlich Kapselung) von function wieder weg.
Was verstehst hier du unter Kapselung? Dazu gibt es Funktionen und Unterfunktionen.
EVALIN ist nicht der Sinn dazu. Das ist nur eine Methode, um auf die Daten einer zentraler Stelle zuzugreifen oder die Daten zu manipulieren. Die Methode ist aber sehr "dirty", also sollte man grundsätzlich die Finger davon lassen.
Zitat:
Um die Variable vorher nicht in 'base' schreiben zu müssen, habe ich es mal mit assignin() versucht. Allerdings geht dies nur eingeschränkt für structs.
ASSIGNIN ist nur für einfache Variablen möglich, nicht für Structs.
Zitat:
Problem hierbei ist, dass mit dieser Form das Unter-struct einfach überschrieben und nicht ergänzt wird. Damit wird meine gesamte Funktion, die meinen Substruct mit Elementen ergänzen soll und die ich gerade um diese unten beschriebene Teilfunktion herumbastle zunichte gemacht.
Wie Gesagt die Daten sollte dann schon in Workspace vorliegen, und die Funktion manipuliert nur diese Daten einwenig. Ich glaube du sollst mal beschreiben was du überhaupt erreichen willst, sonst entsteht bereits Wirrwarr
@Denny: Vielen Dank für die bisherigen schnellen Antworten!
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.