[C++] Variabel aantal parameter doorgeven

Pagina: 1
Acties:

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Op dit moment ben ik een klein C++ classje aan het schrijven om de syslog functies heen zodat ik deze transparant op Linux en Windows kan gebruiken.

Wat me niet lukt is bv deze functie:
code:
1
2
3
4
5
CSystemlog::error(const char *message, ...)
{
    va_list args;
    this->syslog(LOG_ERR, message, args);
}

Dit werkt dus niet (duh....). Hoe moet ik dit aanpakken?
Ik heb het al met een define geprobeerd, maar dat wil ook niet. Hoe doe ik dit?

The box said 'requires Windows 95 or better', so I installed Linux...


Verwijderd

Functie overloaden. Klaar

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Das een mogelijkheid, maar syslog onder Unix kan een onbeperkt aantal parameters aan (zal vast wel beperkt zijn, maar voordat je er zoveel gebruikt...), dus onder Win32 moet dat ook kunnen. Zelfs onder Unix lukt het me dus niet om deze functies in een classje te wrappen.

Nog meer ideeen/oplossingen?

The box said 'requires Windows 95 or better', so I installed Linux...


Verwijderd

Eerst een klein vraagje:

met de methode: this->syslog(.....)

geef je de argumenten mee. Mijn vraag is nu:
hoe is syslog gedefinieerd (dus het prototype
ervan)?.

EiSl

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
code:
1
2
3
extern void closelog(void);
extern void openlog(const char *, int, int);
extern void syslog(int, const char *, ...);

The box said 'requires Windows 95 or better', so I installed Linux...


Verwijderd

Ik denk niet dat het mogelijk is om een functie te maken die een variabel aantal parameters neemt, en die die parameters allemaal weer doorgeeft aan een volgende functie die ook een variabel aantal parameters neemt.

[off-topic]
Hoe noem je dat in het Nederlands, als een functie een parameter... 'neemt' ?
In het Engels gewoon: "function blaat takes 2 parameters", maar "functie blaat neemt 2 parameters" klinkt nogal raar... lastig..
[/off-topic]

Verwijderd

Op dinsdag 06 november 2001 10:21 schreef Sneech het volgende:
[..]

[off-topic]
Hoe noem je dat in het Nederlands, als een functie een parameter... 'neemt' ?
In het Engels gewoon: "function blaat takes 2 parameters", maar "functie blaat neemt 2 parameters" klinkt nogal raar... lastig..
[/off-topic]
euh, functie wil 2 parameters

Verwijderd

Op dinsdag 06 november 2001 10:24 schreef fladder het volgende:

[..]

euh, functie wil 2 parameters
LoL ;)

-> Laat ik mij even voorstellen; ik ben functie F en ik wil graag 2 parameters als het even kan. :)

------ edit ------
Ik denk dat ik het werkwoord eten er maar voor ga gebruiken: functie f eet twee parameters.

Klinkt redelijk acceptabel vind ik.

Verwijderd

klinkt toch best logisch? :)

Mijn naam is Hans en ik ben een overloaded functie. Ik wil NU METEEN 2 of 3 parameters of anders schei ik er mee uit!

Verwijderd

Misschien iets voor een poll:

Vul in : Functies _____ parameters.
A willen
B nemen
C eten
D accepteren
E vereisen
F anders, namelijk: _____

8-)

Verwijderd

nog een hele mooie: vergen :9

Verwijderd

Jaja, en zeker vegrijpen ook :)

Ik ben functie kees en ik vegrijp me aan allemaal kleine parametertjes. >:)


