IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Nombre de parametres variables


Sujet :

C

  1. #1
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par d�faut Nombre de parametres variables
    Bonjour,

    Je cree actuellement un programme en C qui se lance sans OS, en gros il y a un boot en assembleur qui lance ce programme. Bref, je ne dispose d'aucune macro ou librairies pour mon programme. J'essai de mettre en place une fonction semblable � printf, je fais pour tester:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    void toto( char *texte, ... )
    {
       int position = 0;
       while( texte[position] != '\0' )
       {
          printf ( "[%c]", texte[position] );
          position++;
       }
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
       position++;
       printf ( "(%c)(%i)", texte[position], texte[position] );
    }
     
    main()
    {
       toto ( "OK", "toto" );
       return(0);
    }
    Dans ce cas j'obtient:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    [O][K](t)(116)(o)(111)(t)(116)(o)(111)( )(0)( )(0)( )(0)( )(0)(')(39)()(12)
    Donc j'en deduit que j'ai "OK" + caractere null + "toto" + 4 caracteres null puis du reste sans importance.

    Si je change en mettant dans le main:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    main()
    {
       toto ( "OK", 5 );
       return(0);
    }
    ou

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    main()
    {
       int titi = 8;
       toto ( "OK", titi );
       return(0);
    }
    J'obtient:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    [O][K]( )(0)( )(0)(')(39)()(12)()(23)()(7)(7)(55)()(2)()(23)()(7)
    soit "OK" + 2 caracteres null.

    Ma question, comment fait printf pour trouver la valeur de titi ? Je ne souhaite pas utiliser des macros deja faite, c'est pour cela que je n'utilise pas va_list, va_start etc...

    Merci de vos reponses !

  2. #2
    scr
    scr est d�connect�
    Membre �prouv�
    Inscrit en
    Juin 2005
    Messages
    127
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par d�faut
    Bonne question que je ne m'�tais jamais pos�

    j'ai trouv� une impl�mentation du printf ici :

    http://membres.lycos.fr/dancel/c/c70_140.htm

    elle utilise les va_arg etc ... mais le principe est la

  3. #3
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par d�faut Complement d'info
    Re,

    J'ai trouv� une d�finition des macros:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    #define va_start(list, name) (void) (list = (void *)((char *)&...))[-1]
    #define va_arg(list, mode) ((mode *)(list = (char *)list + sizeof (mode)))[-1]
    #define va_end(list) (void)0
    Par contre si je fais:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void toto( char *texte, ... )
    {
       va_list arguments;
       int position = 0, n, somme;
       while( texte[position] != '\0' )
       {
          printf ( "[%c]", texte[position] );
          position++;
       }
       va_start( arguments, texte );
       while( (n = va_arg( arguments, int ) ) != 0 )
       {
          printf ( "*%i*(%i)", somme, n );
          somme += n;
       }
       va_end( arguments );
       printf ( "\nsomme =%i\n", somme );
    }
     
    main()
    {
       toto ( "OK", 1, 2, 5 );
       return(0);
    }
    J'obtient:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    [O][K]*6*(2)*8*(5)
    somme =13
    Donc pas encore au point, je ne sais pas pourquoi somme est initialis� � 6 au lieu de 0...

    Cordialement.

  4. #4
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par d�faut Correction
    Re,

    Juste une petite correction:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    #define va_start(list, name) (void) (list = (void *)((char *)&...))
    (Y'a pas le [-1], je l'avais ajout� pour un test ).

    Cordialement.

  5. #5
    Membre Expert
    Inscrit en
    D�cembre 2004
    Messages
    1 478
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 1 478
    Par d�faut
    Pourquoi tu utilises printf() dans ta fonction qui est censee etre semblable a printf() ? La fonction de base, c'est vfprintf(), qu'il va te falloir coder...

  6. #6
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par d�faut Version qui marche
    Re,

    Une version qui marche, mais je ne sais toujours pas pourquoi somme est initialis� � 6

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    #define va_start(list) (void) (list = (void *)((char *)&...))
    #define va_arg(list, mode) ((mode *)(list = (char *)list + sizeof (mode)))[-1]
    #define va_end(list) (void)0
     
    typedef void *va_list;
     
    void toto( char *texte, ... )
    {
       va_list arguments;
       int position = 0;
       int n;
       int somme;
       while( texte[position] != '\0' )
       {
          printf ( "[%c]", texte[position] );
          position++;
       }
       somme = 0;
       va_start( arguments );
       while( (n = va_arg( arguments, int ) ) != 0 )
       {
          printf ( "*%i*(%i)", somme, n );
          somme += n;
       }
       va_end( arguments );
       printf ( "\nsomme =%i\n", somme );
    }
     
    main()
    {
       toto ( "OK", 1, 2, 5 );
       return(0);
    }
    Il faut trouver maintenant comment passer des noms de variables en parametres...

    Cordialement.

  7. #7
    scr
    scr est d�connect�
    Membre �prouv�
    Inscrit en
    Juin 2005
    Messages
    127
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par d�faut
    Ta variable somme n'est pas initialis�e donc valeur de d�part ind�finie

    La d�finition de tes macro ne fonctionne pas sous VC6.0 tu compiles avec quoi ?
    Pour ma part je fais tout simplement un include de <stdarg.h> il y a diff�rentes impl�mentation des macros dans le point h

    "Il faut trouver maintenant comment passer des noms de variables en parametres..." => tu veux faire quoi exactement ?

  8. #8
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par d�faut Pourquoi printf
    Re,

    DaZumba, en fait la c'est pour des tests, ensuite j'utiliserai l'adressage directe a la carte graphique pour afficher du texte � l'ecran. Donc le nom (printf ou vfprintf) ne m'importe peu. Pour l'instant j'ai fait 2 fonctions en C pour afficher une chaine de caractere et l'autre pour afficher un nombre sur une position de l'ecran, dont le code est:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    #define MEMOIRE_VIDEO_TEXT 0xB8000000
     
    unsigned int print(const char *_message, unsigned char x, unsigned char y)
    {
       unsigned long i = 0;
       unsigned char *vidmem = (unsigned char *)MEMOIRE_VIDEO_TEXT;
       vidmem += ((y*80)+x)*2;
       while (_message[i] != 0) 
       {
          *vidmem = _message[i++];
          vidmem += 2;
       }
       return( i );
    }
     
    void nbprint( unsigned int nombre, unsigned char x, unsigned char y )
    {
        unsigned char i = 0;
        unsigned char *vidmem = (unsigned char *)MEMOIRE_VIDEO_TEXT;
        vidmem += ((y*80)+x)*2;
        for( i = 12; i > -1; i-=4 )
        {
    	*vidmem = nb2car((nombre>>i)&0xF);
            vidmem += 2; 
        }
    }
    Le but c'est de rassembler ces deux fonctions pour en faire une seule avec la syntaxe de vfprintf.

    Cordialement.

  9. #9
    Membre �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par d�faut
    Il y a un truc qui me choque dans ta d�marche.

    Quand tu compiles ton programme, tu dois au moins linker contre la libc et c'est dans la libc que printf est d�fini.

    Tu n'as pas de librairies au boot ; tu dois linker ton programme en static. Pourquoi alors ne pas utiliser le printf de la libc sans avoir � le r��crire.

    Tu nous diras comment tu t'en sors. Tu as d�j� lanc� un programme comme tu dis ? Tu ne dois pas avoir droit � grand chose au boot et c'est peut-�tre pour �a que tu dois r�impl�menter certaines choses.

  10. #10
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par d�faut Faire quoi ?
    Re,

    Scr: je veux faire une methode du genre:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    int toto = 1;
    imprime( "toto=?", toto );
    Donc imprime devra remplacer le ? par la valeur de toto.

    Cordialement.

  11. #11
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par d�faut Qu'ai-je au boot
    Re,

    aoyou: Au boot je n'ai rien, je ne peux pas linker avec libc, car il me semble ( mais � confirmer ) que printf utilise l'interruption 21h du DOS qui elle m�me utilise l'interruption 10h du bios. J'ai n�anmoins acc�s � l'interruption 10h du bios mais je pr�f�re utiliser directement la memoire video car je d�sire ensuite passer en mode prot�g� et la je n'aurais pas d'acces aux interruptions du bios.

    Bref je n'ai aucune librairie � ma disposition et je compile avec turbo C.
    Donc je doit refaire toutes les fonctions existant en C avec libc est qui me seront utile.

    Cordialement.

  12. #12
    scr
    scr est d�connect�
    Membre �prouv�
    Inscrit en
    Juin 2005
    Messages
    127
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par d�faut
    Citation Envoy� par Lovmy
    Re,

    Scr: je veux faire une methode du genre:

    int toto = 1;
    imprime( "toto=?", toto );

    Donc imprime devra remplacer le ? par la valeur de toto.

    Cordialement.
    Une fonction du style printf en fait.
    Alors pourquoi ne pas l'utiliser directement...

  13. #13
    scr
    scr est d�connect�
    Membre �prouv�
    Inscrit en
    Juin 2005
    Messages
    127
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par d�faut
    Ya ka reprendre le code de la fonction myprintf en remplancant les printf par des ecriture directe dans la memoire video non ?

  14. #14
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par d�faut Oui mais...
    Scr: myprintf fonctionne si on passe des parametres tel que 1, "toto"... mais pas lorqu'on passe un nom de variable en parametre.

    Cordialement.

  15. #15
    scr
    scr est d�connect�
    Membre �prouv�
    Inscrit en
    Juin 2005
    Messages
    127
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par d�faut
    d�sol� mais je ne vois pas ou tu veux en venir avec tes noms de variables en param�tre...

    tu veux faire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    int toto = 1;
    imprime( "toto=?", toto );
    pourquoi ne pas l'�crire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    int toto = 1;
    myprintf("toto=%s",toto);
    ou plutot (merci dazumba pour la rectification qui suit)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    int toto = 1;
    myprintf("toto=%d",toto);
    quel int�r�t ?

  16. #16
    Membre Expert
    Inscrit en
    D�cembre 2004
    Messages
    1 478
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 1 478
    Par d�faut
    Citation Envoy� par scr
    pourquoi ne pas l'�crire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    int toto = 1;
    myprintf("toto=%s",toto);
    J'imagine que tu voulais ecrire
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    myprintf("toto=%s", "toto");
    Lovmy: Les noms de variable ne sont valables que pour le code source. Une fois compile, ces noms ont disparu (a part dans certains modes debug). Ce que tu veux faire n'a pas de sens en C.

  17. #17
    scr
    scr est d�connect�
    Membre �prouv�
    Inscrit en
    Juin 2005
    Messages
    127
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par d�faut
    Citation Envoy� par DaZumba
    J'imagine que tu voulais ecrire
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    myprintf("toto=%s", "toto");
    Lovmy: Les noms de variable ne sont valables que pour le code source. Une fois compile, ces noms ont disparu (a part dans certains modes debug). Ce que tu veux faire n'a pas de sens en C.
    Pour ma part non mais c'est peut �tre l'id�e de Lovmy ???
    C'est pour ca que je ne vois pas trop ou Lovmy veut en venir...

    En fait je voulais ecrire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    int toto = 1;
    myprintf("toto=%d", "toto");

  18. #18
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par d�faut OK ca marche
    Bonjour,

    OK j'ai essay� le code suivant ca marche.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    #define va_start(list) (void) (list = (void *)((char *)&...))
    #define va_arg(list, mode) ((mode *)(list = (char *)list + sizeof (mode)))[-1]
    #define va_end(list) (void)0
    typedef void *va_list;
     
    void imprime(char *texte, ...)
    {
       va_list parametres;
       int n;
       char *s, c;
       float f;
     
       va_start(parametres);
       while (*texte != '\0')
       {
          if ( *texte == '%' )
          {
    	 switch (*++texte)
    	 {
    	    case '%' :
    	       putchar('%');
    	       break;
    	    case 'c': // affichage d'un caractere
    	       c = va_arg(parametres, char);
    	       putchar(c);
    	       break;
    	    case 'i': // affichage d'un entier
    	       n = va_arg(parametres, int);
    	       printf("%d", n);
    	       break;
    	    case 's' : // affichage d'une chaine
    	       s = va_arg(parametres, char *);
    	       for ( ; *s != '\0'; s++ )
    		  putchar( *s );
    	       break;
    	 }
          }
          else
    	 putchar( *texte );
          texte++;
       }
       va_end(pa);
    }
     
    main()
    {
       char toto = 'A';
       imprime ( "OK(%c)", toto );
       return(0);
    }
    Merci de votre aide !
    Cordialement.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 12
    Dernier message: 25/02/2008, 16h32
  2. R�ponses: 9
    Dernier message: 15/05/2007, 12h41
  3. Parametre variables en nombre et en type
    Par tinico dans le forum Langage
    R�ponses: 9
    Dernier message: 18/04/2007, 16h55
  4. [XSL~FO] Nombre de paramètres variable
    Par Androrion dans le forum XSL/XSLT/XPATH
    R�ponses: 6
    Dernier message: 25/08/2006, 17h45
  5. Fonction Execlp avec nombre parametres variable
    Par laurent_ifips dans le forum C
    R�ponses: 3
    Dernier message: 25/11/2005, 20h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo