Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

11

15.09.2006, 23:52

Okay, ich muss zugeben, dass ich mir über die Funktion nicht ganz im klaren war, deshalb fand ich des genial (hab's gerade nochmal nachgelsen -> ist echt nix besonderes).

Trotzdem danke an alle (nix da für die Lösung und Riddick für den Grund mir des nochmal genau durchzulesen).

Anonymous

unregistriert

12

15.09.2006, 23:57

Auch eine sehr schöne Benutzung von static:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// ///////////////////////////////////////////////////////////////////////////

// GLOBAL

// 

// Initialisierung des globalen Zufallsgenerators

// ACHTUNG: Diese Funktion wird bei der 1. Ausführung von 'random' aufgerufen

//          und der globale Zufallsgenerator wird initialisiert.

// ///////////////////////////////////////////////////////////////////////////

bool initialise_random (void)
{ 
        // Globalen Zufallsgenerator anhand des Zeitstempels initialisieren.

    ::srand (tatic_cast<unsigned long>(std::time (NULL)));

        // Alles fertig!

    return (true);
}

// ///////////////////////////////////////////////////////////////////////////

// GLOBAL

// 

// Verbesserte Funktion für Zufallswerte mit einem Mindestwertebereich.

// ///////////////////////////////////////////////////////////////////////////

unsigned long random (unsigned long min, unsigned long max)
{
        // Globalen Zufallsgenerator initialisieren über die Hilfsfunktion

        // ACHTUNG: static sagt aus, das die dazugehörige Variable 

        //          absolut _einmalig_ im Programm initialisiert wird.

        //          Ergo: Bei mehrfachen Aufruf der random-Funktion wird

        //          die initialise_random-Funktion nicht mehr aufgerufen.

        //          sondern nur beim 1. Aufruf der random-Funktion.

    static bool can_random = initialise_random ();

        // Minimalwert darf nicht größer dem Maximalwert sein

    if (min > max) return (0);

        // Hilfsvariable für den Rückgabewert:

        // Zufallswert berechen von 0 bis zum Delta von Maximal und Minimal + 1

    const unsigned long result = ::rand () % (max - min + 1);

        // Minimalwert auf den Zufallswert addieren, da die Zufallszahl nun

        // zwischen 0 und dem Delta von Maximal und Minimal + 1 liegt.

    return (result + min);
}

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

13

16.09.2006, 00:18

Zitat von »"nix da"«

C-/C++-Quelltext

1
2
3
4
bool initialise_random (void)
{ 
        // Globalen Zufallsgenerator anhand des Zeitstempels initialisieren.

    ::srand (tatic_cast<unsigned long>(std::time (NULL)));


heisst das nicht static_cast?

Anonymous

unregistriert

14

16.09.2006, 11:03

Zitat

heisst das nicht static_cast?


Natürlich

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

15

18.09.2006, 07:35

Ich würde weder mit "if" arbeiten, noch mit "static", sondern die Funktion ausserhalb der Schleife ausführen...

Wenn sie nur einmal aufgerufen werdem soll/darf/kann, hat sie in der Schleife sowieso nichts verloren.

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Phili

unregistriert

16

18.09.2006, 12:44

@rklaffehn
und wenn sie beim 5. Schleifendurchlauf ausgeführt werden soll?
Ic hgeb zu, dass ist ncith die Problemstellung hier, aber trotzdem ist es auch keine Lösug, die Funktin einfach vor der Schleife aufzurufen.

Anonymous

unregistriert

17

18.09.2006, 15:06

Dann treten außerdem ganz andere Probleme auf. Sagen wir mal eine
Variable soll nur einmal initialisiert werden und es soll nicht in die Schleife,
aber wird in einer Funktion verwendet... Parameter hast du auch schon
genug... Was bleibt dir übrig? Global... Und global ist die mit die größte
Scheiße, die ein Programmierer verzapfen kann...

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

18

18.09.2006, 15:30

@rklaffehn: Geht leider nicht. Es ist eine Funktion meiner Logfile, die mir nur beim ersten Aufrufen einer Funktion in der while-SChleife etwas in eine Datei schreiben soll.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

19

19.09.2006, 12:32

Zitat von »"Phili"«

@rklaffehn
und wenn sie beim 5. Schleifendurchlauf ausgeführt werden soll?
Ic hgeb zu, dass ist ncith die Problemstellung hier, aber trotzdem ist es auch keine Lösug, die Funktin einfach vor der Schleife aufzurufen.


Tja, wenn es beim 5. mal hätte sein sollen, wäre auch static nicht gegangen... static funktioniert auch nur dann, wenn die Funktion nicht zufällig void als Rückgabewert (jaja, dann bau ich mir halt nen Wrapper :oops:) hat und sorgt ausserdem dafür, dass die Funktion überhaupt für das ganze Programm nur einmal aufgerufen wird. (und nicht jedesmal, wenn sie das erste mal in einer Schleife aufgerufen wird) Aber auch das ist hier nicht die Problemstellung.

Was sich dahinter verbirgt, ist meistens ein Designfehler. Warum will man denn eine Funktion innerhalb einer Schleife aufrufen, wenn man das nur einmal machen darf/kann/will? Da ist es doch immer besser, ohne irgendwelche Krücken auszukommen, und das ganze einfach komplett vorher zu erledigen. (es gibt natürlich Ausnahmen)

Zitat von »"spacegaier"«

Geht leider nicht. Es ist eine Funktion meiner Logfile, die mir nur beim ersten Aufrufen einer Funktion in der while-SChleife etwas in eine Datei schreiben soll.


Da kommt es dann drauf an, was man genau ausgeben will. Wenn es nur Aufruf-Parameter sind, geht das ausserhalb der Schleife, wenn die innere Funktion nur bedingt aufgerufen wird (also nicht notwendig im ersten Schleifendurchlauf, siehe oben), geht es nicht.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Anonymous

unregistriert

20

19.09.2006, 12:36

Ich frag mich, warum für eine Logfile eine while Schleife verwendet wird...

Werbeanzeige