|
|
verschachtelte Funktionen |
|
ando_m |
Forum-Anfänger
|
|
Beiträge: 20
|
|
|
|
Anmeldedatum: 19.09.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.07.2020, 09:16
Titel: verschachtelte Funktionen
|
|
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
|
|
|
|
|
T16 |
Forum-Century
|
|
Beiträge: 145
|
|
|
|
Anmeldedatum: 31.01.18
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.07.2020, 09:25
Titel:
|
|
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
|
|
|
ando_m |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 20
|
|
|
|
Anmeldedatum: 19.09.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.07.2020, 09:45
Titel:
|
|
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.
|
|
|
T16 |
Forum-Century
|
|
Beiträge: 145
|
|
|
|
Anmeldedatum: 31.01.18
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.07.2020, 10:07
Titel:
|
|
|
|
|
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
nicht das tut was du denkst. Willst du schauen ob xy und i kleiner als 3 sind, dann sieht das so aus:
Setz mal einen breakpoint in deine unterste Funktion und sieh nach, ob matlab da stoppt.
|
|
|
ando_m |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 20
|
|
|
|
Anmeldedatum: 19.09.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.07.2020, 12:08
Titel:
|
|
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.
|
|
|
T16 |
Forum-Century
|
|
Beiträge: 145
|
|
|
|
Anmeldedatum: 31.01.18
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.07.2020, 12:33
Titel:
|
|
Zitat: |
Aber wie übergibt man dann Variablen? Jedesmal ne Funktion |
Korrekt 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.
|
|
|
ando_m |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 20
|
|
|
|
Anmeldedatum: 19.09.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.07.2020, 13:47
Titel:
|
|
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.
|
|
|
T16 |
Forum-Century
|
|
Beiträge: 145
|
|
|
|
Anmeldedatum: 31.01.18
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.07.2020, 13:52
Titel:
|
|
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
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.
|
|
|
ando_m |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 20
|
|
|
|
Anmeldedatum: 19.09.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.07.2020, 17:44
Titel:
|
|
Danke .
P.S. Das Skipt ist in Octave geschrieben.
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: |
262 mal |
Beschreibung: |
|
Download |
Dateiname: |
Zinsen.m |
Dateigröße: |
315 Bytes |
Heruntergeladen: |
248 mal |
Beschreibung: |
|
Download |
Dateiname: |
Aktienvermoegen.m |
Dateigröße: |
862 Bytes |
Heruntergeladen: |
264 mal |
Beschreibung: |
|
Download |
Dateiname: |
tilgung.m |
Dateigröße: |
482 Bytes |
Heruntergeladen: |
261 mal |
Beschreibung: |
|
Download |
Dateiname: |
Kredit_1.m |
Dateigröße: |
1.65 KB |
Heruntergeladen: |
246 mal |
|
|
|
T16 |
Forum-Century
|
|
Beiträge: 145
|
|
|
|
Anmeldedatum: 31.01.18
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 22.07.2020, 07:34
Titel:
|
|
Ich glaube die Wohnkostenfunktion fehlt noch.
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.
|
|
|
ando_m |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 20
|
|
|
|
Anmeldedatum: 19.09.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 22.07.2020, 08:49
Titel:
|
|
Danke,für das Review!
Ich überarbeite die Skripte nochmal grundsätzlich und melde mich dann nochmal.
|
|
|
ando_m |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 20
|
|
|
|
Anmeldedatum: 19.09.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 22.07.2020, 21:25
Titel:
|
|
ich verstehe nicht warum das nicht läuft...
Beschreibung: |
|
Download |
Dateiname: |
tilgung.m |
Dateigröße: |
780 Bytes |
Heruntergeladen: |
259 mal |
Beschreibung: |
Die Berechnung "Zinsen" geht jetzt gar nicht mehr. |
|
Download |
Dateiname: |
Kredit_0.m |
Dateigröße: |
1.75 KB |
Heruntergeladen: |
241 mal |
|
|
|
ando_m |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 20
|
|
|
|
Anmeldedatum: 19.09.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 23.07.2020, 09:29
Titel:
|
|
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.
Beschreibung: |
|
Download |
Dateiname: |
Funktionen.m |
Dateigröße: |
83 Bytes |
Heruntergeladen: |
254 mal |
Beschreibung: |
|
Download |
Dateiname: |
test.m |
Dateigröße: |
134 Bytes |
Heruntergeladen: |
256 mal |
|
|
|
T16 |
Forum-Century
|
|
Beiträge: 145
|
|
|
|
Anmeldedatum: 31.01.18
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 23.07.2020, 09:54
Titel:
|
|
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
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:
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.
|
|
|
ando_m |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 20
|
|
|
|
Anmeldedatum: 19.09.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 23.07.2020, 10:19
Titel:
|
|
test
parse error near line 6 of file C:\Octave\test.m
syntax error
>>> =Funktionen(x,p)
Beschreibung: |
|
Download |
Dateiname: |
test.m |
Dateigröße: |
139 Bytes |
Heruntergeladen: |
245 mal |
Beschreibung: |
|
Download |
Dateiname: |
Funktionen.m |
Dateigröße: |
71 Bytes |
Heruntergeladen: |
258 mal |
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
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 - 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.
|
|