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

verschachtelte Funktionen

 

ando_m
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 19.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2020, 10:16     Titel: verschachtelte Funktionen
  Antworten mit Zitat      
Hallo liebes Forum,

ich starte aus einem "Main"-Ablauf eine Funktion nach
global [y]= function_y(x)

function_y(x) ist ein m-file. Im File function_y(x) will ich in einer while-Schleife eine andere Funktion funtion_z über

global [z]= function_z(x)

aufrufen, ebenfalls ein m-file. Da passiert nur leider nix. function_y läuft, aber function_z wird nicht gestartet. Ich habe in function_z einen Test-output k=0 geschrieben. Aber der kommt nicht, die Funiktion wird also nicht gestartet. Was stimmt da nicht???

Viele Grüße und danke für die Hilfe,
Ando
Private Nachricht senden Benutzer-Profile anzeigen


T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2020, 10:25     Titel:
  Antworten mit Zitat      
Das sollte so schon funktionieren. Kommt eine Fehlermeldung? Setze mal in beiden Unterfunktionen Breakpoints und schaue, ob sie aufgerufen werden. Sind deine Funktionen am richtige Ort gespeichert? Es kann passieren, dass man eine Funktion versehentlich an einen anderen Ort kopiert, dann nur die Kopie bearbeitet aber weiterhin die Funktion im Arbeitsordner aufruft.

PS: Globale Variablen sind pfui Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
ando_m
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 19.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2020, 10:45     Titel:
  Antworten mit Zitat      
Es liegt alles im gleichen Ordner. Warum sind globale Variablen pfui?

Hier ein paar Auszüge:
m-file main:
...
global Wk0=Wohnkosten(Mm);
...


Fkt-file
function [Wk0]=Wohnkosten(Mm)
i=0
while xy && i<3
global K_M0=intervallschachtelung(Mm)
i=i+1
...
endwhile
endfunction



Fkt-file
function [Mm K_M0]=intervallschachtelung(Mm)
k=0
...
endfunction
...

es kommt ein print i=1 und i=2, aber kein print k=0.
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2020, 11:07     Titel:
  Antworten mit Zitat      
Globale Variablen werden als schlechte Programmierpraxis angesehen, sie sind fehleranfällig (schnell hat man eine globale Variable definiert die es in einer anderen Unterfunktion schon gibt) und produzieren Fehler die sehr schwer zu finden und zu debuggen sind. Gerade in größeren Projekten bricht einem das schnell das Genick. Sie sollten daher nur in Ausnahmefällen genutzt werden und dann mit Namen, die nicht so schnell gedoppelt werden können. Diese Ausnahmefälle gibt es aber durchaus, ich nutze globale Variablen auch gelegentlich wenn ich dadurch vermeiden kann, Variablen durch 30 Unterfunktionen durchzuschleifen.

Aber zurück zur eigentlichen Frage: Funktioniert dein Code so überhaupt? Meines Wissens nach ist endwhile und endfunction kein valide matlabsyntax.

Ich vermute zudem, dass die Zeile
Code:


nicht das tut was du denkst. Willst du schauen ob xy und i kleiner als 3 sind, dann sieht das so aus:

Code:


Setz mal einen breakpoint in deine unterste Funktion und sieh nach, ob matlab da stoppt.
Private Nachricht senden Benutzer-Profile anzeigen
 
ando_m
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 19.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2020, 13:08     Titel:
  Antworten mit Zitat      
Danke für die Rückmeldung und den Hinweise zu den globalen Variablen. Aber wie übergibt man dann Variablen? Jedesmal ne Funktion?

Ich habe die breakpoints gesetzt. Zu meiner eigenen Überraschung hält das Programm auch dort an. Die erste while-Bedingung ist die Differenz aus zwei anderen Werten. i habe ich nur eingeführt, um eine endlosschliefe zu verhindern.
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2020, 13:33     Titel:
  Antworten mit Zitat      
Zitat:
Aber wie übergibt man dann Variablen? Jedesmal ne Funktion


Korrekt Wink Darin liegt ja gerade der Charme von Funktionen: durch bloßes Austauschen der Funktionsargumente kannst du die gleiche Funktion auf verschiedene Daten loslassen und du siehst anhand der Argumente auch sofort, welche Daten gelesen und manipuliert werden. Das erleichtert das Debugging enorm. (Vor allem bei großen Projekten, als Anfänger mit übersichtlichen Projekten ist der Vorteil evtl. nicht sofort ersichtlich, trotzdem lohnt es sich "gute" Programmierpraktiken anzugewöhnen.)


Wenn der breakpoint triggert, dann wird die Funktion ja ordnungsgemäß aufgerufen, das Fehlverhalten liegt also vmtl. an der Funktion selbst. Der nächste Schritt wäre, einen Breakpoint in die erste Zeile der Funktion zu setzen. Mit F11 kannst du dann Zeile für Zeile durch den Code gehen und schauen, wo es in die Hose geht.
Private Nachricht senden Benutzer-Profile anzeigen
 
ando_m
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 19.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2020, 14:47     Titel:
  Antworten mit Zitat      
hm, es bleibt interessant. wenn ich aus der main starte springt das Programm zum roten Punkt und stoppt. Wenn ich aus dem ersten function file starte passiert nix und das Programm springt nicht in die zweite function.
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2020, 14:52     Titel:
  Antworten mit Zitat      
Das Programm solltest du auch immer aus einer main starten, nie eine Funktion direkt ausführen! Da weiß matlab nicht, was als Argument genutzt werden soll. Das sollte ohnehin zu einem Fehler a la

Code:
Not enough input arguments.


führen, es sei denn das Funktionsargument wird nicht genutzt bzw. überschrieben bevor es genutzt wird.

