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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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.

  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 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.

  9. #9
    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 ?

  10. #10
    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.

+ 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