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

Fehlermeldung bei Variablen mit dot indexing

 

BlackDice
Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 02.04.2021, 09:42     Titel: Fehlermeldung bei Variablen mit dot indexing
  Antworten mit Zitat      
Moin zusammen,
ich bekomme in der ersten Zeile die nachfolgende Fehlermeldung:
Code:
           MaterialFaktor(v) = app.FaktorList(strcmp(app.Material_DropDown(v).Value, app.UnitList));
           app.Matdicke(v) = app.Material_Field(v).Value * MaterialFaktor(v);


"Dot indexing is not supported for variables of this type."

Ich lasse mir über einen Spinner zwischen 1 und 20 DropDown Menüs und Eingabefelder erzeugen. Das ist meine Faktor- und UnitList:
Code:
       FaktorList = [1e-6,  1e-3,  1,    1e3,   1e-6, 1e-3, 1e-2, 1e-3, 1];
        UnitList   = {'µHz', 'mHz', 'Hz', 'kHz', 'µm', 'mm', 'cm', 'mV', 'V'};


Ziel ist es, dass ich später zwischen 1 und 20 unterschiedliche Materialdicken habe die dann in der passenden Variable gespeichert sind. Also in app.Materialdicke1 soll die dann das Ergebnis aus der Multiplikation zwischen Material_DropDown1 und Material_Field1 stehen.

Viele Grüße
Fabian
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: 02.04.2021, 10:10     Titel:
  Antworten mit Zitat      
Hallo,

ich kann dir da nur raten, das zu tun, was ich auch tun würde: debuggen.
Insbesondere ist die Frage, was app.Material_DropDown(v) zum Zeitpunkt des Fehlers ist.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 02.04.2021, 12:14     Titel:
  Antworten mit Zitat      
In App.Material_DropDown steht 6.0073 drin. Woher die Zahl kommt weiß ich aber nicht. Was aber auffällt ist, dass in den Zeilen davor und danach niedrigere bzw. höhere Zahlen sind. Also 5.0076 und 7.0073.

In (v) steht der Wert aus meiner For Schleife. Das stimmt ja auch soweit, weil es ja mein erster Materialwert sein soll. Was in Value steht wird mir nicht angezeigt.

Ich weiß nicht ob strcmp damit nicht klar kommt? Ein paar Zeilen vorher sieht das ganz nämlich so aus und das funktioniert.
Code:
           DurchmesserFaktor = app.FaktorList(strcmp(app.Elektrode_DropDown.Value, app.UnitList));
            app.ElekDurch = app.Elektrode_Field.Value * DurchmesserFaktor;
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: 02.04.2021, 12:24     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
In App.Material_DropDown steht 6.0073 drin.

Dann ist es nicht sinnvoll, mit .Value weiter zu schreiben. Ich habe dir ja in vorherigen Beiträgen schon set empfohlen. Um Werte abzufragen, dementsprechend get.

Zitat:
Ich weiß nicht ob strcmp damit nicht klar kommt?

Daran liegt es nicht, denn die Fehlermeldung tritt ja schon beim Erstellen des Arguments von strcmp auf.

Zitat:
Ein paar Zeilen vorher sieht das ganz nämlich so aus und das funktioniert.

Dann sollte die logische Konsequenz sein, sich im Debugger anzusehen, was in dieser Zeile anders ist.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 02.04.2021, 13:37     Titel:
  Antworten mit Zitat      
Ok danke. Hab das mit get() hinbekommen.

Wo kann ich denn im App Designer für Felder die ich erst nach dem Start erstelle ein Callback erstellen?
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: 02.04.2021, 14:04     Titel:
  Antworten mit Zitat      
Hallo,

was meinst du mit Feldern? Steuerelemente wie uidropdown?
Den Callback kannst du als Parameter-Wert-Paar angeben. Für uidropdown ist das im Doku-Beispiel "Code Response to Drop Down Selection" gezeigt.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 02.04.2021, 18:08     Titel:
  Antworten mit Zitat      
Moin, ja genau es sind DropDown Menüs und Eingabefelder. Ich weiß nicht genau wo ich den Callback von den nach dem Start erstellten DropDown und Eingabefeldern hin programmieren muss.
Da wo ich die Callbacks die ich aus der Designview des App Designers erstellt habe befinden kann ich keine eigenen Callbacks programmieren. Ich hab einfach mal einen Screenshot gemacht und hochgeladen. Vielleicht ist das was ich gemacht habe etwas verständlicher.

In den properties (Zeile 103) befinden sich meine Variablen die ich später verwende. In Zeile 139 befindet sich eine Funktion mit der ich die Ticks bei einem Graphen ändere. Ab Zeile 158 befindet sich mein eigentliches Programm. Da habe ich Funktionen zum Verbinden und entfernen des Messgerätes und noch mehr. Diese einzelnen Funktionen rufe ich dann in den Callbacks ab Zeile 723 auf.

Wo muss ich da meine selbst programmierten Callbacks hinschreiben?

Eine andere Frage ist auch. Macht das so Sinn wie ich das programmiert habe oder gibt es da einfachere und Übersichtliche Methoden? Das ist mein erstes Programm mit dem App Designer. Sonst habe ich mal was mit dem Command Windows gemacht und kurze m Files geschrieben.

Viele Grüße
Fabian

Bildschirmfoto 2021-04-02 um 18.55.53.jpg
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2021-04-02 um 18.55.53.jpg
 Dateigröße:  194.69 KB
 Heruntergeladen:  168 mal
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: 02.04.2021, 19:03     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wo muss ich da meine selbst programmierten Callbacks hinschreiben?

