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 :

Mettre la taille d'un tableau a zero dans une boucle


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Mettre la taille d'un tableau a zero dans une boucle
    Bonjour
    Je souhaite mettre la taille de mon tableau à zero alors que je suis en pleine boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    char mdc[100]="0";
    char exit[4]="exit";
    while(1)
    {
            if(strcmp(mdc,exit)==0)
            {break;}
     
            read(fdaccept,mdc,sizeof(mdc));
            printf("Message recu du client:%s \n",mdc);
            memset(mdc,'\0',sizeof(mdc));
    }
    J'ai reussi a initialiser tout les caracteres du tableau lors de la declaration et avec le memset.
    Mais je souhaite mettre la taille de mon tableau à zero.
    Fonctionnement de mon prog:
    - Il compare mdc(="0") avec exit(="exit")
    - Si mdc == exit on sort de la boucle
    - Sinon on lit les données recus, on les affiches et on remet à zero les champs du tableau

    Le probleme:
    - si mdc ="banane"
    - si mdc ="exit"
    je ne peux pas sortir de ma boucle
    car mdc != exit
    Je suppose que le prog l'interprete comme cela:
    si mdc ="banane" -> mdc = "banane"
    si mdc ="exit" -> mdc ="exitne" ou mdc="exit\0\0"
    Voilà pourquoi je souhaite reduire la taille de mon tableau ou s'il ya une autre solution je suis ouvert.
    Je vous remercie d'avoir lu entierement ce poste.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    si mdc ="banane" -> mdc = "banane"
    si mdc ="exit" -> mdc ="exitne" ou mdc="exit\0\0"
    Ce sera "exit\0..." puisque le tampon a été préalablement rempli par des 0 par memset(). Or comme le strcmp() n'ira pas plus loin que le premier '\0' pour la comparaison, cela ne devrait pas poser de problèmes.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Enfaite ça ne marche pas... justement :o
    J'ai testé mon code avant d'avoir posté quand meme.
    Ça ne fonctionne pas.
    Merci quand même.

    Edit: Je viens de tester en envoyant cette fois des le debut exit et rien ne se passe.
    Une erreur au niveau du if ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char mdc[100]="0";
    
    if(strcmp(mdc,exit)==0)
            {break;}
    
            else{
    
            read(fdaccept,mdc,sizeof(mdc));                   //mdc="exit"
            printf("Message recu du client:%s \n",mdc);
            memset(mdc,'\0',sizeof(mdc));
            }

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hoa,

    Déjà, quand je vois ceci :
    4 caractères réservés pour un mot qui en fait 5, sans oublier le zéro terminal nécessaire, ce qui nous amène à 6 caractères, je ne vais pas plus loin dans la lecture.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    J'ai modifié comme me la proposé droggo, rien a faire ça ne fonctionne pas.
    Juste droggo tu me dis de mettre à 6, je ne vois pas pourquoi.
    char exit[4]="exit"

    exit[0]=e
    exit[1]=x
    exit[2]=i
    exit[3]=t
    exit[4]=\0

    Peux tu m'indiquer mon erreur stp?

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Joe,

    Parce que tu débordes de la mémoire réservée, d'où comportement indéfini.
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Je ne comprends pas bien à quel moment je déborde de la mémoire pourrais tu m'expliquer plus en detail et même en mettant à 6 mon tableau, le probleme reste toujours le même.
    Merci d'avoir répondu.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonjour,

    Citation Envoyé par darktimide Voir le message
    Je ne comprends pas bien à quel moment je déborde de la mémoire pourrais tu m'expliquer plus en detail
    Quand tu écris exit[4], tu réserves de la place pour quatre caractères uniquement, numérotés de 0 … à 3 ! Si tu inclus le zéro final au rang 4, cela fait bien cinq caractères en tout et non quatre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    exit[0]='e';   // Premier caractère 
    exit[1]='x';   // Second caractère
    exit[2]='i';   // Troisième caractère
    exit[3]='t';   // Quatrième caractère
    exit[4]='\0';  // Cinquième caractère

    et même en mettant à 6 mon tableau le probleme reste toujours le même.
    Merci d'avoir répondu.
    En mettant ton tableau à 6, ça devrait fonctionner, sauf si l'émetteur n'envoie pas le zéro final… ce qui est probable si tu utilises « strlen() » pour mesurer la taille de la chaîne à envoyer.

    Sinon, dans un cas comme dans l'autre, il te manque le terminateur : soit parce que tu as déclaré exit[4] et qu'il n'y plus de place pour lui, soit parce que l'émetteur ne l'a pas transmis avec la chaîne. Donc, strcmp va pour ainsi dire toujours échouer puisque la comparaison va impliquer ce qui ce trouve après, ce qui est indéfini par définition.

    En particulier, dans le premier cas, même si l'émetteur envoie proprement « exit » suivi de son zéro, le test échouera quand même parce que cette chaîne sera inférieure à « exit » suivi de caractères non-nuls qui erreraient en mémoire.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour ta réponse,

    Au final j'ai trouvé le probleme, c'était par rapport au memset qui était mal placé dans la boucle, j'ai aussi en meme temps enlevé le tableau exit et je compare directement mon tableau mdc à la chaine de caratere "exit":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while(1)
    {
     
            if((strcmp(mdc,"exit"))==0)
            {printf("fin");break;}
     
            else
    {
            memset(mdc,'\0',sizeof(mdc));
            read(fdaccept,mdc,sizeof(mdc));
            printf("Message recu du client:%s \n",mdc);
     
    }
    }

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par darktimide Voir le message
    Merci beaucoup pour ta réponse,

    Au final j'ai trouvé le probleme,
    C'est gentil de penser à poster ta solution et à remercier les intervenants, mais il faut que tu lises ces réponses quand même parce que c'est la deuxième fois que tu passes à côté de la cause réelle de tes bugs (l'autre étant ici).

    • Ton tableau « exit » est mal dimensionné. La chaîne écrite en dur fonctionnera toujours, certes. Mais ça ne fait que contourner le problème sans le résoudre ;
    • Tu ne lis pas le code de retour de read() ;
    • On ne sait pas comment est écrit le programme de l'émetteur.


    A contrario, le memset() placé là où il l'est n'empêche pas du tout ton programme de fonctionner.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Il est vrai que dès que j'ai trouvé la solution je n'ai pas lus les réponses avec attention,
    Pour le read il est vrai que je dois vérifier le code retourné.
    J'aurais sûrement dû donner des précisions sur les données reçues par le read et des indications sur le fonctionnement du programme émetteur ><'.
    Merci beaucoup encore.

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

Discussions similaires

  1. Tableau en php dans une boucle
    Par m0h4m3d dans le forum Langage
    Réponses: 5
    Dernier message: 28/12/2014, 15h30
  2. Réponses: 9
    Dernier message: 17/07/2013, 10h06
  3. affecter un tableau à un autre dans une boucle
    Par gastoncs dans le forum VB.NET
    Réponses: 1
    Dernier message: 24/11/2011, 10h56
  4. Récuperer la taille d'un clip généré dynamiquement dans une boucle
    Par finalfx dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 20/03/2008, 22h35
  5. Récupérer la taille d'un tableau (edit : et d'une iframe)
    Par Prue dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/08/2005, 15h54

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