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

Zugriff auf eine Variable in Nested Function

 

rocketman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2011, 14:57     Titel: Zugriff auf eine Variable in Nested Function
  Antworten mit Zitat      
Hallo, ich stell mich irgendwie zu dumm an. Vielleicht kann mir jemand auf die schnelle weiterhelfen..

Mein Problem: Ich will, dass eine Variable innerhalb einer Nested Function hochzählt und ich außerhalb dieser den Wert abgreife.

Code:
function test3()


figure;
set(gcf,'KeyPressFcn',@press_button);    
   
var=0;


   
    function press_button(src,evnt)
       
        % wenn Taste "a" gedrueckt wird
        if evnt.Character == 'a'
           
            var=var+1;            
       
            h=@()var;            
            h()      % gibt mir hier den Wert aus, aber nicht ausserhalb funct.

        end      
    end


var  % --> beibt natuerlich auf 0, da kein Zugriff
h()  % --> geht nicht! Zugriffsverletzung???

% Mit var irgendwelche Berechnungen durchfuehren!

end


Möglich wäre das Ganze indem ich var in eine globale Variable umdeklariere. Das will ich aber nicht!
Mit handles soll es auch gehen, aber wie ihr sieht, stell ich mich dazu zu blöde an!

Also, was muss ich tun, damit sich meine Variable inkrementiert und ich sie außerhalb weiterverwenden kann.


rocketman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2011, 09:51     Titel:
  Antworten mit Zitat      
na gut, wenn keiner antworten will, muss ich vielleicht meine frage etwas umstellen...

Mein Problem würde sich auch durch ein Schreiben in ein Structure lösen lassen. Aber auch hier klappt's mit den Schreibzugriff nicht. Diesmal aber ohne eingebettete Funktion..

Code:
function out=test4()

    var=0;
    out=struct('a',[],'b',[],'c',[]);

    set(gcf,'KeyPressFcn',{@press_button,out,var});

end


Code:
function out=press_button(src,evnt,out,var)

if evnt.Character == 'a'
           
            var=var+1;                        
            out.a{1}=var
   
    end

end


Innerhalb press_button bekomme ich ein Structure mit den Wert 1 für a. Außerhalb bekomme ich ein leeres Structure zurück.

Wo liegt mein Denkfehler???
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.10.2011, 10:58     Titel:
  Antworten mit Zitat      
Hallo rocketman,

Was meinst Du eigentlich mit "ausserhalb"? Callbacks werden im Base-Workspace ausgeführt. Die Ausgabe von "out" würde also dorthin erfolgen, allerdings wird der Callback ohne Outputs aufgerufen.

Ich würde raten, den STRUCT per GUIDATA oder SETAPPDATA in das GUI zu schreiben. Von dort kann man dann den Wert bei Bedarf abfragen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
rocketman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2011, 12:49     Titel:
  Antworten mit Zitat      
Vielen Dank Jan,

die Idee mit GUIDATA hat mir sehr weitergeholfen! Ich wusste bis jetzt noch nicht, dass die Daten die in der GUI erzeugt/bearbeitet werden, anders "gehandlet" werden. Jetzt komm ich auch an meine Callback-Daten ran.

Code:
function test4()

    var=0;
    myhandle=figure;

    guidata(myhandle,var);

    set(gcf,'KeyPressFcn',@press_button);

    pause(5);
    out=guidata(gcf)

end


Code:
function press_button(src,evnt)

     data=guidata(gcf);

     if evnt.Character == 'a'  
         
          data=data+1;
          guidata(gcf,data);

    end
end


Allerdings wird der Code schneller abgearbeitet, als der Benutzer seine Eingabe machen kann. Ich hab das Ganze mit pause() gelöst, ist aber nicht gerade elegant. Gibt's da irgend einen Mechanismus, mit dem man den Aufruf mit der Eingabe synchronisieren kann - also quasi irgendwelche gui-updates?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.10.2011, 13:23     Titel:
  Antworten mit Zitat      
Hallo,

schau dir mal uiwait und uiresume an.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.10.2011, 14:23     Titel:
  Antworten mit Zitat      
Hallo rocketman,

Zitat:
Allerdings wird der Code schneller abgearbeitet, als der Benutzer seine Eingabe machen kann. [...]. Gibt's da irgend einen Mechanismus, [...]

Ja, man muss einfach nur den Benutzer schneller machen. Auf meinem 50MHz 468er Laptop unter Matlab 4 reichte da schon eine Tasse Kaffee um schneller zu sein als die GUI. Wenn Du so einen modernen Rechner mit vielen Gigas verwendest, wird das schwieriger. Drogen und Dopingmittel dürfen in diesem Forum aus juristischen Gründen nicht verherrlicht werden. Man könntre relativistische effekte ausnutzen und den Benutzer mit 99.95% der Lichtgeschwindigkeit am Computer vorbeifliegen lassen. Das führt aber zu eine Längenkontraktion, so dass man ausser der Space-Taste kaum etwas treffen wird.

UIWAIT ist halt ineffizient: Da haben wir nun endlich wassergekühlte 8-Core Machine und was machen die: Auf Benutzereingaben warten! Aber meine einzige umsetzbare Idee ist per RAND(1,5e8) das RAM so zu füllen, dass der Rechner auf die Festplatte swapped und sich dadurch der User-Geschwindigkeit anpasst. Das ist aber noch ineffizienter. Der Punkt geht also and Harald und sein UIWAIT.

Gruß, Jan

Zuletzt bearbeitet von Jan S am 28.10.2011, 11:00, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

herrlicher Beitrag!

Kennst du den schon? Wink
Zitat:
Der Barkeeper sagt: "Tut mir leid, wir bedienen keine Neutrinos, die schneller sind als das Licht." Ein Neutrino kommt in eine Bar.


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2011, 08:49     Titel:
  Antworten mit Zitat      
Bitte keine Neutrino-Witze mehr, die habe ich alle nächste Woche schon gehört!


Also vielen Dank euch Beiden, ihr habt mir sehr weitergeholfen.
..und die Idee mit den schnelleren Benutzer echt amüsant!
 
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 - 2025 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.