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 :

La longueur de n'importe quelle variable


Sujet :

C

  1. #1
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut La longueur de n'importe quelle variable
    Bonjour tout le monde,
    J'essaie d'écrire une fonction qui soit un peu intelligente. Cette fonction détectera combien de caractère faut il pour écrire la variable passé envoie en paramètre.
    Ex:
    • int i=25 ->return 2
    • char caracter='c' ->return 1
    • char string[]="Bonjour" ->return 7
    • ...


    Pour le traitement, je peux me débrouiller, mais comment puis je faire en sorte que l'argument d'une fonction soit n'importe quelle variable, et puis enfin comment savoir le type de cette variable?
    Si c'est pas possible de le faire dites le...
    Merci

  2. #2
    Membre éclairé

    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Août 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 33
    Par défaut
    Je ne sais pas si c'est très propre, mais perso je passerait en argument un void* pour passer l'argument à "mesurer", et une constante (provenant tout droit d'un enum placé dans le .h correspondant) qui t'indiquerait le type de la variable.

    edit : ça donnerait un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    typedef enum{ 
        vCHAR,
        vINT,
        vSTR
    } vTypes;
     
    int size(void* sizeme, vTypes genre);

  3. #3
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut
    ben justement dans ce prototype j'ai besoin d'envoyer le type de variable.
    Moi je veux envoyer un type, n'importe lequel, la fonction détecte le type, et me dis sur combien de caractère il peut s'écrire.
    C'est un peu de l'encapsulation.

  4. #4
    Membre éclairé

    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Août 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 33
    Par défaut
    Oulà pour détecter le type tout seul j'ai bien envie de te dire que c'est mort D'ailleurs je le fait tiens : c'est mort

    Typiquement entre un pointeur sur un truc et un pointeur sur une chose, la différence est plus que ténue (i.e. : y'en a pas).

    Donc pour résumer, à ma connaissance : faire ce que tu demande est impossible.

  5. #5
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut
    Je me doutais un peu, merci.
    PS : Y a pas que le café que le C ne sais pas faire...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Par défaut
    A vrai dire je ne vois pas vraiment d'application concrète à ton problème, dans quel cas on aurait besoin d'une telle fonction ?

  7. #7
    Membre éclairé

    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Août 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 33
    Par défaut
    Citation Envoyé par ilys05 Voir le message
    PS : Y a pas que le café que le C ne sais pas faire...
    Un langage ne sait rien faire à proprement parler, ce sont les programmes que tu écris en utilisant ce langages qui vont "savoir" faire des choses (pour être précis ils sauront faire ce que tu aura su leur expliquer dans le langage en question )

    Si tu veux, avec du C, pouvoir traiter des variables qui détectent automagiquement leur type tout seul : écrit un compilo (en C) qui saura le faire ^^ !

    Mais, si c'est pas indiscret, pourquoi as tu besoin d'une telle fonction au fait, et pourquoi envoyer le type en argument n'est-il pas une option ?

  8. #8
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut
    Pour la remarque c'était juste pour plaisanter.
    Pourquoi j'en ai besoin, parce que je veux faire une fonction qui me trace un tableau.
    Un peu de ce genre
    +-----+---------+-----+
    | NOM | PRENOM | AGE |
    +-----+---------+-----+

    Pour la mise en forme du tableau il faut que la largeur de tous les mots de la colonnes soit la même; si c'est trop grand faudra coupé, si c'est trop petit continué avec des espaces.
    Il est facile de créé une fonction pour ce tableau précisément, comme il est facile d'en créé pour n'importe quel tableau spécifiquement. Moi je veux créé une fonction qui trace le tableau pour n'importe quel tableau.
    La fonction aurais comme prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct {
        int id;
        char nom[20];
        char prenom[20];
    }tuple;
     
    void traceTab(char **tete, tuple *contenu, int colone, int ligne);
    Tout ce que j'aurais à faire pour dessiner un autre tableau, c'est de changer la structure, et de changer l'entête du tableau.
    Maintenant je me suis un peu décourager, et je vais devoir créé une fonction tracerTab1, tracerTab2, tracerTab3...

  9. #9
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut
    Je crois que j'ai la solution.
    Je vais simuler l'écriture de la variable (quelle qu'elle soit), à l'écran.
    Quand on fait puts(uneVariable), puts s'en fou de quelle type de variable il s'agit.
    Il me faut donc écrire cette variable dans une autre variable string, et de faire un strlen sur la chaine.
    Vous en dites quoi?
    Reste à savoir comment faire un puts dans une variable...
    Sinon on peut écrire dans un fichier, puis relire le tout et stoquer dans un string.
    Je sais c'est pas très propre...
    Mais j'ai pas trouvé mieux.

  10. #10
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Quand on fait puts(uneVariable), puts s'en fou de quelle type de variable il s'agit.
    Tu es sur de ce que tu dis ???
    Tu sait bien a quoi sert puts ???
    A ecrire des chaines de caractères !

  11. #11
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par ilys05 Voir le message
    Bonjour tout le monde,
    J'essaie d'écrire une fonction qui soit un peu intelligente. Cette fonction détectera combien de caractère faut il pour écrire la variable passé envoie en paramètre.
    Je ne comprends pas ta phrase...

    Pourrais tu donner un peu plus d'informations sur le contexte d'utilisation d'une telle fonction. La variable que tu désires fournir provient d'une saisie utilisateur?
    Si c'est le cas, ca sera forcément une chaîne de caractères. Dans le cas contraire, il t'est toujours possible de convertir un entier en chaine de caractère grâce à la fonction sprintf(). Il ne te reste plus qu'à faire un strlen(). C'est une idée!

  12. #12
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut
    J'explique ce que je veux faire un peu mieux.

    Je veux écrire une fonction qui trace un tableau en CLI.
    Elle devra représenté un tableau de structure en un tableau.
    Voici la structure d'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
        int id;
        char nom[20];
        char prenom[20];
    }tuple;
    Supposons que j'ai un nom : Guillaume . Supposons aussi que la taille de la colonne nom est de 7, et la taille de la colonne prenom fait 7 aussi.
    Le champ ID quand à lui fait 2 de large. Donc pour écrire 1 il faut écrire 01, ou bien ajouter un espace comme ceci " 1" ou "1 "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    +----+---------+---------+
    | ID | NOM     | PRENOM  |
    +----+---------+---------+
    | 01 | Guillau | Antoine |
    +----+---------+---------+
    Guillaume fait plus de 7 donc devra être coupé, Antoine lui fait 7 donc ne sera pas coupé.
    Si je n'effectue pas ce traitement le tableau aura l'aire de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    +----+---------+---------+
    | ID | NOM     | PRENOM  |
    +----+---------+---------+
    | 1 | Guillaume | Antoine |
    +----+---------+---------+
    Pour faire ceci c'est assez simple. Mais c'est simple parce que c'est un tableau à part. Je ferais le traitement pour toutes les cases dela colonne ID, puis pour toutes les cases de la colonnes Nom. Et justement je sais que la colonne ID est un int, ainsi que la colonne Nom est un string.
    Maintenant j'envoie à ma fonction à tracer une autre structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
        int id_message;
        int id_expediteur;
        char contenu[200];
    }tuple;
    La fonction plantera, car elle attendra de traiter un string en deuxième colonne, et non pas un int.
    Il me faut donc écrire une autre fonction pour cette structure, et ainsi de suite...
    Et ce que je veux faire, c'est justement d'automatiser la tache.
    J'envoie à la fonction l'entete du tableau, le contenu qui sera insérer, ainsi que combien de ligne et combien de colonne possède le tableau.
    Le reste la fonction s'en charge.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void traceTab(char **tete, tuple *contenu, int colone, int ligne);

  13. #13
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut
    Maintenant, mon problème ce résume à : Comment transformer un type, (quelle qu'il soit) en un string.

  14. #14
    Membre éclairé

    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Août 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 33
    Par défaut
    ahhhh c'était pour un tableauuuu !!

    Bah dans ce cas tu utilise "snprintf" pour écrire tes cases, grâce à sa valeur de retour tu sais si tu dois rajouter des espaces après ou pas

    Citation Envoyé par ilys05 Voir le message
    Maintenant, mon problème ce résume à : Comment transformer un type, (quelle qu'il soit) en un string.
    Impossible sans que tu spécifie le format d'une façon ou d'une autre (toujours le même problème : par exemple entre un affichage en décimal, en héxa, en binaire, ou Dieu seul sait quoi encore, le compilateur ne peut pas deviner tout seul comment tu veux voir affiché tes entiers...si tant est qu'il arrive à retrouver qu'e c'est un entier ce qui, déjà, n'est pas gagné ).

    Pourquoi ne pas passer à ta fonction traceTab un argument supplémentaire qui contiendrait un tableau des types de chaque colonne ?

  15. #15
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut
    Si je sais que c'est un string, je n'ai même pas besoin d'utiliser snprintf. J'utilise un bête printf tout con mais avec les formats (%7.7s).
    Sinon ton idée est bonne. Je pourrait rajouté un paramètre (char *format).
    Ainsi pour le premier exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
        int id;
        char nom[20];
        char prenom[20];
    }tuple;
    J'enverrai : %d%s%s.
    Mais si vous pouvez me fournir une piste pour parser le tout, et faire le traitement.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut et comment fait va_arg ?
    J'ai un problème un peut semblable, et je voulais m'inspirer de ce que fait va_arg. Car va_arg prend 2 arguments, le premier une liste de type va_list et le deuxième est un type de donné et ça marche ... mais je n'arrive pas à savoir comment en cherchant j'ai vu que va_arg était une macro de __builtin_va_arg() mais rien de plus j'aimerai savoir quel est le prototype de cette fonction et surtout quel est le type du deuxième argument (dans le man de va_arg c'est type mais ça veut rien dire) et comment il est utilisé dans la fonction. Si vous avez des pistes ...
    Désolé je n'ai pas répondu à la question de départ et peut être même embrouillé un peu plus les choses

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ilys05 Voir le message
    comment puis je faire en sorte que l'argument d'une fonction soit n'importe quelle variable
    Il faut utiliser un pointeur sur un type non défini : void * (ou void const * si tu ne modifies pas les données). C'est le principe de memcpy().
    , et puis enfin comment savoir le type de cette variable?
    Ca, par contre, ce n'est pas possible. C'est le prix à payer pour avoir la généricité que tu semble rechercher. Si l'information est nécessaire, il faut déléguer une partie du traitement à l'utilisateur via une fonction de callback (principe de qsort(), bsearch() etc.)

    Ca répond exactement au problème posé par http://www.developpez.net/forums/sho...32&postcount=8

    Sinon, on peut utilser des macros pour générer automatiquement le code en fonction du type... C'est assez complexe, surtout au niveau de la mise au point...

    Mais le vrai problème est le choix de champs fixes, qui plombent ta conception. Dans le réalité tout est programmable, dynamique, souple, et on a toutes les informations qui vont bien pour réaliser ce que tu fais. Évidemment, le codage est un peu plus complexe, mais ça reste abordable. Si il s'agit de code industriel, le mieux est d'utiliser un vraie base de donnée (SQL etc.) qui dispose en général des outils nécessaires pour réaliser proprement des 'états'.

  18. #18
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sahilber Voir le message
    J'ai un problème un peut semblable,
    Merci de ne pas squatter un sujet
    • c'est impoli
    • c'est inefficace

    Le principe est de créer une discussion par question.

    Fais le vite avant que j'efface ton message.

Discussions similaires

  1. Comment surcharger (hook) n'importe quelle API windows ?
    Par RazielReaver dans le forum API, COM et SDKs
    Réponses: 12
    Dernier message: 05/07/2020, 18h41
  2. [Tableaux] import de variable
    Par nemo69500 dans le forum Langage
    Réponses: 2
    Dernier message: 04/05/2006, 16h34
  3. Réponses: 8
    Dernier message: 25/02/2006, 17h31
  4. Réponses: 7
    Dernier message: 23/01/2006, 11h53
  5. Imprimer un canvas sous n'importe quelle imprimante
    Par Bily.sdi dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/12/2005, 13h02

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