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

function mit Call by Value und Refernce (Klassen)

 

Baki
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2014, 16:04     Titel: function mit Call by Value und Refernce (Klassen)
  Antworten mit Zitat      
Hallo,

Es sei drei Klassen A, B und C gegeben.
Funktion1 erstellt Elemente aus der drei Klassen.
Funktion2 soll nur einen Test durchführen. (Sprich mit den Input-Variablen arbeiten, aber nicht ändern. Call by Value denke ich, oder?)

Code:

[a, b, c] = Funktion1(...);

erg = Funktion2(a, b, c) % In Funktion werden die Elemente a,b und c geändert.

% Die drei Elemente der Klassen sollen aber durch Aufruf der Funktion2 nicht geändert werden.

 


In beiden genannten Funktionen, wird eine dritte Funktion verwendet, die auch die Elemente a,b und c verändern. Ist da was zu beachten, da in Funktion2 diese Änderungen nur für ein Testfall benötigt werden, aber nicht gespeichert werden soll?

Eine alternative und nicht schöne Lösung wäre, die Elemente der Klassen nach Aufruf der Funktion2 erneut zu erstellen... :/
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



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

Eigentlich macht Matlab immer Call by Reference Funktion-Aufrufe.
Der Unterschied liegt nur in Datentyp Verwaltung:
Bei Standard-Datentypen wird wirklich erst bei einer Änderung eine Copy in Speicher erstellt
Bei Instanzen, welche von Handle abgeleitet werden, wird dagegen keine Copy erstellt.

Aber du hast doch in anderen Beitrag erwähnt, dass die Klassen von matlab.mixin.Copyable abgeleitet werden?

Dann kannst du eine Copy von Objekt erstellen und diese an Funktion2 übergeben, dann bist auf der sicheren Seite

Code:

erg = Funktion2(copy(a), copy(b), copy(c))
 


Zuletzt bearbeitet von denny am 13.03.2014, 16:44, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 13.03.2014, 16:41 Uhr von denny
Von Programmierung nach Objektorientierte Programmierung
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2014, 16:41     Titel:
  Antworten mit Zitat      
Hallo,

die entscheidende Frage ist, ob die Klassen "normale" Klassen sind oder ob sie von der Handle-Klasse vererbt sind.
In ersterem Fall hat man (aus Sicht von MATLAB-Nutzern) ganz normales Call-By-Value, im zweiten Fall hat man Call-By-Reference. Bei Handle-Klassen lässt sich das Call-By-Reference - Verhalten nur insofern abschwächen, dass man bei Vererbung von matlab.mixin.Copyable mit der Copy-Methode eine Kopie des Objekts erstellen und diese Kopien dann an die dritte Funktion schicken kann.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2014, 10:29     Titel:
  Antworten mit Zitat      
Hallo denny und Harald,

Ich erhalte folgende Fehlermeldung, wenn ich copy nutze:

Undefined function 'copy' for input arguments of type 'Klasse'.

Meine Klassen waren alle von der Handle-Klasse vererbt, somit Call-By-Reference. Jetzt habe ich alle drei Klassen zu 'normale' Klassen gemacht und es funktioniert.

Danke euch beiden!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

das Problem scheint ja gelöst.

Falls es noch von Interesse ist: die copy-Methode steht nur zur Verfügung, wenn du von matlab.mixin.Copyable statt handle vererbst.
http://www.mathworks.com/help/matla......mixin.copyableclass.html
Falls es damit nicht funktioniert, bitte den verwendeten Code angeben.

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

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 16.06.2014, 08:27     Titel:
  Antworten mit Zitat      
Der Link hat sich geändert:
http://www.mathworks.de/de/help/mat.....mixin.copyable-class.html
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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.