Die Funktion würde ich der Einfachheit halber als separate Funktion ablegen.

Zitat:
Ich hab einfach mal einen Screenshot gemacht und hochgeladen.

In dem Screenshot sieht man sehr wenig. Ich sehe aber Funktionen, die anscheinend über 100 Zeilen lang sind. Diese würde ich aus der App auslagern. Mal ganz davon abgesehen, dass ich mich frage, ob die Funktionen wirklich so lange sein müssen.

Zitat:
Macht das so Sinn wie ich das programmiert habe

Kann ich anhand dieses Bildes nun wirklich nicht beurteilen.

Zitat:
gibt es da einfachere und Übersichtliche Methoden?

Sei mir nicht böse, aber das solltest du dir doch überlegen, bevor du Hunderte Zeilen Code schreibst?!

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 03.04.2021, 11:35     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Sei mir nicht böse, aber das solltest du dir doch überlegen, bevor du Hunderte Zeilen Code schreibst?!


Naja das Program ist nach und nach gewachsen. War mir am Anfang nicht klar, dass es doch so viel wird bzw. noch ein paar Zeilen dazu kommen. Wie gesagt, mein erstes großes Matlab Programm. Ich werde mal gucken, dass ich ein paar Funktionen auslagere.


Ich verstehe nicht wie ich einen Callback für die Eingabefelder und DropDown Menüs schreiben kann. Die vom App Designer erstellen Callbacks sehen so aus:
Code:
       function StartFrqFDS_FieldValueChanged(app, event)
            settings(app)
        end

        function StartFrqFDS_DropDownValueChanged(app, event)
            settings(app)
        end


Wenn ich es so schreibe funktioniert es nicht:
Code:
       function Ausspg_FieldValueChanged(app)
            get(app.Ausspg_Field(v),'Value');
        end


So sieht Funktion properties aus:

Code:
function properties(app) %Eigenschaften für die Messung vornehmen
   for v = 1:value
    app.Ausspg_Field(v) = uieditfield('numeric','Parent',app.Messung_Panel(v),'Position',[206 65 65 25],'Value',1,'FontSize',15); %,'Limits',[1 200]
    app.Ausspg_DropDown(v) = uidropdown('Parent',app.Messung_Panel(v),'Position',[271 65 65 25],'FontSize',15,'Items',{'mV','V'},'Value','V');
   end

   SpannungFaktor(v) = app.FaktorList(strcmp(get(app.Ausspg_DropDown(v),'Value'), app.UnitList));
   app.Ausgangsspg(v) = get(app.Ausspg_Field(v),'Value') * SpannungFaktor(v);
           
   %Warnung, wenn Ausgangsspannung größer als 200V ist
   if app.Ausgangsspg(v) > 200
    msgbox('Ausgangsspannung darf nicht über 200V sein', '','warn')
    app.Ausspg_Field(v).Value = 200;
    app.Ausspg_DropDown(v) = 'V';
    app.Ausgangsspg(v) = 200;
   end
end
 


In den Properties erstelle ich das Eingabefeld und das DropDown Menü für die ich Callbacks haben möchte. Den Wert aus dem Eingabefeld und dem DropDown Menü multipliziere ich mit einander und wenn das Ergebnis größer als 200V ist soll eine Meldung erscheinen und 200V in das Eingabefeld eingetragen werden.
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: 03.04.2021, 11:46     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wenn ich es so schreibe funktioniert es nicht:

Was funktioniert nicht?
Bei allem Verständnis dafür, dass es das erste große Programm ist etc.: schreibe bitte immer die komplette Fehlermeldung oder das sonstige unerwartete Verhalten dazu. Sonst ist es schwierig bis nicht möglich, dir zu helfen.

Legst du irgendwo fest, dass Ausspg_FieldValueChanged der Callback für app.Ausspg_Field(v) sein soll? Wenn nicht, woher soll MATLAB das dann wissen? Bedingt durch getrennte Workspaces wird MATLAB nicht wissen, was in der Callback-Funktion v sein soll.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 03.04.2021, 12:19     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Was funktioniert nicht?

Mein "Callback" hat nicht funktioniert. Ich habe mir einen Breakpoint gesetzt um zu gucken was genau das Problem ist. Nur ist mein Programm nicht zum Breakpoint gesprungen.

Harald hat Folgendes geschrieben:

Legst du irgendwo fest, dass Ausspg_FieldValueChanged der Callback für app.Ausspg_Field(v) sein soll? Wenn nicht, woher soll MATLAB das dann wissen?

Ich bin davon ausgegangen, dass ich das hiermit festlege:
Zitat:
function Ausspg_FieldValueChanged(app)
get(app.Ausspg_Field(v),'Value');
end


Scheint es aber nicht zu sein. Also muss es gefähr so aussehen?
Code:
app.StopFrqFDS_DropDown.ValueChangedFcn = createCallbackFcn(app, @StopFrqPDC_FieldValueChanged, true);

Das muss ich ja dann umschreiben, dass es zu meinen variablen Eingabefeldern passt und nach der Erzeugung der Felder einfügen?
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: 03.04.2021, 13:02     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich bin davon ausgegangen, dass ich das hiermit festlege:

Das war aber sehr optimistisch.

Zitat:
Also muss es gefähr so aussehen?

Das ist wohl aus dem automatisch erstellten Code der App? Wäre nicht meine erste Wahl, aber kannst du versuchen. Meine erste Wahl wäre, mich an die Doku zu halten, siehe die Antwort von gestern, 15:04.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.