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 Programstruktur ???

 

FeLe
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 07.09.2012, 10:04     Titel: Problem mit Programstruktur ???
  Antworten mit Zitat      
Hallo an alle!
Ich muss wieder um euer Hilfe fragen, weil ich nicht weiter komme. Ich habe eine Abstarakte-Klasse definiert 'param'. In der Klasse ist eine Abstrakte-Funktion definiert 'calc'. Für jede Unterklasse wird diese überschrieben. Dann habe ich abgeleitete Klasse 'tnoise' geschrieben. Das Problem ist wenn die Funktion 'calc' als externe m-Datei abspeichere, funktioniert alles. Das will ich aber nicht, weil ich für eine andere abgeleitete Klasse die Funktion ‚calc‘ auch definieren möchte. Wenn ich aber die Funktion in der Klassen-Definition unter methoden einfüge, kriege ich die Fehlermeldung:

Code:
??? Undefined function or method 'calc' for input arguments of type 'cell'.

Error in ==> tnoise>tnoise.get.data at 52
                data{s} = calc(rawdat);    % calculation of the value


Ich finde leider keinen Antwort daraf Sad Hier ist meine definition von tnoise class:
Code:
classdef tnoise < param    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
    properties (SetAccess = private)
        testseq;        % Test sequece dipend on parameter typ
        ptyp='noise';   % Parameter typ
        path;           % Path to the test data
        sID;            % Sensor IDs
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    properties (Dependent = true)
        data;
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    properties (Constant)
        ptyps = 'noise';
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    methods
        %% constructor
        function obj = tnoise(varargin)
            switch rem(nargin,2) % check if the count of input variables is even?
                case 0 % yes is even
                    % check count of input variables
                    if nargin < 6
                        error('not enoug input to create tnoise object')
                    elseif nargin == 6
                        for u=1:2:nargin
                            if ischar(varargin{u}) && ~isempty(regexp(varargin{u},'path','once'))
                                obj.path = varargin{u+1};                                
                            elseif ischar(varargin{u}) && ~isempty(regexp(varargin{u},'sID','once'))
                                obj.sID = varargin{u+1};
                            elseif ischar(varargin{u}) && ~isempty(regexp(varargin{u},'testseq','once'))
                                obj.testseq = varargin{u+1};
                            else
                                error('Unknown input argument')
                            end
                        end
                        obj.ptyp = 'noise'; % sensor parameter typ noise
                    else
                        error('call tnoise with to many arguments')
                    end
                case 1 % no is not
                    error('conunt of input arcuments must be even number!')
            end
        end
             
        %% Get Data methode
        function data = get.data(obj)
            data = cell(1,length(obj.sID));
            for s=1:length(obj.sID)
                rawdat = getdat(obj,obj.sID{s});   % function import of raw data from file
                data{s} = calc(rawdat);    % calculation of the value
            end
        end
       
        %% Calc methode
        % real function is defined in a file
        function data = calc(rawdat)
            [lT lP] = size(rawdat);
            for T = 1:lT
                for P =1:lP
                    data.abs(T,P) = max(rawdat{T,P}) - min(rawdat{T,P});
                end
            end
        end
    end
end


und die Definition von param class:
Code:
classdef param < hgsetget
   
    %% Properties definition
    % Everybody can see property value but only obj intern set methode can change that
    % one value for this property in all instances of the class
    % properties hay no implementation, concrete subclass must redefine this property
    properties (Abstract = true, SetAccess = private, GetAccess = public)
        ptyp;       % Parameter typ
        path;       % Path to the measured raw data
        sID;        % Sensor IDs
        testseq;    % Data with test profile
    end
   
    %% Method definition    
    % Abstract method definition concrete subclass must redefine this method
    methods (Abstract=true)
        data = calc(rawdat);
    end
end
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.09.2012, 10:27     Titel:
  Antworten mit Zitat      
Hallo,

eine Methode muss als erstes Eingabeargument immer ein Objekt des Datentyps bekommen.
Wenn das nicht gewünscht ist, muss bei der Methode das Attribut Static gesetzt werden. Siehe
http://www.mathworks.com/help/relea.....c/matlab_oop/brdqiu3.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
FeLe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 07.09.2012, 10:47     Titel:
  Antworten mit Zitat      
Vielen Dank Harald,
Es hat leider überhaupt nicht geholfen.