[on-topic]
Oei we raken wel een beetje ver offtopic eigenlijk :(
[/on-topic]

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
[on topic]
Dus geen andere oplossing??? Lekekr vaag dan....
[/on topic]

The box said 'requires Windows 95 or better', so I installed Linux...


Verwijderd

Hoeveel mogelijkheden heb je nodig qua parametercombinaties? Of is die unlimited...

Verwijderd

Op dinsdag 06 november 2001 10:35 schreef TheMrH het volgende:
[on topic]
Dus geen andere oplossing??? Lekekr vaag dan....
[/on topic]
Sja functies die een variabel aantal argumenten eten zijn nou eenmaal niet erg flexibel.. (afgezien van het feit dat ze ook nog eens lekker onveilig zijn omdat er helemaal niks aan type/range checking aan te pas komt..)

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

hoe variabel is dat aantal? is het tussen 0 en 100 of meer iets van 2, 3 of 4 ... ???

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Verwijderd

Uuuuuuum denk.....
ben maar een stomme VB programmeer maar eeuh,
is het geen idee om i.p.v. een class te maken die een x aantal apparte argumenten/parameters/neem-dingen heeft,
een class te bouwen die een parameter als lijst van flexibele lengte (stringetje of enum of zo) aanpakt en dat ding intern (for each) uit elkaar te prutsen....
Toch ? :?

  • ewasx
  • Registratie: Augustus 2000
  • Laatst online: 16-11-2025
Variabel aantal argumenten is mogelijk onder C++.
Heeft niemand het Stroustrup bij de hand? Daar staat het in... Ik heb hem ook niet want ik ben op mijn werk.

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
In m'n huidige app schat ik max 5.

Maar... dit aantal is ook nog variabel qua datatyoen. Bij 5 parameters zit je dan al snel op aantal_datatypen ^ 5 9of was het 5 ^ aantal_datatypen?)

Dat zijn nogal wat functies dan!

The box said 'requires Windows 95 or better', so I installed Linux...


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:46

Creepy

Tactical Espionage Splatterer

hmm.. in normaal C is dit goed te doen.. ben zelf niet zo'n C++ ster.. Heb thuis (dus niet hiero :( ) nog een C bijbel liggen (van Kernigan en Richie). Staat ook een voorbeeld in van een functie met een variabel aantal parameters...
Kan vanavond wel ff kijken hoe dat moet in C. Moet je zelf de ++ er maar bij denken :)

Voor alle twijfelaars die denken dat dit niet kan: Kijk eens naar printf(). Functie met een variabele aantal parameters..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Precies. Maar het aantal params verwerken is geen probleem, alleen het doorgeven van die params is weer een ander verhaal.
Ik denk dat ik het nu ga doen door in iedere functie de message string helemaal aan te maken:
code:
1
2
3
4
5
6
7
8
9
10
CSystemlog::error(const char *message, ...)
{
    va_list args;
    char tmp[1024];
    
    va_start(args, message);        /* initialize vararg mechanism */
    vsprintf(tmp, message, args);   /* build message */
    va_end(args);
    this->syslog(LOG_ERR, tmp);
}

Als iemand anders nog ideeen heeft: GRAAG!

The box said 'requires Windows 95 or better', so I installed Linux...


Verwijderd

Als reactie op:
Op dinsdag 06 november 2001 11:05 schreef Creepy het volgende:
hmm.. in normaal C is dit goed te doen.. ben zelf niet zo'n C++ ster.. Heb thuis (dus niet hiero :( ) nog een C bijbel liggen (van Kernigan en Richie). Staat ook een voorbeeld in van een functie met een variabel aantal parameters...
Kan vanavond wel ff kijken hoe dat moet in C. Moet je zelf de ++ er maar bij denken :)

Voor alle twijfelaars die denken dat dit niet kan: Kijk eens naar printf(). Functie met een variabele aantal parameters..
en
Op dinsdag 06 november 2001 10:56 schreef ewasx het volgende:
Variabel aantal argumenten is mogelijk onder C++.
Heeft niemand het Stroustrup bij de hand? Daar staat het in... Ik heb hem ook niet want ik ben op mijn werk.
Niemand zegt dat functies die een variabel aantal argumenten eten niet kunnen in C of C++. Het gaat nu om het maken van zo'n var-args-functie, die een andere var-args-functie (of zichzelf, voor de recursisten onder ons) aanroept met al zn eigen (variabele aantal) parameters.

(En dat is denk ik niet mogelijk.)

Verwijderd

Op dinsdag 06 november 2001 11:09 schreef TheMrH het volgende:
Precies. Maar het aantal params verwerken is geen probleem, alleen het doorgeven van die params is weer een ander verhaal.
Ik denk dat ik het nu ga doen door in iedere functie de message string helemaal aan te maken:
code:
1
2
3
4
5
6
7
8
9
10
CSystemlog::error(const char *message, ...)
{
    va_list args;
    char tmp[1024];
    
    va_start(args, message);        /* initialize vararg mechanism */
    vsprintf(tmp, message, args);   /* build message */
    va_end(args);
    this->syslog(LOG_ERR, tmp);
}

