[c] va_list items tellen? dmv defines ?

Pagina: 1
Acties:

  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
offtopic:
SJIT, wrong forum..... ik vraag wel n move aan, Sorry!


ik wil weten hoeveel items er in mijn va_list zitten helaas is dit niet te tellen en levert iets als

C:
1
printf("%s%s%s%s,",argv[0]);

dus rare output op

eigenlijk wil ik een chkFmt(fmt,....) functie schrijven die nagaat of het aantal format tekens (%s %d %u enz...) wel gelijk is aan het aantal meegeven argumenten.

aangezien dit in principe niet te tellen is wilde ik het zo oplossen:

C:
1
2
3
4
5
6
#define printf(fmt)  sec_printf(0,fmt,...)
#define printf(fmt,a1)  sec_printf(1,fmt,...)
#define printf(fmt,a1,a2)  sec_printf(2,fmt,...)
#define printf(fmt,a1,a2,a3)  sec_printf(3,fmt,...)
#define printf(fmt,a1,a2,a3,a4)  sec_printf(4,fmt,...)
#define printf(fmt,a1,a2,a3,a4,a5)  sec_printf(5,fmt,...)


Dit blijkt echter niet te mogen... toch moet zoiets mogelijk zijn! hoe?

offtopic:
blijkbaar moet ik volgens de FAQ eerst de local mod een uurtje de tijd geven en daarna het topic reporten :)
het is niet belangrijk genoeg om n mod voor te schoppen..... ok we'll wait

[ Voor 40% gewijzigd door xychix op 06-04-2004 13:50 ]

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
google al geprobeerd?


http://msdn.microsoft.com..._.va_end.2c_.va_start.asp

inclusief voorbeeld code om het aantal argumenten te tellen. (het kan dus wel, natuurlijk :z)

[ Voor 16% gewijzigd door 12_0_13 op 06-04-2004 15:50 . Reden: typos ]


  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
12_0_13 schreef op 06 april 2004 @ 15:49:
google al geprobeerd?


http://msdn.microsoft.com..._.va_end.2c_.va_start.asp

inclusief voorbeeld code om het aantal argumenten te tellen. (het kan dus wel, natuurlijk :z)
hmmm vergeten te zeggen dat het een UNIX systeem betrof :)
hmmm ik zal die code toch eens proberen.
Ben echter bang dat het niet gaat helpen want het einde van de va_list is op stack niet te zien.
Het kan heel goed zijn dat de opgevraagde geheugenruimte iets bevat dat op een bepaald type lijkt, dan loop ie dus door.

Daar komt bij dat is het voorbeeld bekend is dat er allen integers ingaan! dat is in mijn geval niet bekend

[ Voor 35% gewijzigd door xychix op 06-04-2004 16:20 ]

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

12_0_13 schreef op 06 april 2004 @ 15:49:
google al geprobeerd?


http://msdn.microsoft.com..._.va_end.2c_.va_start.asp

inclusief voorbeeld code om het aantal argumenten te tellen. (het kan dus wel, natuurlijk :z)
Het spijt me zeer, maar het kan toch echt niet. Het voorbeeld telt ook niet het aantal opgegeven argumenten; het telt het aantal argumenten tot het een -1 tegen komt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
xychix schreef op 06 april 2004 @ 13:02:
offtopic:
SJIT, wrong forum..... ik vraag wel n move aan, Sorry!


ik wil weten hoeveel items er in mijn va_list zitten helaas is dit niet te tellen en levert iets als

C:
1
printf("%s%s%s%s,",argv[0]);

dus rare output op
Dat klopt. Helaas is het niet mogelijk; je code moet gewoon kloppen. Voor printf-achtige functies kun je GCC de zaak compile-time laten checken, maar ook GCC kan niet overweg met runtime-gecreeerde format strings a la
C:
1
2
3
4
5
6
char fomat[16];
int precision = 7;
sprintf( format, "%%%dd", precision );
/* format = "%7d" */
printf( "%7d", precision ); /* GCC: type ok */
printf( format, precision ); /* niet leuk voor GCC*/

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


  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
C:
1
2
3
4
5
6
#define printf(fmt)  sec_printf(0,fmt,...)
#define printf(fmt,a1)  sec_printf(1,fmt,...)
#define printf(fmt,a1,a2)  sec_printf(2,fmt,...)
#define printf(fmt,a1,a2,a3)  sec_printf(3,fmt,...)
#define printf(fmt,a1,a2,a3,a4)  sec_printf(4,fmt,...)
#define printf(fmt,a1,a2,a3,a4,a5)  sec_printf(5,fmt,...)


zoiets moet toch wel mogelijk zijn ??? of een soortgelijke macro oplossing ??

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:14
Jawel, dat kan precies zo, maar in plaats van de puntjes moet je dan natuurlijk de argumenten herhalen:
C:
1
2
3
4
5
6
7
8
#define printf(fmt)  sec_printf(0,fmt) 
#define printf(fmt,a0)  sec_printf(0,fmt,a0) 
#define printf(fmt,a0,a1)  sec_printf(0,fmt,a0,a1) 
// etc...
void sec_printf(int argc, const char *fmt, ...) 
{
    // ...en hier gewoorn met je va_list werken
}

Natuurlijk moet je dan voor elk aantal argumenten een macro definiëren, maar ja, het is niet anders.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Sinds wanneer kun je macro's overloaden :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:14
Uhh.... dat kan inderdaad niet. Dan werkt het dus niet.

  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
ik ga wel wat experimenteren met een fixed value na de va_list

like:
C:
1
xprintf(char * fmt , ... , int eind = -1);

dan zou de eerder geposte counter wel werken.. alleen dan moet niemand een -1 willen printen :)

http://www.immunix.org/formatguard.pdf
dit zou een oplossing moetn zijn maar ik snap de macro's in dit document NOG niet :)

[ Voor 22% gewijzigd door xychix op 07-04-2004 09:54 ]

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
.oisyn schreef op 06 april 2004 @ 23:21:
Sinds wanneer kun je macro's overloaden :?
1999

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom ondersteunt comeau dat dan niet? Ben je niet in de war met vararg macro's?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Yep. Ik moet twee voorgestelde extensies door de war hebben gehaald.
edit:

De relevante tweede extensie is "Placemarker tokens"

Voorbeeld gejat van Wave, is X overloaded of niet?
code:
1
2
3
4
5
6
7
void f(); void f(char const*);
#define X(p) f(p)
int main()
{
    X("abc");      // expands to: f("abc")
    X() ;          // expands to: f()
}

[ Voor 90% gewijzigd door MSalters op 07-04-2004 15:35 ]

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


  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
MSalters schreef op 07 april 2004 @ 15:02:
Yep. Ik moet twee voorgestelde extensies door de war hebben gehaald.
edit:

De relevante tweede extensie is "Placemarker tokens"

Voorbeeld gejat van Wave, is X overloaded of niet?
code:
1
2
3
4
5
6
7
void f(); void f(char const*);
#define X(p) f(p)
int main()
{
    X("abc");      // expands to: f("abc")
    X() ;          // expands to: f()
}
het doel wat ik heb is het bepalen van het aantal argumenten dat meegegeven word aan een ChkFmt(fmt,...) functie. dat kan ik met bovenstaande helaas nog niet bereiken.

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


Verwijderd

hi,

heel lang geleden veel C gedaan met maar een funktie met ... leverde een sruct op met list en een count

for ( I =0 ; I < va_list.count; I++)

en of

#define WHATEVER va_list.count;

FF uit m'n hoofd hoor... ;-)

Groeten

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Helaas, implementatie-specifiek.

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

Pagina: 1