Rechercher : dans
Par :

[C] Aide concatener entiers et char dans tabl

Dernière réponse le 16 mar 2009 à 20:57:28 archim4ge, le 16 mar 2009 à 19:48:28 
 Signaler ce message aux modérateurs

Bonjour,

Je suis débutant en programmation C (MPLAB, compilateur CCS) et je reste bloqué sur le problème suivant :

But : Lire les données d'un port (D0-D7) d'un micro (PIC 18F4520) et coder la valeur sur 8bits afin de le transformer en caractère et l'envoyer par RS232.

A ce jour : J'ai un tableau de test de ce genre :

unsigned char tab_test[];
tab_test[0] = 0bXXXXXXXX; ou X représente soit 0 ou 1
tab_test[1] = 0bXXXXXXXX;
etc...

Maintenant j'aimerai que les XXXXXXXX soit remplacés par la valaur de D0,D1,D2,D3,D4,D5,D6,D7 de mon port D.

Avec mon tableau de test je reçoit bien les caractères correspondant au code initial mais dés que j'effectue des tentatives de concaténation avec "sprintf" ou autre le contenu de mon tableau ce retrouve changé.

Si j'écris :

printf("0b%d%d%d%d%d%d%d%d" , d0 , d1 , d2 , d3 , d4 , d5 , d6 , d7); j'obtiens bien "0bXXXXXXXX" dans l'hyperterminal avec XXXXXXXX dépendant de d0-d7. Sachant que d0-d7 sont des int que j'ai initialisé a 0 ou 1 aléatoirement. Mais dés que je veux stocker ce 0bXXXXXXXX dans un tableau le contenu est transformé en fonction du type de tableau (enfin je crois que c'est ce qu'il se passe).

Donc si quelqu'un peut m'aider a mettre en forme mes bits D0-D7 ou me suggérer une autre méthode plus simple je lui en serais très reconnaissant :)

En tout cas merci d'avoir lu mon message et si j'ai pas été claire et compréhensible veuillez m'en excuser et je ferai de mon mieux pour répondre a vos questions.

Cordialement

Un jeune étudiant en détresse :)

Meilleures réponses pour « [C] Aide concatener entiers et char dans tabl » dans :
Manipuler des entiers en 64 bits VoirManipuler des entiers en 64 bits En C, un entier traditionnel non signé sur 32 bits ne peut pas dépasser la valeur de 4 294 967 295. Il se peut que vous soyiez amenés à manipuler des nombres plus grands et pour celà vous aurez besoin des entiers...
Vérifier si un nombre entier est un nombre premier en C VoirDéfinition nombre premier Algorithme 1 : les diviseurs compris entre 2 et N-1 seront testés Algorithme 2 : les diviseurs pairs ne seront pas testés, la recherche se limitant aux diviseurs impairs Algorithme 3 : les diviseurs impairs jusqu'à la...
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
Télécharger NetBeans IDE 6.1 VoirNetBeans IDE 6.1 est un excellent IDE de développement C/C++ écrit entièrement en Java. La coloration syntaxique, le "Code Completion" et plein d'autres options font naturellement parti de NetBeans. Un des principal atout de NetBeans est qu'il...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Langage C - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans...
Langage C++ - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C++ sont typées, c'est-à-dire que les données contenues dans...

1

Wardog, le 16 mar 2009 à 20:19:53

Bonsoir,

Bon j'ai pas tout pigé mais je vais tenter de t'aider.


En gros tu as des int de D0 à D7 à 0 ou 1.

Tu veux récupérer la valeur et la mettre dans ton tableau.
Voici un exemple avec 00101010:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main()
{
    unsigned char tab_test[3];
    tab_test[0] = 0;
    tab_test[1] = 0;

    //(bin)00101010 = (dec)42 dans tab_test[0]
    int d0 = 0;
    int d1 = 0;
    int d2 = 1;
    int d3 = 0;
    int d4 = 1;
    int d5 = 0;
    int d6 = 1;
    int d7 = 0;
    
    //conversion binaire à decimale
    tab_test[0] = pow(2,7) * d0 + pow(2,6) * d1 + pow(2,5) * d2 + pow(2,4) * d3 + pow(2,3) * d4 + pow(2,2) * d5 + pow(2,1) * d6 + pow(2,0) * d7;

    //on affiche
    printf("%d", tab_test[0]);
    return (0);
}


<(O_o)>

Répondre à Wardog

2

mamiemando, le 16 mar 2009 à 20:43:34

Ce n'est pas du tout la bonne méthode. Supposons que d0 à d7 soit des entiers (ou des booléens) allant de 0 à 1. Ce qui nous intéresse c'est le bit de poids faible. Un entier étant codé sur 32 bits voici comment garantir qu'on a juste éventuellement le bit de poids faible à 1 tu peux éventuellement appliquer un masque & avec 1.

#include <stdio.h>

#define N 8

int main(){
    int d[N];
    unsigned i;
    int res = 0;
    d[0] = 1; // poids faible
    d[1] = 0;
    d[2] = 1;
    d[3] = 0;
    d[4] = 0;
    d[5] = 1;
    d[6] = 0;
    d[7] = 0;
    d[8] = 1; // poids fort

    // garantir que seul le but de poids faible vaut 1 = 0x0001
    // (ici c'est superflu car les d[i] valent 0 ou 1)
    for(i=0;i<N;++i) d[i] &= 1;

    // afficher d (en partant du bit de poids fort)
    for(i=0;i<N;++i) printf("%d",d[N-i-1]);
    printf("\n");

    // construire le résultat (c'est le passage qui t'intéresse)
    for(i=0;i<N;++i) res |= d[i] << i;
    printf("res = %x\n",res);
    return 0;
}

Ici le morceau de code qui t'intéresse c'est d[i] << i qui consiste à décaler la valeur de d[i] de i bits vers la gauche (en particulier le bit de poids faible, qui est de toute façon le seul qui nous intéresse). On fait le ou logique (opérateur |) de tous ces bits pour reconstituer res. Je ne sais pas si tu es familier des masques mais "x |= y" signifie "x = x | y" et "x &= y" signifie "x = x & y".

Bonne chance

Répondre à mamiemando

3

archim4ge, le 16 mar 2009 à 20:48:59

Ouiiiiii !!! J'ai essaié la methode de wardog et ca marche et la je viens de voir ton message mamiemando donc je vais étudier les deux et voir ce qui me va le mieux!!!

En tout cas merci infiniment, je vais pouvoir avancer cette nuit :)

Répondre à archim4ge

4

 mamiemando, le 16 mar 2009 à 20:57:28
  • +1

Les deux marche mais celui de wardog requiert de compiler avec <math.h> (option -lm à la compilation) et est beaucoup plus coûteux d'un point de vue calcul, mais présente l'avantage d'être plus naturelle.Si c'est juste un tout petit programme on s'en fout.

Mais si cette fonction doit être appelée souvent la méthode qui consiste à manipuler des champs de bits (sans mauvais jeu de mot) est beaucoup plus efficace.

Bonne chance

Répondre à mamiemando
Collection CommentÇaMarche.net