Code:
classdef tnoise < param    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
    properties (SetAccess = private)
        testseq;        % Test sequece dipend on parameter typ
        ptyp='noise';   % Parameter typ
        path;           % Path to the test data
        sID;            % Sensor IDs
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    properties (Dependent = true)
        data;
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    properties (Constant)
        ptyps = 'noise';
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    methods
        %% constructor
        function obj = tnoise(varargin)
            switch rem(nargin,2) % check if the count of input variables is even?
                case 0 % yes is even
                    % check count of input variables
                    if nargin < 6
                        error('not enoug input to create tnoise object')
                    elseif nargin == 6
                        for u=1:2:nargin
                            if ischar(varargin{u}) && ~isempty(regexp(varargin{u},'path','once'))
                                obj.path = varargin{u+1};                                
                            elseif ischar(varargin{u}) && ~isempty(regexp(varargin{u},'sID','once'))
                                obj.sID = varargin{u+1};
                            elseif ischar(varargin{u}) && ~isempty(regexp(varargin{u},'testseq','once'))
                                obj.testseq = varargin{u+1};
                            else
                                error('Unknown input argument')
                            end
                        end
                        obj.ptyp = 'noise'; % sensor parameter typ noise
                    else
                        error('call tnoise with to many arguments')
                    end
                case 1 % no is not
                    error('conunt of input arcuments must be even number!')
            end
        end
       
        %% Get Data methode
        function data = get.data(obj)
            data = cell(1,length(obj.sID));
            for s=1:length(obj.sID)
                rawdat = getdat(obj,obj.sID{s});   % function import of raw data from file
                data{s} = calc(rawdat);    % calculation of the value
            end
        end
    end
   
    methods    (Static)
        %% Calc methode
        % real function is defined in a file
        function data = calc(rawdat)
            [lT lP] = size(rawdat);
            for T = 1:lT
                for P =1:lP
                    data.abs(T,P) = max(rawdat{T,P}) - min(rawdat{T,P});
                end
            end
         end
    end
end


Fehlermeldung:
Code:
??? Undefined function or method 'calc' for input arguments of type 'cell'.

Error in ==> tnoise>tnoise.get.data at 52
                data{s} = calc(rawdat);    % calculation of the value
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.09.2012, 11:42     Titel:
  Antworten mit Zitat      
Hallo,

der Klassenname muss, wie im Link beschrieben, angegeben werden.
Code:
data{s} = tnoise.calc(rawdat);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2012, 11:44     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

eine Methode muss als erstes Eingabeargument immer ein Objekt des Datentyps bekommen.


Ja

Harald hat Folgendes geschrieben:

Wenn das nicht gewünscht ist, muss bei der Methode das Attribut Static gesetzt werden.


Das kann im Sinne der Polymorphie nicht funktionieren, denn eine statische Methode ist eben "statisch", d.h. einmalig innerhalb ihres Scopes. D.h. das Überladen, was der OP hier möchte funktioniert nicht. Eine statische Methode gehört zwar zu einer Klasse (was äquivalent zu einem Namespace ist), aber sie ist nicht Teil eines Objektes, eben weil sie statisch ist. Der OP möchte aber eine klassische Vererbung und damit darf die Methode nicht statisch sein, weil ich sie nicht vererben kann. Die Antwort im Sinne der OOP ist also so falsch und wird nicht funktionieren.

Also: Mach die Methode nicht statisch, dann deklariere sie als Methode Deiner abstrakten Klasse und vererbe sie. In der erbenden Klasse überlädst Du sie einfach.

Dann verweise ich noch einmal auf Haralds Antwort:
Harald hat Folgendes geschrieben:

eine Methode muss als erstes Eingabeargument immer ein Objekt des Datentyps bekommen.

Der erste Parameter einer jeden Methode ist das Objekt, d.h. wenn Du als Parameter nur varargin hast, dann überlege Dir was in varargin{1} drin steht ! Ich empfehle hier zu unterscheiden
Code:

methods
    function dosomething(this, varargin)
    end
end
 

Dann ist "this" immer das Objekt, natürlich geht es auch ohne, aber dann muss man varargin auch richtig verwenden, was Du hier nicht machst
Private Nachricht senden Benutzer-Profile anzeigen
 
FeLe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 07.09.2012, 12:26     Titel:
  Antworten mit Zitat      
An Harald: Vielen Dank jetzt funktioniert es Smile
An flashpixx: Vielen Dank. Ich möchte die Methode nicht in der abgeleiteten Klasse tnoiese überladen.
Es gibt eine Superklasse 'param' dort habe ich die Methode als abstract definiert und will nun die in der Abgeleiteten Klassen 'tnoise' für alle Instanzen dieser Klasse definieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2012, 13:44     Titel:
  Antworten mit Zitat      
FeLe hat Folgendes geschrieben:

Es gibt eine Superklasse 'param' dort habe ich die Methode als abstract definiert und will nun die in der Abgeleiteten Klassen 'tnoise' für alle Instanzen dieser Klasse definieren.


Das nennt man aber "überladen", denn Du überlädst die abstrakt definierte Methode in der implementierten Klasse, somit ist die implementierte Methode für alle Instanzen (Objekte) Deiner abgeleiteten Klasse gültigtig
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.