Als iemand anders nog ideeen heeft: GRAAG!
Als je echt per sé zo'n var-args-member wil (wat helemaal niet nodig is, er zijn betere alternatieven), lijkt het wegschrijven naar een tijdelijk buffertje met zo'n printf variant me een redelijke oplossing.

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Het 'lastige' is dan alleen dat ik dat in iedere functie moet doen....

Nogmaals: als er een andere oplossing is GRAAG!

The box said 'requires Windows 95 or better', so I installed Linux...


Verwijderd

<edit>
Ik zie ineens een hele riedel posts die ik eerst niet zag? Zit ik hier dingen te replyen die al bovenaan in het topic gezegd zijn :(
</edit>

  • tomato
  • Registratie: November 1999
  • Niet online
mietje: Ik zie ineens een hele riedel posts die ik eerst niet zag? Zit ik hier dingen te replyen die al bovenaan in het topic gezegd zijn :(
Gewoon Topix de schuld geven, zeggen dat er iets vaags aan de hand was. Gelooft toch iedereen wel >:) :P

Verwijderd

Op woensdag 07 november 2001 11:35 schreef tomato het volgende:
Gewoon Topix de schuld geven, zeggen dat er iets vaags aan de hand was. Gelooft toch iedereen wel >:) :P
Femme zat gisternacht te experimenteren, zie [topic=312955/1/25] I'm not a fraud! ;)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op dinsdag 06 november 2001 09:40 schreef TheMrH het volgende:
Op dit moment ben ik een klein C++ classje aan het schrijven om de syslog functies heen zodat ik deze transparant op Linux en Windows kan gebruiken.

Wat me niet lukt is bv deze functie:
code:
1
2
3
4
5
CSystemlog::error(const char *message, ...)
{
    va_list args;
    this->syslog(LOG_ERR, message, args);
}

Dit werkt dus niet (duh....). Hoe moet ik dit aanpakken?
Ik heb het al met een define geprobeerd, maar dat wil ook niet. Hoe doe ik dit?
IHA kan dit al niet in C, en in C++ zijn geen extra vararg
trucs toegevoegd. Voor dit soort gevallen was er al
vprintf( va_list ) bedacht, omdat je printf( va_list )
niet werkt, maar je hebt waarschijnlijk geen vsyslog ?

Wat waarschijnlijk wel werkt, is een vsprintf van args
naar een lokaal buffertje, en dat dan met
syslog(LOG_ERR, "%s", buffertje ) loggen.

Maar waarom maak je zelf zo'n C interface voor een
C++ class? Waarom geen overloaded operator<<() ?
En voor de echte std oplossing, derive je een
logbuf van std::streambuf :)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Op woensdag 07 november 2001 15:42 schreef MSalters het volgende:
Wat waarschijnlijk wel werkt, is een vsprintf van args
naar een lokaal buffertje, en dat dan met
syslog(LOG_ERR, "%s", buffertje ) loggen.
Dit had ie al. Lees voortaan de hele thread een keer door aub. voor je gaat replyen.
Maar waarom maak je zelf zo'n C interface voor een
C++ class? Waarom geen overloaded operator<<() ?
Was ook al eerder voorgesteld.
En voor de echte std oplossing, derive je een
logbuf van std::streambuf :)
Een 'std oplossing' ?

Uit de eerdere code voorbeelden van de topicstarter kunnen we opmaken dat hij geen behoefte heeft aan extra buffering, dus een aparte streambuf ding ervoor gaan zitten maken lijkt me zwaar overkill.

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Ik had gehoopt dat er een soort virtual functie zou zijn of een speciale define waarmee het zou kunnen, maar eigenlijk zijn het maar een stuk of 5 functies. Dan maar in allemaal het buffertje vullen en wegschrijven.

En overhead is niet nodig; is alleen maar overhead :)
Ik bedoel hiermee dat ik C++ zo simpel mogelijk wil houden, dus eigenlijk voornamelijk als wrapper voor een aantal C functies wil gebruiken, zodat ik deze classes onder Win32 en Linux kan gebruiken (zelfde interface).

Spanx allen voor het meedenken, ik doe het wel de hard way...

The box said 'requires Windows 95 or better', so I installed Linux...

Pagina: 1