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 :

Affichage de méta-caractères


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Affichage de méta-caractères
    Bonjour à tous
    j'ai un soucie avec une procédure devant m'afficher une structure crée au préalable, celle ci m'affiche toutes la structures sans problèmes mais lorsque qu'il doit afficher des chaines de caractere celle ci m'affiche des métacaractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ITEM *buildItem(int id, char *category,char *name, float prise)//construit un item
    {
        ITEM *a=malloc(sizeof(ITEM));
        a->id=id;
        a->name=name;
        a->category=category;
        a->price=prise;
        return a;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void printItem (ITEM *item)ma procédure qui affiche ma structure
    {
        printf("\n %d %s (%s) : %f \n", item->id,item->name, item->category, item->price);
        printf("%s",item->name);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct ITEMtag//voici ma structure a afficher
    {
    	int id;
    	char *name;
    	char *category;
    	float price;
    } ITEM;

    si je construit un item avec builditem et que je l'éxécute dans le main celle ci m'affichera 4 Ï#Ö (Ï#Ö) : 12.360000

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Comment gères-tu la durée de vie des chaînes de caractères que tu passes à tes objet ITEM?
    En fait, ne devrait-ce pas être à ces objets de gérer la durée de vie des chaînes de caractères qu'ils contiennent?
    (même aux prix d'une recopie; ne pas oublier, l'optimisation prématurée est la racine de tous les maux)

    Question subsidiaire: Ces chaînes sont-elles censées pouvoir être modifiées une fois l'ITEM construit?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    elles ne sont pas censé être modifier lors de leurs créations pour leur durée de vie je n'en ai aucune idée pour être honnête avec vous.
    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
     
    int main()
    {
     
     
     
        char*voiture=malloc(256*sizeof(char));//j'alloue dans mon main leurs espacements mémoires
        char *toto=malloc(256*sizeof(char));
        ITEM *test=buildItem(4,voiture,toto,12.36);
        printItem(test);
     
     
     
        return 0;
    }

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 562
    Points : 7 628
    Points
    7 628
    Par défaut
    Euh, dans l'exemple les chaines ne sont jamais remplies, elles seront donc affichées comme elles ont été remplies : aléatoirement.

  5. #5
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 294
    Points : 558
    Points
    558
    Par défaut
    TU dois utiliser strcpy dans la fonction buildItem pour copier name et category dans a->name et a->category car ce sont des chaines de caracteres...

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    mdr sincérement désolée a force de lire des lignes et des lignes de code je n'ai pas fait attention a ce détails merciii!!!!

  7. #7
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 294
    Points : 558
    Points
    558
    Par défaut
    et d'ailleurs aussi il aurait fallu les allouer toutes les deux dans buildItem avec malloc ou les declarer comme char name[256] par exemple, dans la structure ITEMtag

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    L'idéal, ce serait un truc de ce genre, avec constructeur et destructeur, plus les fonctions jouant le rôle de new et delete, gérant à la fois la mémoire et la construction/destruction:
    Code C : 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
    static void ITEM_constructor(ITEM* pThis, int id, char const *category, char const *name, float price)
    {
    	pThis->id = id;
    	pThis->name = strdup(name);
    	pThis->category = strdup(category);
    	pThis->price = price;
    }
     
    ITEM * ITEM_new(int id, char const *category, char const *name, float price)//construit un item
    {
    	ITEM *pThis = malloc(sizeof *pThis);
    	if(pThis != NULL)
    	{
    		ITEM_constructor(pThis, id, category, name, price);
    	}
    	return pThis;
    }
     
    static void ITEM_destructor(ITEM* pThis)
    {
    	free(pThis->name), pThis->name=NULL;
    	free(pThis->category), pThis->category=NULL;
    }
     
    void ITEM_delete(ITEM* pThis)
    {
    	if(pThis != NULL)
    	{
    		ITEM_destructor(pThis);
    		free(pThis);
    	}
    }
    Ainsi, tant qu'on crée les ITEM uniquement par ITEM_new() et qu'on les détruit uniquement par ITEM_delete(), la durée de vie des chaînes de caractères dans l'objet est correctement gérée.

    PS: Si tu n'as pas de strdup() sur la plate-forme que tu utilises (c'est une fonction POSIX plutôt qu'une fonction du C standard), elle est facile à implémenter:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char* strdup(char const *src)
    {
    	size_t lengthInChars = strlen(src);
    	size_t sizeInChars = lengthInChars + 1;
    	char* ret = calloc(sizeInChars, sizeof *ret);
    	if(ret != NULL)
    	{
    		memcpy(ret, src, sizeInChars * sizeof *ret);
    	}
    	return ret;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci pour votre aide je vais tenter les modifications et voir les résultats

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Non affichage du 1er caractère structure record
    Par zano42 dans le forum Langage
    Réponses: 11
    Dernier message: 03/12/2009, 17h22
  2. Réponses: 5
    Dernier message: 18/03/2009, 01h56
  3. Somme de deux registres / affichage d'un caractère
    Par thouraya24 dans le forum x86 16-bits
    Réponses: 0
    Dernier message: 13/02/2009, 15h00
  4. Affichage chaîne de caractère
    Par log2n dans le forum Assembleur
    Réponses: 1
    Dernier message: 25/10/2005, 23h41
  5. Réponses: 6
    Dernier message: 19/10/2004, 14h46

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