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

Invalid Handle function call

 

stenkelfled
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 17.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2017, 15:27     Titel: Invalid Handle function call
  Antworten mit Zitat      
Hallo,

ich habe (testweise) eine einfache Klasse:
Code:
classdef MySimpleClass < handle
   
    properties
        id;
    end
   
    methods
        function obj = MySimpleClass()
            obj.id = rand;
        end
       
        function hello(obj)
            a = 5;
            b = 7;
            fprintf('a+b=%d\n', (a+b));
            fprintf('Hello %d\n', (a*obj.id+b));
        end
    end
   
end


Wenn ich mir eine Instanz dieser Klasse erzeuge und dann wieder lösche, habe ich ein ungültiges Handle:
Code:
>> c = MySimpleClass();
>> c.delete
>> c
c =
  handle to deleted MySimpleClass


Jetzt kommt das, was ich nicht verstehe: WARUM um alles in der Welt kann ich immer noch Funktionen dieses Invalid Handles aufrufen?
Code:
>> c.hello
a+b=12
Invalid or deleted object.
Error in MySimpleClass/hello (line 18)
            fprintf('Hello %d\n', (a*obj.id+b));

Der Fehler kommt leider nicht beim Aufruf der Funktion, sondern beim Zugriff auf die Objektvariable obj. (Die ersten drei Zeilen werden ja noch ausgeführt, s. Ausgabe)

Sollte nicht eigentlich der Interpreter schon in dem Moment meckern, wenn ich den Funktionsaufruf durchführe?
Hier ist es zugegeben nicht so wichtig, wo der Fehler geworfen wird, aber ich habe auch Stellen, so mir der Error-Stack das gesamte CommandWindow zurotzt und dann suche ich ewig, wo der Fehler liegt, und dabei existiert die Instanz der Klasse gar nicht mehr.
Ich weiß, dass ich theoretisch mit am Funktionsanfang mit isvalid() auf ein gültiges Objekt prüfen könnte, aber das kann ja eigentlich nicht die Lösung sein...

Liege ich mit meiner Erwartung, dass der Funktionsaufruf nicht möglich sein sollte, falsch, oder ist das ein Problem der Programmiersprache? Hat schon jemand anderes damit Erfahrungen gemacht?

Sind etwa in MATLAB alle Funktionen static und die "normalen" Funktionen unterscheiden sich nur dadurch, dass sie als erstes Argument das Objekt übergeben bekommen?

Vielen Dank für eure Hilfe
Private Nachricht senden Benutzer-Profile anzeigen


punkNgrind
Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 14.03.2017, 13:32     Titel:
  Antworten mit Zitat      
Soweit ich das verstehe, führst du mit delete nur den Destruktor aus, aber c ist immer noch eine Klasse von Typ MySimpleClass.
Erst mit clear c wird diese vom Workspace gelöscht.

Also es existiert zwar noch die Klasse, aber keine Instanz mehr. Somit kommt der Fehler erst, wenn du mit obj. auf ein konkretes Objekt zugreifen willst.

Hier ist übrigens eine tolles PDF von MATLAB:
https://www.mathworks.com/help/pdf_doc/matlab/matlab_oop.pdf
Private Nachricht senden Benutzer-Profile anzeigen
 
stenkelfled
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 17.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.03.2017, 08:02     Titel:
  Antworten mit Zitat      
punkNgrind hat Folgendes geschrieben:
Soweit ich das verstehe, führst du mit delete nur den Destruktor aus, aber c ist immer noch eine Klasse von Typ MySimpleClass.
Erst mit clear c wird diese vom Workspace gelöscht.


Das ist mir schon klar - ich hätte trotzdem erwartet, dass Memberfunktionen in diesem Fall nicht mehr aufgerufen werden können, weil ja keine Instanz der Klasse mehr existiert. Um es mit C++ zu sagen: Die Variable mit dem Pointer exisitert zwar noch, aber die Daten an besagter Speicheradresse nicht mehr.

Mein Problem ist nicht, dass der Aufruf generell nicht funktioniert (das kann er ja auch nicht). Mein Problem ist, dass der Fehler von der falschen Stelle kommt, was die Fehlersuche extrem erschwert. Was ich möchte: bereits dann einen Fehler, wenn ich versuche die Funktion aufzurufen und nicht erst dann, wenn ich in der Funktion auf eine Membervariable zugreife (-> ist diese Option generell so nicht vorgesehen, oder mache ich nur was falsch?).

Aber wahrscheinlich ist das das allgemeine Problem von MATLAB, dass es zwar explizit keine Datentypen gibt, aber implizit alles darauf ausgelegt ist, dass man die richtigen Datentypen verwendet. (Bitte nicht falsch verstehen: MATLAB ist schon ne echt tolle Sache, aber manchmal bin ich doch recht enttäuscht, wie kompliziert die "einfache" MATLAB-Sprache werden kann.)
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 15.03.2017, 14:02     Titel:
  Antworten mit Zitat      
stenkelfled hat Folgendes geschrieben:


Mein Problem ist nicht, dass der Aufruf generell nicht funktioniert (das kann er ja auch nicht). Mein Problem ist, dass der Fehler von der falschen Stelle kommt, was die Fehlersuche extrem erschwert. Was ich möchte: bereits dann einen Fehler, wenn ich versuche die Funktion aufzurufen und nicht erst dann, wenn ich in der Funktion auf eine Membervariable zugreife (-> ist diese Option generell so nicht vorgesehen, oder mache ich nur was falsch?).


Ich gebe dir da vollkommen recht, es wäre natürlich die logische Konsequenz das so zu machen wie du es beschreibst.
Ich habe auch erst mit OOP-MATLAB angefangen und kann dir die Frage leider nicht beantworten.

stenkelfled hat Folgendes geschrieben:

Aber wahrscheinlich ist das das allgemeine Problem von MATLAB, dass es zwar explizit keine Datentypen gibt, aber implizit alles darauf ausgelegt ist, dass man die richtigen Datentypen verwendet.


Das trifft wahrscheinlich den Nagel auf dem Kopf, ist halt immer noch eine Skript-Sprache.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.03.2017, 14:50     Titel:
  Antworten mit Zitat      
Hallo,

um die Frage zu klären, dürfte es am besten sein, den Technischen Support von MathWorks zu kontaktieren.

Grüße,
Harald
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.