C : Pointeurs, chaines de caractères et affichage
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

C : Pointeurs, chaines de caractères et affichage



  1. #1
    invitef1d0ad93

    C : Pointeurs, chaines de caractères et affichage


    ------

    Bonjour!

    Pour afficher à l'écran successivement différentes chaînes de caractères, le sprintf étant placé dans une boucle for (l'itération se fait sur j), le tout en langage C, j'emploie la technique suivante :

    //Initialisation de deux pointeurs vers des chaînes de caractères :

    char** eqType = NULL;
    char** eqValue = NULL;

    (la syntaxe convient? le compilateur me met des warnings, mais je ne sais pas comment formuler autrement)

    //Initialisation des chaînes de cractères à afficher ultérieurement dans le code

    char eqType1[] = "Eq off ";
    char eqType2[] = "Genre ";
    char eqType3[] = "3-bands";
    char eqDefault[] = "error ";
    char eqValue1[] = "N/A ";
    char eqValue2[] = "Normal ";
    char eqValue3[] = "Classic";
    char eqValue4[] = "Rock ";
    char eqValue5[] = "Pop ";
    char eqValue6[] = "7 0 -7 ";
    char eqValue7[] = "-7 0 7 ";
    char eqValue8[] = "7 -7 0 ";
    char eqValue9[] = "-7 7 0 ";
    char eqValue10[] = "0 7 -7 ";
    char eqValue11[] = "0 -7 7 ";

    //Case sur les pointeurs de chaînes de caractères eqType et eqValue pour les assigner à la bonne adresse selon la position dans la boucle for

    switch (j)
    {
    case 0:
    eqType = &eqType1;
    eqValue = &eqValue1;
    break;
    case 1:
    eqType = &eqType2;
    eqValue = &eqValue2;
    break;
    case 2:
    eqType = &eqType2;
    eqValue = &eqValue3;
    break;
    case 3:
    eqType = &eqType2;
    eqValue = &eqValue4;
    break;
    case 4:
    eqType = &eqType2;
    eqValue = &eqValue5;
    break;
    case 5:
    eqType = &eqType3;
    eqValue = &eqValue6;
    break;
    case 6:
    eqType = &eqType3;
    eqValue = &eqValue7;
    break;
    case 7:
    eqType = &eqType3;
    eqValue = &eqValue8;
    break;
    case 8:
    eqType = &eqType3;
    eqValue = &eqValue9;
    break;
    case 9:
    eqType = &eqType3;
    eqValue = &eqValue10;
    break;
    case 10:
    eqType = &eqType3;
    eqValue = &eqValue11;
    break;
    default:
    eqType = &eqDefault;
    eqValue = &eqDefault;
    break;


    }

    //Affichage via une instruction sprintf

    sprintf(s, "%s\t%s\t%d\t%f\t%f\t%f\t%f\n" , *eqType, *eqValue, (int) AudioFreq[i], rmsAnaAudioLevel_L[l], rmsAnaAudioLevel_R[l], rmsDigAudioLevel_L[l], rmsDigAudioLevel_R[l]);


    Le code compile, me met les warnings suivants :

    'char **' differs in levels of indirection from 'char (*)[8]'

    Et à l''exécution je reçois des exceptions. En employant des breakpoints pour voir où se situe le problème, il semblerait que les pointeurs eqType et eqValue ne s'assignent pas correctement dans le switch (en allant voir leur valeur, j'obtiens <BadPtr> à la place). Est-ce qu'il faut les déclarer différement? Est-ce qu'il y aurait une autre méthode pour faire la même chose (j'ai essayé, sans succès en utilisant un tableau de caractères à deux dimensions, dans le but de l'afficher ligne par ligne selon la valeur de j et on ne peut pas réassigner une chaîne de caractères)?

    Merci beaucoup!

    Couleurs changées : le vert est réservé à la modération.
    JPL

    -----
    Dernière modification par JPL ; 14/08/2008 à 00h47.

  2. #2
    invite8b867113

    Re : C : Pointeurs, chaines de caractères et affichage

    Un tableau de chaines, c'est quand même beaucoup moins... beaucoup plus joli
    Code:
    #define TYPE_NUMBER 3
    char *acType[TYPE_NUMBER]={"Eq off","Genre","3-bands"};

  3. #3
    invite4ad25ccf

    Re : C : Pointeurs, chaines de caractères et affichage

    Perso, je préfére les tableau de structure, c'est plus "propre" d'accès qu'un tableau dont chaque colonne à une signification précise.

    Code:
    typedef struct
    {
            char * type;
            char * value;
    }my_data;
    
    
    int main(char *argc, char **argv)
    {
            my_data datas[2] = 
            {
                { "TYPE_1",    "VALUE_1"},
                { "TYPE_2",    "VALUE_2"}
            };
    
            printf("%s - %s\n", datas[1].type, datas[0].value);
            return 0;
    }
    Et comme le C est très souple, cette structure, tu peux la considérer comme un tableau pour la remplir. Perso, je trouve que ca donne un code beaucoup plus lisible

    Ce code va afficher "TYPE_2 - VALUE_1"



    char** eqValue = NULL;

    (la syntaxe convient? le compilateur me met des warnings, mais je ne sais pas comment formuler autrement)
    Le problème vient du casting : NULL est un pointeur, eqValue un pointeur de chaine de caractère. Pour faire cette assignation proprement sans Warning : "char** eqValue = (char *)NULL;"

  4. #4
    invitef1d0ad93

    Re : C : Pointeurs, chaines de caractères et affichage

    Super, ca marche

  5. A voir en vidéo sur Futura

Discussions similaires

  1. chaines de caracteres avec mikroC
    Par invite2d9e7c03 dans le forum Électronique
    Réponses: 21
    Dernier message: 07/08/2008, 08h46
  2. Analyse de chaines de caracteres (VB ?)
    Par JLB29 dans le forum Logiciel - Software - Open Source
    Réponses: 11
    Dernier message: 13/10/2007, 10h13
  3. affichage de caractères spéciaux
    Par invite97642ab3 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 27/05/2007, 17h41
  4. Chaines de caractères/passement de fonctions
    Par invite91a05f0b dans le forum Électronique
    Réponses: 3
    Dernier message: 12/07/2006, 08h06
  5. [Moniteur lcd]Probleme affichage caractéres en DVI...
    Par invite58238e9a dans le forum Matériel - Hardware
    Réponses: 0
    Dernier message: 03/07/2006, 15h54
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...