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 :

sprintf dans structure


Sujet :

C

  1. #1
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut sprintf dans structure
    Bonjour,

    j'ai un petit problème avec mon programme.
    J'ai une fonction qui prend en entrée un int, à partir de cet int je créé une chaîne (t + l'int).
    Jusque là pas de problème, j'affiche un résultat correct avec le printf.

    Par contre, quand je veux rentrer cette chaîne dans le champ identificateur de ma structure Objet, ça ne marche pas, j'ai un seg fault.

    J'imagine que c'est un problème de pointeur mal fait, mais je ne trouve pas la solution.

    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
     
    struct Objet{
    	char identificateur[3];
    	char objet_content[127];
    };
    typedef struct Objet Objet;
     
    int threadProd(int num){
    	int period=100; /* en millisecondes */
    	char type_objet[3];
    	char* trame;
    	Objet* info; 
    	char* num2;
     
    	sprintf(type_objet,"t%d\0",num);
    	printf("%s\n",type_objet);
    	sprintf(info->identificateur),"%s",type_objet);
    	printf("%s\n and pid = %d\n",info->identificateur,getpid());
    	sprintf(info->objet_content,"25\0");
     
    	sprintf(trame,"%s%s",info->identificateur,info->objet_content);
    	printf("valeur copiee %s\n",trame);
    //	write(fd[num][1],trame,4);
    //	sleep(period);
     
    	printf("valeur copiee %s\n",trame);
    	return 0;
    }

    Merci pour votre aide.

    Edit : Si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(info->identificateur,"%s",type_objet);
    en commentaire, le printf suivant s'affiche et j'ai le seg fault après. Donc mon bug viendrait plus tard.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    On va oublier la faute de frappe dans sprintf (sinon ça compilerait pas, je pense).
    Tu ne nous as pas tout mis, j'espère !!!
    Je ne vois pas les malloc !!!
    Et num fait 1 chiffre ?

  3. #3
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Oui, num fait un chiffre, et j'avais oublié le malloc (la honte).
    Je met le code complet en dessous.
    L'idée de base est simple, j'ai un thread "père" qui va créer des fils, ceux-ci vont envoyer une information via un pipe au père, num sert à différencier les fils (et je ne peux pas utiliser le pid pour ça).

    Sauf que pour l'instant, j'ai du mal à créer ma chaîne de caractères à mettre dans le pipe (à terme le père envoie le tout sur le réseau, donc je commence à rassembler toute l'information sur un char*).
    Pour l'instant la partie pipe est en commentaire, je m'en occuperais quand je construirais mon char* correctement.


    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    struct Objet{
    	char identificateur[3];
    	char objet_content[127];
    };
    typedef struct Objet Objet;
     
    #define PROCESS		10
     
    int threadProd(int num){
    	int period=100; /* en millisecondes */
    	char type_objet[3];
    	char* trame;
    	Objet* info = malloc(sizeof(struct Objet)); 
    	char* num2;
     
    	sprintf(type_objet,"t%d\0",num);
    	printf("%s\n",type_objet);
    	sprintf(info->identificateur,"%s",type_objet);
    //	strcpy(info->identificateur,type_objet);
     
    	printf("%s and pid = %d\n",info->identificateur,getpid());
    	sprintf(info->objet_content,"25\0");
     
    	sprintf(trame,"%s%s",info->identificateur,info->objet_content);
    	printf("valeur copiee %s\n",trame);
    //	write(fd[num][1],trame,4);
    //	sleep(period);
     
    	printf("valeur copiee %s\n",trame);
    	return 0;
    }
     
    int main()
    {
        pid_t pid;
     
        for(int i=0;i<PROCESS;i++)
        	pipe(fd[PROCESS]);
     
    	//printf("coucou\n");	
    	while (process < PROCESS) {
     		pid = fork();
     
     		// Erreur à la creation du fils
    		if (pid < 0) {
    			perror("fork");
    			exit(EXIT_FAILURE); 
    		}
    		// Execution du Producteur
    		else if (!pid) {
    			pid = getpid();
    			//printf("fils cree\n");
    			close(fd[process][0]);
    			threadProd(process);
    			exit(EXIT_SUCCESS);
    		}
     
    		++process;
     
    	}
     
    	// execution du Producteur couche MAC
    	for(int i=0;i<PROCESS;i++){
    //		close(fd[PROCESS][1]);	
    //		threadMACProd();
    	}
     
     
     
    	return EXIT_SUCCESS;
    }
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Ton programme plante à quelle ligne ? La 18 ?

    Edit : et le malloc de trame, il est où ? (phi1981 m'a grillé )

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    alors je suis pas vraiment reveillé, mais je ne vois pas l'allocation d'un buffer pour la trame avant la ligne 24 :
    sprintf(trame,"%s%s",info->identificateur,info->objet_content);

    du coup, sprintf va écrire n'importe où.

    et sinon, l'idée de mettre des \0 à la fin de tes chaines de caractères, c'est quoi le but ??? parce que si c'est juste pour insérer un 0 à la fin, le compilateur le fait très bien.

  6. #6
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Je me suis un peu emballé (c'est mal de s'énerver tout seul devant sa machine ).

    Alors, là je n'ai plus de seg fault, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("valeur copiee %s\n",trame);
    ne s'affiche pas (ligne 24-25 sur le post précédent), donc j'ignore ce que j'ai dans mon char* trame.

    Merci pour votre aide.

    Edit : je teste avec un malloc pour le char* trame, mais pourquoi un malloc pour ça ? le \0 n'était pas là au début, mais à force de tenter de trouver des solutions... il est arrivé

    Edit2: avec le malloc sur trame ça fonctionne, merci. Pourquoi ?
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Citation Envoyé par ManusDei Voir le message
    Edit : je teste avec un malloc pour le char* trame, mais pourquoi un malloc pour ça ? l
    Tu déclares un char*, donc il faut l'allouer.

    Au fait, quelle est la cible de ton programme ? Il me semble que j'avais vu dans le forum emploi que tu fais des études dans l'embarqué. Il me semble que les allocations dynamiques ne sont pas conseillées dans ce domaine.

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    La grande question c'est plutôt "pourquoi ça marcherait sans malloc ?".
    Le pauvre sprintf ne fait rien de très intelligent : il compose dans un buffer une chaine de caractère suivant un format que tu lui as passé en paramètre.
    Le problème, c'est que lorsque tu déclares juste char *trame sur la pile comme tu l'as fait, trame vaut n'importe quoi (je suis étonné que ton compilateur ne t'ai pas grondé d'ailleurs).
    du coup sprintf, bête mais discipliné, va composer ta chaine n'importe où en mémoire.
    quand tu as de la chance, ça plante. quand tu n'as pas de chance, ça modifie qqchose d'autre et ça cause un bug très difficile à repérer.

    Edit : Grillé par mala92

  9. #9
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Citation Envoyé par mala92 Voir le message
    Au fait, quelle est la cible de ton programme ? Il me semble que j'avais vu dans le forum emploi que tu fais des études dans l'embarqué. Il me semble que les allocations dynamiques ne sont pas conseillées dans ce domaine.
    C'est pour le cours de réseau, avec le protocole WorldFIP (donc pas directement de l'embarqué).

    Pourtant, je n'alloue par toujours les char*. Je ne dirais pas que c'est la première fois, mais probablement pas loin.
    Et il me semble que ça marchait (ça fait un moment que je n'avais pas fait de manipulation de char* en C).
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

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

Discussions similaires

  1. pb fonction date dans structure tm
    Par sandra771 dans le forum C
    Réponses: 12
    Dernier message: 28/11/2006, 15h33
  2. Insérer données dans structure différente
    Par guigui11 dans le forum Access
    Réponses: 2
    Dernier message: 18/09/2006, 16h31
  3. Allocation dynamique tableau dans structure
    Par chental dans le forum C
    Réponses: 2
    Dernier message: 03/08/2006, 09h03
  4. rechercher de point dans structure
    Par cool17 dans le forum C
    Réponses: 6
    Dernier message: 13/04/2006, 00h19
  5. initialisation chaine de caracteres dans structure
    Par mrttlemonde dans le forum C
    Réponses: 2
    Dernier message: 08/04/2006, 18h07

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