|
|
Invalid Handle function call |
|
stenkelfled |
Forum-Newbie
|
|
Beiträge: 2
|
|
|
|
Anmeldedatum: 17.02.17
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 17.02.2017, 15:27
Titel: Invalid Handle function call
|
|
|
|
|
Hallo,
ich habe (testweise) eine einfache Klasse:
Wenn ich mir eine Instanz dieser Klasse erzeuge und dann wieder lösche, habe ich ein ungültiges Handle:
Jetzt kommt das, was ich nicht verstehe: WARUM um alles in der Welt kann ich immer noch Funktionen dieses Invalid Handles aufrufen?
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
|
|
|
|
|
punkNgrind |
Forum-Century
|
|
Beiträge: 136
|
|
|
|
Anmeldedatum: 10.03.11
|
|
|
|
Wohnort: Hamburg
|
|
|
|
Version: R2014b
|
|
|
|
|
|
Verfasst am: 14.03.2017, 13:32
Titel:
|
|
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
|
|
|
stenkelfled |
Themenstarter
Forum-Newbie
|
|
Beiträge: 2
|
|
|
|
Anmeldedatum: 17.02.17
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 15.03.2017, 08:02
Titel:
|
|
|
|
|
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.)
|
|
|
punkNgrind |
Forum-Century
|
|
Beiträge: 136
|
|
|
|
Anmeldedatum: 10.03.11
|
|
|
|
Wohnort: Hamburg
|
|
|
|
Version: R2014b
|
|
|
|
|
|
Verfasst am: 15.03.2017, 14:02
Titel:
|
|
|
|
|
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.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 15.03.2017, 14:50
Titel:
|
|
Hallo,
um die Frage zu klären, dürfte es am besten sein, den Technischen Support von MathWorks zu kontaktieren.
Grüße,
Harald
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|