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

Abhängigkeit zweiter Klassenelemente

 

Avalanche
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 28.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2013, 11:56     Titel: Abhängigkeit zweiter Klassenelemente
  Antworten mit Zitat      
Hallo,

ich habe ein Problem bei der Zuweisung von einer Datei an zwei Elemente einer Klasse.

Hier mein Code:

Code:

classdef ASIC < handle
   
    properties
        CF640_Read;
        CF640_Write;
        h;
        Typ;
    end    
   
    methods
        function object = ASIC(h) % Konstruktor
            object.h = h;
            object.Typ = 3;
           
            load('CF640_mod0.mat')
            object.CF640_Write = CF640;% Hier soll das Schreibobjekt mit der Datei geladen werden
           
            load('CF640_mod0.mat')
            object.CF640_Read = CF640;% Hier soll das Leseobjekt mit der Datei geladen werden
        end
end
end
   

Wenn ich mittels selbst entwickelter SetMethoden auf eines der beiden Elemente zugreife und einen Wert verändere, so ändert sich dieser Wert in beiden Elementen.
Ich dachte, durch das zweimalige Laden der Datei wird verhindert, dass beide Objekt "pointerlike" auf dasselbe zeigen und somit voneinander abhängig sind.

Ich habe auch schon ausprobiert, die Dateien in zwei verschiedene Ordner abzuspeichern und die Dateien unterschiedlich zu benennen. Hat leider beides nicht funktioniert.
Selbst wenn man nach der ersten Zuweisung die Variable "CF640" löscht, ist die Abhängigkeit vorhanden.

Nun meine Frage: Wie kann ich eine Datei in zwei verschiedene Variablen laden, sodass diese voneinander entkoppelt sind?


Vielen Dank =)
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.07.2013, 12:26     Titel:
  Antworten mit Zitat      
Hallo

ich kann deinen Fehler so nicht reproduzieren. Welchen Datentyp wird denn überhaupt zugewiesen? Ich kann so ein Verhalten nur bei einer Instanz erklären.

Zitat:
Wenn ich mittels selbst entwickelter SetMethoden auf eines der beiden Elemente zugreife und einen Wert verändere, so ändert sich dieser Wert in beiden Elementen.


Bitte auch Setter Methoden posten, ich vermute dass der Fehler auch dort stecken könnte.

Ich habe deine Klasse und die Datei wie folgt modifiziert, und es lief alles problemlos
Code:

CF640 = 5;
save('CF640_mod0.mat','CF640')
 


Code:

classdef ASIC < handle
   
   properties
      CF640_Read   = [];
      CF640_Write  = [];
      h;
      Typ;
   end
   
   methods
      function obj = ASIC() % Konstruktor
         obj.Typ = 3;
         
         load('CF640_mod0.mat')
         obj.CF640_Write = CF640;
         obj.CF640_Read  = CF640;
      end
     
      function set.CF640_Read(obj,val)
         obj.CF640_Read = val;
      end
     
      function set.CF640_Write(obj,val)
         obj.CF640_Write = val;
      end
     
           
      function display(obj)
         disp(obj.CF640_Write)
         disp(obj.CF640_Read)
      end
     
   end
end
 



Aufruf:

Zitat:

>> a=ASIC()
5
5

>> a.CF640_Read = 6
5
6
>> a.CF640_Write = 7
7
6

Private Nachricht senden Benutzer-Profile anzeigen
 
Avalanche
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 28.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2013, 12:59     Titel:
  Antworten mit Zitat      
Hei,

Die Datei ist eine vorher generierte mat-Datei. In ihr wird ein Chip mit 512 Registern abgebildet. Der Datentyp des Objektes, das beim Laden der Datei entsteht, ist "Register". Diesen Datentyp habe ich selbst geschrieben.

Mit der SetMethode verhält es sich folgendermaßen:
Ich möchte einmal nur das Schreibobjekt schreiben. Das heißt, ich adressiere nur das Element CF640_Write und ändere dort Werte. Das Objekt CF640_Read soll aber NICHT verändert werden.
In derselben Methode soll es aber auch möglich sein, beide Objekte gleichzeitig zu beschreiben, indem das Element "Typ" anders gesetzt wird.

Es gibt also eine SetMethode, die beide Objekte beschreiben könnte.

Prinzipiell sieht diese Methode so aus:

Code:

function SetRegister(ASIC,input, value)
            if isa(input,'double')                
                input = dec2hex(input,4)
                input = strcat('0x',input);
            end
            if strcmp(input(1:2),'0x')&& (strcmp(input(3:4),'00')==0)
                if hex2dec(input(3:end))<=255
                    input = strcat('0x','00', input(3:end));
                else
                    input = strcat('0x','0',input(3:end));
                end
            end
            if strcmp(input,'0x00')
                input = strcat(input,'00');
            end
           
            flag = 0; % Fehlerflag
            for ii = 1 : 512 % Suchen des zu verändernden Registers
               if strcmp(ASIC.CF640_Write(1,ii).content.name, input) || ...
                   strcmp(ASIC.CF640_Write(1,ii).content.adresse, input)  
                   if ASIC.CF640_Write(1,ii).content.access == 'rw'
                       ASIC.CF640_Write(1,ii).content.SetRegister_value(value);
                       pos = ii; % Speichert Position des Registers
                       flag = 1;
                   elseif  ASIC.CF640_Write(1,ii).content.access == 'r'
                       error('Access denied!!! It is not allowed to set this Register');
                   end
               end  
            end
           
            if flag == 0
                if strncmp(input, '0x',2) == 1 % Falsche Adresseingabe abfangen
                    error('Desired address does not exist!');
                elseif strcmp(input, '0x') == 0 % Nur kleingeschriebene Namen erlauben
                    if any(any((input>='A'&input<='Z')))% Nur kleingeschriebene Namen erlauben
                        error('Please check spelling. Capital letters are prohibited');
                    else
                        error('Reference to non-existend field');
                    end
                end                
            end
           
            % Abfrage, was beschrieben werden soll
           
            wert = ASIC.CF640_Write(1,pos).content.register_value(3:end);
            adr = ASIC.CF640_Write(1,pos).content.adresse(3:end);
           
 
            if ASIC.Typ == 1

                ASIC.CF640_Read(1,pos).content.SetRegister_value(value);

           
            end    

        end % Function

 



Zusätzlich Informationen: die Funktion SetRegister_value ist in der Klasse Register hinterlegt, mit der die Datei CF640_mod0.mat erstellt wird.


Deine Optimierung, dass man die Datei nur einmal einliest und in beide Objekte beschreibt, funktioniert bei mir leider nicht.


Ich weiß nicht, ob das verständlich ist. Bei Fragen bitte einfach melden.

Vielen Dank schonmal für die Antwort
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.07.2013, 13:36     Titel:
  Antworten mit Zitat      
Hallo

also doch eine Instanz der Klasse Register. Eigentlich wenn man eine Instanz
speichert, ist das beim Laden trotzdem eine Instanz der Klasse, also immer der selbe Objekt.

Um eine Kopie von einer Instanz zu erhalten, muss man die von entsprechender Superklasse ableiten:
http://www.mathworks.de/de/help/mat......mixin.copyableclass.html

Dann steht die COPY-Funktion zur Verfügung,
also schaue auch Ideen dazu hier:
http://www.gomatlab.de/handle-objek.....e-zu-benutzen-t22236.html
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.