2017-04-06 1 views
0

Ich habe ein seltsames Verhalten in MATLAB beim Deklarieren einer Objektvariable als global. Wo alle globalen Doppeldefinitionen, die ich definiere, durch Funktionen erkennbar sind, scheint es nicht möglich, dasselbe mit Objekten oder Strukturen von Objekten zu tun, die von einer Klasse definiert sind. Das habe ich getan.MATLAB OOP globale Objekte in Funktionen als leer

Klassendefinition:

classdef Class < handle 

    properties 
     property 
    end 

    methods 
     function obj = Constructor(value) 
      if nargin == 1 
       obj.property = value; 
      end 
     end 
    end 

end 

Bau der Objekte Array:

% Define objects array as global variable to be accessible in functions  
global objectsArray variableA 

% define value of variable A, to be accessible in functions 
variableA = 123; 

% Values to be assigned to objects' property field  
values = [1,2,3]; 

% initialise object array using constructor 
if isempty(objectsArray) 
    objectsArray(3,1) = Constructor(); 
end 

% define objects' property field 
for k = 1:3 
    objectsArray(k) = Constructor(values(k)); 
end 

Jetzt möchte ich eine Funktion wie den Zugriff auf sowohl die Objekte Arrays und Variablen A, die beide oben definiert sind, und beide als globale Variablen deklariert. Wenn ich jedoch eine Funktion wie folgt aufbaut, ist nur die Variable A zugänglich, während das Objekt-Array als leere Variable betrachtet wird.

function varargout = doSomething (varargin) 

    global objectsArray variableA 

    aaa = variableA; 
    bbb = objcetsArray(1).property; <--- code crashes here 

end 

Der Code stürzt beim Ausführen der Anweisung ab, die bbb definiert. Debug-Modus zeigt, dass objectsArray ist leer, und diese VariableA ist gleich ihrem Wert, 123. Beenden Debug-Modus, Beenden daher die Ausführung der Funktion, die ObjectsArray ist so definiert, wie ich es erwarten würde, als eine Struktur von 3 Objekten.

Meine Frage ist, warum passiert das? Warum scheint es möglich, globale Variablen aufzurufen, aber nicht, wenn sie als Objekte definiert sind?

Antwort

0

Nach einiger Recherche erkannte ich, dass das Problem nicht das Objekt selbst war, sondern das Konzept der globalen Variablen und wie MATLAB damit arbeitet.

Das gleiche Problem tritt auf, wenn versucht wird, eine Struktur global zu machen.

Das Problem hier ist nicht durch die globale verursacht, zumindest nicht direkt

:

Eine Antwort auf meine Frage in this thread vom Benutzer Steven Herrn erklärt. Wenn Sie eine Variable als global definieren, beginnt sie als leeres Doppelfeld (0-by-0). Also diese Zeile:

global array_Structure

setzt array_Structure ein globales Array sein, die [].

Nun, wenn Sie versuchen, eine Struktur-Array (data_Struct) in ein Element der array_Structure Doppel Variablen zugewiesen werden, da die Variable alle einen Typ sein, hat MATLAB eine der Variablen konvertieren in den Typ des anderen . In diesem Fall, da Sie versuchen, die Struktur in das Double-Array zu setzen, versucht es, die Struktur in eine Doppel-Array zu konvertieren. Für einige Paare der eingebauten Datentypen weiß MATLAB , wie implizit zwischen den zwei Datentypen konvertiert wird (zum Beispiel double to single) - aber struct und double gehören nicht zu diesen Paaren von Typen, also MATLAB sagt, dass das Umwandeln einer Struktur in ein Double nicht möglich ist. Es weiß nicht, wie es geht.