Edit: Bevor wir weiter im Dunkeln stochern, lade doch mal deine Funktionen und deine Main komplett hoch, dann können wir den Fehler genauer umreißen.
Private Nachricht senden Benutzer-Profile anzeigen
 
ando_m
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 19.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2020, 18:44     Titel:
  Antworten mit Zitat      
Danke Smile.
P.S. Das Skipt ist in Octave geschrieben.

Intervallschachtellung.m
 Beschreibung:
das wird eine Suchfkt für ein Optimum. Der Algorithmus ist noch in Arbeit, erst muss mal das Skipt laufen...

Download
 Dateiname:  Intervallschachtellung.m
 Dateigröße:  349 Bytes
 Heruntergeladen:  195 mal
Zinsen.m
 Beschreibung:
function file

Download
 Dateiname:  Zinsen.m
 Dateigröße:  315 Bytes
 Heruntergeladen:  190 mal
Aktienvermoegen.m
 Beschreibung:
function file

Download
 Dateiname:  Aktienvermoegen.m
 Dateigröße:  862 Bytes
 Heruntergeladen:  197 mal
tilgung.m
 Beschreibung:
function file

Download
 Dateiname:  tilgung.m
 Dateigröße:  482 Bytes
 Heruntergeladen:  198 mal
Kredit_1.m
 Beschreibung:
das ist das main file

Download
 Dateiname:  Kredit_1.m
 Dateigröße:  1.65 KB
 Heruntergeladen:  184 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2020, 08:34     Titel:
  Antworten mit Zitat      
Ich glaube die Wohnkostenfunktion fehlt noch.

Code:
function [Km K_M]=Aktienvermoegen(K_M0,EK);
global K_M K_M0 n EK


So etwas unbedingt vermeiden! Du übergibt die globale Variable K_M0 aus der Main an die Funktion und deklarierst sie dann hier ebenfalls wieder als global. Das ist nicht notwendig, die Variable ist durch das Übergeben an die Funktion ja bereits lokal verfügbar. Gleiches gilt auch für die Rückgabevariable K_M, warum diese als global definieren, wenn du sie ohnehin aus der Funktion herausgibst? Mit Km machst du es richtig.
Private Nachricht senden Benutzer-Profile anzeigen
 
ando_m
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 19.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2020, 09:49     Titel:
  Antworten mit Zitat      
Danke,für das Review!
Ich überarbeite die Skripte nochmal grundsätzlich und melde mich dann nochmal.
Private Nachricht senden Benutzer-Profile anzeigen
 
ando_m
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 19.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2020, 22:25     Titel:
  Antworten mit Zitat      
ich verstehe nicht warum das nicht läuft...

tilgung.m
 Beschreibung:

Download
 Dateiname:  tilgung.m
 Dateigröße:  780 Bytes
 Heruntergeladen:  188 mal
Kredit_0.m
 Beschreibung:
Die Berechnung "Zinsen" geht jetzt gar nicht mehr.

Download
 Dateiname:  Kredit_0.m
 Dateigröße:  1.75 KB
 Heruntergeladen:  181 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
ando_m
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 19.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2020, 10:29     Titel:
  Antworten mit Zitat      
ich habe es jetzt an einer einfachen Testfunktion versucht. Irgendwas stimmt hier prinzipiell nicht... Geplotted wird nur y aber nicht y1. Der zweite Rückgabewert wird nicht als globale Variable angelegt. Lokal ist die y1 schon verfügbar, denn ich kann sie über "figure(3), plot(x,y1)" direkt in dem Funktion file plotten.
Das gleoche passiert bei "Zinsen". Ich ich kann mir "Z" ausgeben lassen. Aber ein direkter Abruf aus der "main" über das "function file" ist nicht möglich.

Funktionen.m
 Beschreibung:
function

Download
 Dateiname:  Funktionen.m
 Dateigröße:  83 Bytes
 Heruntergeladen:  193 mal
test.m
 Beschreibung:
main

Download
 Dateiname:  test.m
 Dateigröße:  134 Bytes
 Heruntergeladen:  194 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2020, 10:54     Titel:
  Antworten mit Zitat      
Deine Funktion hat zwei Rückgabewerte, du rufst aber mit beiden Funktionsaufrufen jeweils nur den ersten (y) ab, damit werden in der main-Funktion sowohl y als auch y1 mit den gleichen Werten (nämlich y aus der Funktion) belegt. Richtig wäre

Code:
[y, y1]=Funktionen(x,p)


zumindest in matlab, octave syntax sieht evtl. etwas anders aus aber da kenne ich mich nicht aus. Denk daran, die Namen der Variablen die du an eine Funktion übergibst sind Schall und Rauch, es zählt die Reihenfolge. Ein Beispiel:

Code:
function [x1 x2 x3]=test()
x1=1;
x2=2;
x3=3;
end

[y1, y3, y2]=test()
 


Führt zu
y1=x1=1,
y3=x2=2,
y2=x3=3,

Holst du nur einen Rückgabewert aus der Funktion, so wird der erste übergeben und alle folgenden entsorgt.
Private Nachricht senden Benutzer-Profile anzeigen
 
ando_m
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 19.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2020, 11:19     Titel:
  Antworten mit Zitat      
test

parse error near line 6 of file C:\Octave\test.m

syntax error

>>> =Funktionen(x,p)

test.m
 Beschreibung:

Download
 Dateiname:  test.m
 Dateigröße:  139 Bytes
 Heruntergeladen:  178 mal
Funktionen.m
 Beschreibung:

Download
 Dateiname:  Funktionen.m
 Dateigröße:  71 Bytes
 Heruntergeladen:  196 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.