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 :

Tripler les bits d'une chaine de données


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 5
    Par défaut Tripler les bits d'une chaine de données
    Bonjour,
    je souhaite réaliser une fonction qui triple les bits d'une chaine de données.
    Dans le cas de la chaine de données "10110101101" , la fonction produira donc la chaine de données "111000111111000111000111111000111".

    J'utilise la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct Donnees Donnees;
    struct Donnees
    {
      char donnees[256];     // une chaine de donnees
      unsigned int taille;      // taille de la chaine
    };
    et la fonction d'affichage suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void afficherDonnees(const Donnees * donnees)
    {
        unsigned int k;
        for (k =0 ; k < donnees-> taille ; k++)
        {
            printf("%c",donnees->donnees[k]);
        }
    }
    exemple du main :

    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
     
    void test()
    {
        Donnees donnees = {"110010001011", 12};
        Donnees triple;
        encoderTriple(&triple, &donnees);
        printf("Chaine de donnees originale: ");
        afficherDonnees(&donnees);
        printf("\n\nApres codage 'triple bit': ");
        afficherDonnees(&triple);
    }
     
    int main(void)
    {
        test();
    }
    Je souhaite donc faire la fonction qui encode en triplant chaque bit de la chaine "source".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void encoderTriple(Donnees * resultat, const Donnees * donnees){
        unsigned int k,j,compt=0,longueur;
        resultat->taille = donnees->taille*3;
        for (k = 0 ; k < resultat->taille ; k++){
            resultat->donnees[k]='0';
        }
        for (k =0 ; k < donnees->taille ; k++){
            if(donnees->donnees[k]== '1'){
                ...
            }
        }
    }
    Comme je dois réutiliser ma fonction d'affichage, j'ai multiplié par 3 la taille du tableau résultat qui contient la nouvelle chaine avec tous les bits triplés.
    Mais je ne vois pas comment tripler chaque bit de la chaine de données source. J'ai pensé à remplir de 0 le nouveau tableau et ensuite traiter chaque triplet mais je sais pas comment faire cela . Des idées ?

  2. #2
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Ce que je ferais, à vue de nez, algo approximatif sans structure de contrôle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    chaine_res;
    i=0
    while(bit_lu=lire_bit_à_bit_la_chaîne_à_tripler){
      chaine_res[i]=bit_lu
      i++
      chaine_res[i]=bit_lu
      i++
      chaine_res[i]=bit_lu
      i++
    }
    Et on sort du while quand on arrive en fin de chaîne.
    Tu lis un bit, tu l'écris 3 fois en décalant le pointeur d'écriture et tu passes au suivant.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 5
    Par défaut
    Merci pour ta réponse ManusDei. Ça m'a bien aidé
    (Je m'excuse pour le temps de réponse.)

    Je donne l'adaptation pour les curieux.
    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
     
    void encoderTriple(Donnees * resultat, const Donnees * donnees)
    {
        unsigned int k,j;
        int i=0;
        resultat->taille = donnees->taille*3;
        for( k = 0; k < donnees->taille; k++)
        {
            for( j= 0; j < resultat->taille; j++)
                resultat->donnees[i]= donnees->donnees[k];
                i++;
                resultat->donnees[i]= donnees->donnees[k];
                i++;
                resultat->donnees[i]= donnees->donnees[k];
                i++;
            }
    }

  4. #4
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    De rien

    La boucle sur j me semble bizarre, tu ne fais pas un débordement de tableau ?
    Sur le dernier passage de boucle, j donne la valeur max du tableau résultat, et i égale à peu près 3j, donc on est en dehors du tableau.

    Pour cette boucle j'aurais plutôt utilisé une boucle while d'ailleurs.

    Est-ce que en fin de tes chaînes de caractère tu rajoutes le caractère '\n' ? (caractère de fin de ligne)
    C'est un standard de l'utilisation de tableaux de caractères, ça évite les débordements, et ça sert de cas d'arrêt pour les boucles.
    Comme ça tu n'as plus besoin de retenir la taille de la chaîne (même si c'est souvent plus simple que de la recalculer).

    Edit : Fais un printf avec les valeurs de j et de i à la fin de chaque passage de la boucle for, ça devrait permettre de trancher rapidement.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 5
    Par défaut
    J'ai fais ce que tu as demandé et effectivement il y a un petit soucis vu qu'au premier tour de la boucle for , i vaut 3 et j vaut 36. Et ensuite , j bouge pas et i atteint j au dernier tour de boucle.

  6. #6
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Tu peux copier/coller le code modifié ?
    Je n'arrive pas à comprendre comment tu peux avoir un tel résultat.

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. les images dans une base de données
    Par houhou dans le forum Bases de données
    Réponses: 8
    Dernier message: 22/06/2004, 14h27
  3. [langage] vérifier les caractères d'une chaîne
    Par perlaud dans le forum Langage
    Réponses: 2
    Dernier message: 24/05/2004, 16h43
  4. [langage] remplacer les caractères d'une chaine
    Par perlaud dans le forum Langage
    Réponses: 14
    Dernier message: 12/05/2004, 11h05
  5. [LG]Retirer les blancs dans une chaine
    Par Andy_24DB dans le forum Langage
    Réponses: 16
    Dernier message: 25/02/2004, 16h30

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