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

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

1

22.07.2009, 17:40

Undefinierte Anzahl von Parametern

Hi

Ich schreibe gerade eine Funktion bei der der Nutzer (der Funktion) unendlich viele z.B. Variablen übergeben kann. Also ist mir beim Schreiben der Funktion noch unklar wie viele das sein werden.
So wie bei printf!
Wie funktioniert sowas denn?

Danke im Voraus! :D
Pi mal Daumen = 18.84955592

2

22.07.2009, 17:59

So in etwa:


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
#include <iostream>
using namespace std;
#include <stdarg.h>

void meineFunktion(int Anzahl, ... )
{
    va_list params; // Zugriffshandle für Parameter

    int intpar;     // Parameterinhalt

    va_start(params, Anzahl); // Zugriff vorbereiten

    // Durchlaufe alle Parameter (steht in Anzahl)

    for (int i=0; i<Anzahl; i++)
    {
        intpar = va_arg(params, int); // hole den Parameter

        cout << intpar << endl;       // zeige ihn an

    }
    cout << "---" << endl;
    va_end(params); // Zugriff abschließen

}

int main()
{
    // Tests der Funktion mit unterschiedlichen Parametern

    meineFunktion(2, 5, 2);
    meineFunktion(0);
    meineFunktion(4, 5, 2, 0, 3);
}


Hab den Code von Willemers Informatik-Ecke.
Also keine Garantie für irgendwas...
;)
fka tm

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

3

22.07.2009, 18:16

Ich habe mal gehört, dass das kein schöner Stil sein soll, aber weiß spontan auch keinen Grund und finde kein Quote.

Wie wäre es mit einem STL-Container als Parameter?

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

4

22.07.2009, 18:23

"Willemers Informatik-Ecke"

ich hab mit dem buch von dem C++ gelernt. das buch ist gut!
(wollte ich mal gesagt haben)

das ist deshalb kein schöner stil, weil dabei die typeinfo verloren geht.
printf braucht deshalb ja auch einen formatstring. wenn man es als benutzer
schafft den string zu verändern, kann man das programm exploiten
(finde den artikel dazu nicht, suche aber).

stell dir vor du machst sowas:


C-/C++-Quelltext

1
2
int res = getchar();
printf("character was: %c", res);


sieht gut aus oder?
nein.

printf denkt man hat ein char (1 byte) übergeben, man hat aber ein
int übergeben (4 bytes). dadurch können folgende parameter beeinträch-
tigt werden. im schlimmsten fall ist das eine sicherheitslücke.

demnächst gibt es mit C++0x variadic templates. damit wird das elegant gelöst.
natürlich kann man die funktion verwenden, man sollte sich nur auskennen

:D
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

22.07.2009, 18:29

Re: Undefinierte Anzahl von Parametern

Zitat von »"FLO2"«

Hi

Ich schreibe gerade eine Funktion bei der der Nutzer (der Funktion) unendlich viele z.B. Variablen übergeben kann. Also ist mir beim Schreiben der Funktion noch unklar wie viele das sein werden.
So wie bei printf!
Wie funktioniert sowas denn?

Danke im Voraus! :D


Unendlich viel Parameter kannst du sowiso stecken. Aber wenn du nich die Ellipsis verwenden willst kannst du z.B. die Funktion mit verschiedenen Templateparametern überladen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename P1>
void foo( const P1& p1 )
{
}

template<typename P1, typename P2>
void foo( const P1& p1, const P2& p2 )
{
}

template<typename P1, typename P2, typename P3>
void foo( const P1& p1, const P2& p2, const P3& p3 )
{
}

// usw...

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

6

22.07.2009, 18:31

@TrikkieMikkie
Es funktioniert :D
Danke!

Zitat von »"K-Bal"«

Wie wäre es mit einem STL-Container als Parameter?

Hmm, noch nie gehört.
Werde mal googeln

@Gotbread
:?:
Das versteh ich nicht ganz! Dann macht man eben statt dem, das:

C-/C++-Quelltext

1
2
int res = getchar ();
printf ("character was: %i", res);


Danke im Voraus :D

Edit:
@David_pb
Das ist doch umständlich. :?


So, jetzt habe doch ein Problem.
Das ist die Header:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <windows.h>
#include <stdarg.h>

using namespace std;

void mwrite (char Text[1000], int Dauer, const char Formatiert, ...)
{

    if (Dauer > 0)
    {
        Sleep(Dauer);
    }
    va_list params;
    int char_paras;
    va_start (params, Formatiert);
    for (int i=0; i<Formatiert; i++)
    {
        char_paras = va_arg(params, const char);
        if (i == 0)
        {
            if (Formatiert == 'n')
                cout << Text << endl;
            else if (Formatiert == 't')
                cout << Text << "\t";
            else if (Formatiert == 'v')
                cout << Text << "\v";
            else if (Formatiert == 'r')
                cout << Text << "\r";
            else if (Formatiert == 'b')
                cout << Text << "\b";
            else if (Formatiert == '"')
                cout << Text << "\"";
            else if (Formatiert == '\\')
                cout << Text << "\\";
        }   // if

        else if (i < 0)
        {
            if (Formatiert == 'n')
                cout << "\n";
            else if (Formatiert == 't')
                cout << "\t";
            else if (Formatiert == 'v')
                cout << "\v";
            else if (Formatiert == 'r')
                cout << "\r";
            else if (Formatiert == 'b')
                cout << "\b";
            else if (Formatiert == '"')
                cout << "\"";
            else if (Formatiert == '\\')
                cout << "\\";
        }
    }
}


Die cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include "Ausgabe.hpp"
#include <iostream>

int main ()
{
    cout << "Das war cout" << endl;
    mwrite ("Hello World", 1000, 'n', 'n');
    cout << "wieder cout" << endl;

    return 0;
}

Es lässt sich zwar fehlerfrei kompilieren, aber wenn ich bei Formatiert ein weiteres Escape-Zeichen eingebe macht er nur das erste.

(Nochmals) Danke im Voraus :D
Pi mal Daumen = 18.84955592

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

7

22.07.2009, 18:54

genau. aber wenn man das vergisst. typen werden hier nicht automatisch
angepasst deshalb
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

22.07.2009, 19:09

Zitat von »"FLO2"«


@David_pb
Das ist doch umständlich. :?


Genau, und es ist Typsicher!

9

22.07.2009, 19:47

Wieso keine Streams benutzen? In cout und Co klappt das doch wunderbar, man hat eine beliebige Parameterzahl und Typsicherheit und hat als User viel weniger Aufwand und kann weniger falsch machen, usw.
Ist vielleicht auf den ersten Blick etwas schwerer zu implementieren, aber es hat sicherlich einen Grund, warum Streams in der STL so oft benutzt werden.
Lieber dumm fragen, als dumm bleiben!

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

10

22.07.2009, 19:54

ich find nirgend wo, solche streams(ich habe gegoogelt).
Hast du dazu ein Tutorial oder so?

Danke im Voraus :D
Pi mal Daumen = 18.84955592

Werbeanzeige