eine Funktion mehrmals aufrufen: wie die Variablen speichern?
-
Hi,
ich habe eine C++ Anfänger-Frage:
Ich habe eine Funktion (z.B. den Variablen int x1, float x2 etc) und möchte diese mehrmals "gleichzeitig" aufrufen.
Das bedeutet, bei dem Aufruf#1 speichert sich die Funktion das Variablenset#1 und bei Aufruf#2 das Variablenset#2. Ich möchte in einer Main-Loop die gleiche Funktion aufrufen können mit unterschiedlichen gespeicherten Variablen, so eine Art "Funktions-Multitasking"
Geht so etwas auf leichte Art und Weise? Kann mir jemand ein Beispiel zeigen?
Danke,
Chris
-
Bin mir nciht ganz sicher, ob ich das richtig verstanden habe. Ich versuchs mal:
Multitasking in diesem Sinne geht eigentlich nicht, da Du in einem sequentiellen Programm Funktionen hintereinander aufrufst und diese dann ausgeführt werden (meineserachtens auch nacheinander und nicht parallel, aber korrigiert mich bitte). Somit hast Du eine rein sequentielle Ararbeitung Deiner Befehle und musst Dich um Parallelisierung nicht kümmern.
Eine Form von "Funktionen gleichzeitig aufrufen" wäre die Iteration. Hier ruft eine Funktion sich selbst auf. Beispeilsweise willst Du eine Zahl solange halbieren, bis sie kleiner als eins ist. Das ginge natürlich auch mir einer Schleife, aber des Beispiels wegen:float hbke(float zahl) //hbke == halbieren bis kleiner 1 { zahl/=2; if(zahl < 1) return(zahl); else zahl = hbke(zahl); } int main() { float resultat = hbke(12); cout>>resultat; //sollte 0.75 sein }
Eine andere Form von "Multitasking" wäre, wenn Du eine Klasse hast z.B. Zahlinkrementieren. Ehrlich gesagt ist das ein blödes Beispiel, mir fällt aber gerade kein anderes ein.
Wenn Du der Klasse zi(abgekürzt) eine Zahl immer um eins erhöhst und Dir dann 15381 Instanzen dieser Klasse bildest, laufen diese parallel voneinander. Allerdings nicht wirklich, da Du
a) immer erst die Funktion dieser Klasse aufrufen musst, die inkrementier
b) selbst dann hardewareabhängig nur alles sequentiell ausgeführt wirda) könntest Du mit einer Schleife in der Funktion der Klasse umgehen fällt mir gerade ein, aber wie gesagt, die Hardeware lässt eh nur Einzel-Abarbeitung zu (ich gehe jetzt einfach mal davon aus, dass Du kein Dualboard o.ä. besitzst).
So, ich schätze mal, dem gibt es noch vieles interessantes hinzuzufügen.......
-
MG80S schrieb:
Eine Form von "Funktionen gleichzeitig aufrufen" wäre die Iteration. Hier ruft eine Funktion sich selbst auf.
nich bös gemeint aber du meint rekursion. iteration sind schleifen
mfg
-
MG80S schrieb:
float hbke(float zahl) //hbke == halbieren bis kleiner 1 { zahl/=2; if(zahl < 1) return(zahl); else zahl = hbke(zahl); } int main() { float resultat = hbke(12); cout<<resultat; //sollte 0.75 sein <--- Wenn überhaupt dann so }
-
@sn0b & YASC: Stimmt. Danke, war schon spät....
-
Ok, stellt Euvch vor, dass Ihr eine Grafikfunktion habt, die verschiedene Presets.
Z.B. rufe ich vom Zeitpunkt 730 bis 2020 die Routine mit Presets#1 auf und die gleiche Funktion mit Presets#2 vom Zeitpunkt 1200 bis 2600.
Dann rufe ich beide Routinen hintereinander auf (aus der Mai()-Funktion), wobei jede von den beiden ihre internen abgespeicherten Variablen (z.B Position der Partikel in Partikelsystem) seperat abgespeichert hat.
Kann man evtl eine Funktion als Klasse definieren und "Kopien" davon anlegen, so dass jede der "Kopien" eigenen Speicher fuer die abzuspeichernden aktuellen Variablen hat?
-
Genau das ist ja einer der Vorteile an Klassen. Du hast eine Klasse "Preset". Diese Klasse hat verschiedene eigene Variablen, sagen wir mal x,y und z.
Ausserdem hat die Klasse einige Methoden (-> Funktion), sagen wir "SetXYZ(x,y,z)" und "int* GetXYZ()".
Wenn Du nun zwei Instanzen bildest, Preset1 und Preset2, dann sin diese von Preset abgeleitet, das heisst jedes Preset hat sein eigenes x,y,z, was im Speicher voneinandergetrennt ist und Du kannst von jeder Instanz die Methoden GetXYZ() und SetXYZ() aufrufen.
Alles ist voneinander getrennt. Nun musst Du Dir nur ein cleveres System überlegen, wie Du Deine gewünschten Methoden aufrufst. Nehme mal an, die Zeitpunkte waren Frames. Dann hast Du eine While-Schleife, in der Du prüfst in welchem Frame Du gerade lebst.
Bist Du nun im Frame 730 bis 1199, rufst Du nur die Methode von Preset1 auf, dann bis 2020 hintereinander die von Preset1 und P2, und dann bis 2600 die von P2.Alles klar?
-
Ahh okay, dann weiss ich die Richtung. Danke allerseits.
-
calgonite schrieb:
Ich habe eine Funktion (z.B. den Variablen int x1, float x2 etc) und möchte diese mehrmals "gleichzeitig" aufrufen.
Das bedeutet, bei dem Aufruf#1 speichert sich die Funktion das Variablenset#1 und bei Aufruf#2 das Variablenset#2. Ich möchte in einer Main-Loop die gleiche Funktion aufrufen können mit unterschiedlichen gespeicherten Variablen, so eine Art "Funktions-Multitasking"du könntest sowas machen
// ein variablensatz sieht so aus struct context { int x1; float x2; }; // funktion, die die variablen von aussen kriegt void f (struct context *c) { // verändere die variablen c->x1 *= 2; c->x2 += 100.0; } int main() { // variablensatz 1 struct context c1 = {10, 11.11f}; // variablensatz 2 struct context c2 = {20, 12.34f}; // beide bearbeiten f (&c1); f (&c2); }
das ist aber c, kein c++
in c++ ist es sicher besser eine 'class' zu nehmen, weil die auch gleich die funktion beinhalten kann
-
net schrieb:
in c++ ist es sicher besser eine 'class' zu nehmen, weil die auch gleich die funktion beinhalten kann
warum soll ein struct keine Methoden haben dürfen?
struct ist beinahe das selbe wie eine Klasse.
Die einzige Ausnahme ist, dass bei struct standardmäßig alles public ist und bei einer Klasse eben private ist.
-
ChrissiB schrieb:
net schrieb:
in c++ ist es sicher besser eine 'class' zu nehmen, weil die auch gleich die funktion beinhalten kann
warum soll ein struct keine Methoden haben dürfen?
struct ist beinahe das selbe wie eine Klasse.
Die einzige Ausnahme ist, dass bei struct standardmäßig alles public ist und bei einer Klasse eben private ist.ja, sorry, hab' mich etwas undeutlich ausgedrückt. ich meinte 'in c' hat eine struct keine methoden