chaines de caracteres avec mikroC
Répondre à la discussion
Affichage des résultats 1 à 22 sur 22

chaines de caracteres avec mikroC



  1. #1
    invite2d9e7c03

    chaines de caracteres avec mikroC


    ------

    Salut,

    j'ai déclaré une matrices de chaines de caractères dans mikroC comme suit

    Code:
    char menu[4] [4] ;
    en suite j'ai défini chaque case

    Code:
    menu[0][0]="A";
    menu[0][1]="Aa";
    menu[0][2]="Ab";
    menu[0][3]="Ac";
    menu[0][4]="Ad";
    ....etc
    mon problème est comment lire un caractère d'un chaine par exemple le premier caractère de menu[0][2]
    je suppose que c'est

    Code:
    menu[0][1][1]
    mais lorsque je compile il dit "internal error" et "pointer required" dans cette affectation:

    Code:
    char affichage[];
    affichage[1] = menu[i][j][1];
    ou est est le problème?
    pourtant il a accepté l'affectation affichage= menu[i][j]
    et que dans les exemples je trouve

    Code:
    char s1[] = "mikroElektronika";
    .....
    ch = s1[i];
    il faut peut être décrire un petit peu le projet : j'ai besoin d'un procédure qui reçoit une chaine de caractère de longueur entre 1 et 16 caractères et la repartit entre les deux lignes de l'afficheur(chaque 8 caractères sont considérés comme ligne)

    je vous remercie d'avance.

    -----

  2. #2
    invite74b5b8f7

    Re : chaines de caracteres avec mikroC

    Salut, Je croit que tu te mélange un peu, les variables menu[0][0], menu[0][1] (, etc...) sont des caractères donc ils ne peuvent contenir qu´une seule lettre.

    Par exemple: menu[0][1] = ´A´;

    Ce que tu as fait c´est un tableau de 4 lignes qui contiennent chacunes 4 caractères.

    Donc à mon avis, si tu veux utiliser 2 lignes de 8 caractères, il faut faire (par exemple):

    char menu[2][8];

    menu[0][] = "ligne 1"; // Comme ca tu peux définir une ligne avec une chaine de caractères (maximum 8 caracteres)
    menu[1][0] = ´A´ // Comme ca tu peux definir un seul caractère
    Et après pour lire un caractere (par exemple le A), c´est menu[1][0].

    Pour lire un caractere de la première ligne, tu peux faire pareil, dans ce cas, si tu fais par exemple menu[0][2] tu auras "g" (car la troisieme lettre de la chaine "ligne 1" est un "g")

  3. #3
    invite2d9e7c03

    Arrow Re : chaines de caracteres avec mikroC

    Bonjour,

    Merci pour la réponse

    Citation Envoyé par lil-vince Voir le message
    char menu[2][8];

    menu[0][] = "ligne 1"; // Comme ca tu peux définir une ligne avec une chaine de caractères (maximum 8 caracteres)
    menu[1][0] = ´A´ // Comme ca tu peux definir un seul caractère
    ca marche pas ...j'ai essayé

    Citation Envoyé par lil-vince Voir le message
    Salut, Je croit que tu te mélange un peu, les variables menu[0][0], menu[0][1] (, etc...) sont des caractères donc ils ne peuvent contenir qu´une seule lettre.

    Par exemple: menu[0][1] = ´A´;
    Je sais mais ... il a accepté menu[0][1] = ´aaaaa´; et même en l'affichant sur un lcd , il écrit la chaine entière. c'est pour cela j'ai posé la question.

    mais bon...
    je pense qu'un 16F877A n'est pas le bon uC pour déclarer une matrice de 22 chaines de 16 cracteres chacune...
    j'ai simplifié un peu le programme en séparant les chaines comme suit:

    Code:
    char menu1[3][15] = {
    {'C','l','i','m','a','t',},
    {'T','e','m','p','e','r','a','t','u','r','e',' ',' ',' ','°','C'},
    {'H','u','m','i','d','i','t','e',' ','s','o','l',' ',' ',' ','%'},
    {'L','u','m','i','n','o','s','i','t','e',' ',' ',' ',' ',' ','%'}
    };// ** 
    char menu2[5][15] = {
    {'E','l','e','c','t','r','o','v','a','n','n','e','s'},
    {'V','o','i','e','1'},
    {'V','o','i','e','2'},
    {'V','o','i','e','3'},
    {'V','o','i','e','4'},
    {'V','o','i','e','5'}
    };
    ...
    (il s'agit de gérer un système de menus à 2 niveaux)

    le compilateur dit "Too many initializers of subaggregate"
    et "Too many initializers"
    et "internal error" au niveaux du **

  4. #4
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    Probleme résolu:
    il faut mettre une étoile:
    char *menu[x][y]; pour qu'il comprend que c'est tabeau.
    @+

  5. A voir en vidéo sur Futura
  6. #5
    Seb.26

    Re : chaines de caracteres avec mikroC

    Citation Envoyé par amgab2003 Voir le message
    Probleme résolu:
    il faut mettre une étoile:
    char *menu[x][y]; pour qu'il comprend que c'est tabeau.
    @+
    Le * indique que l'on parle de pointeurs...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  7. #6
    invitee9dcae4d

    Re : chaines de caracteres avec mikroC

    Le "Too many initializers of subaggregate" me paraît assez évident.

    Tu définis un tableau de "3 lignes/15 colonnes" et tu définis 4 lignes et 16 colonnes...
    (idem dans tes 2 déclarations)

    Pourquoi se casser la tête à déclarer les chaînes de caractères comme tu le fais? En plus, ta syntaxe n'est pas tout à fait correcte.
    En effet, une chaîne de caractère doit se délimiter par le caractère '\0' (sentinelle); caractère de fin de ligne.

    Tu pourrais le faire plus simplement par : (par exemple)
    Code:
    char menu1[4][16] =
    {
      {"Climat"},
      {"Temperature  °C"},
      {"Humidite sol  %"},
      {"Luminosite    %"}
    };
    15 caractères + le '\0' à prendre en compte (ajouté automatiquement), ce qui donne 16.

    Tu peux aussi le faire par pointeur comme
    Code:
    char * menu1[4] = {"Climat", "Temperature  °C", "Humidite sol  %", "Luminosite    %"};

  8. #7
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    Bonjour,
    encore des soucis avec les chaines de caractères:
    Code:
     
    char ecran[];
    {
    char *menu1[] = {"Climat", "Temperature", "Humidite sol", "Lumlinosite"};
    char *menu2[] = {"Electrovannes", "Voie 1", "Voie 2", "Voie 3", "Voie 4","Voie 5"};
    char *menu3[] = {"Seuils", "Seuil Temp", "Seuil Humi", "Seuil Lumli"};
    char *menu4[] = {"Choix methode", "Automatique", "Cycle 1", "Cycle 2", "Cycle 3"};
    }
    ....
    switch (menu) {
    case 1: char ecran = menu1[i];
    case 2: char ecran = menu2[i];
    case 3: char ecran = menu3[i];
    case 4: char ecran = menu4[i];
    }
    le compilateur répond "assigning to non value []" (i est bien défini)

    j'ai aussi éssayé
    Code:
    case 1: char ecran[] = menu1[i];
    il répond dans ce cas invalid expression et internal error.

    Comment expliquer à mikroC

    merci d'avance

  9. #8
    Seb.26

    Re : chaines de caracteres avec mikroC

    Citation Envoyé par amgab2003 Voir le message
    Bonjour,
    encore des soucis avec les chaines de caractères:
    Tu m'étonne ...

    ... Juste une question : pourquoi donc vouloir en faire des tableaux de tes chaines de caractères ???
    ... Je vois pas trop ... il y a une relation entre les indices des chaines que tu nous cache ?

    PS: tu es sûr qu'il ne manque pas les break dans ton switch ?
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  10. #9
    Seb.26

    Re : chaines de caracteres avec mikroC

    Code:
    char ecran[];
    {
    char *menu1[] = {"Climat", "Temperature", "Humidite sol", "Lumlinosite"};
    char *menu2[] = {"Electrovannes", "Voie 1", "Voie 2", "Voie 3", "Voie 4","Voie 5"};
    char *menu3[] = {"Seuils", "Seuil Temp", "Seuil Humi", "Seuil Lumli"};
    char *menu4[] = {"Choix methode", "Automatique", "Cycle 1", "Cycle 2", "Cycle 3"};
    }
    ....
    switch (menu) {
    case 1: char ecran = menu1[i];
    case 2: char ecran = menu2[i];
    case 3: char ecran = menu3[i];
    case 4: char ecran = menu4[i];
    }


    Et si on reprenait depuis le début ?
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #10
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    Citation Envoyé par Seb.26 Voir le message
    Code:
    char ecran[];
    {
    char *menu1[] = {"Climat", "Temperature", "Humidite sol", "Lumlinosite"};
    char *menu2[] = {"Electrovannes", "Voie 1", "Voie 2", "Voie 3", "Voie 4","Voie 5"};
    char *menu3[] = {"Seuils", "Seuil Temp", "Seuil Humi", "Seuil Lumli"};
    char *menu4[] = {"Choix methode", "Automatique", "Cycle 1", "Cycle 2", "Cycle 3"};
    }
    ....
    switch (menu) {
    case 1: char ecran = menu1[i];
    case 2: char ecran = menu2[i];
    case 3: char ecran = menu3[i];
    case 4: char ecran = menu4[i];
    }


    Et si on reprenait depuis le début ?
    cette fois le problème ce n'est pas dans la déclaration c'est dans l'affectation!
    veuillez m'expliquer!
    ça fait seulement quelques semaines que j'ai passé au C

  12. #11
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    Citation Envoyé par Seb.26 Voir le message
    Tu m'étonne ...

    ... Juste une question : pourquoi donc vouloir en faire des tableaux de tes chaines de caractères ???
    ... Je vois pas trop ... il y a une relation entre les indices des chaines que tu nous cache ?
    J'ai un systeme de gestion de menu j'ai un routine pour mettre a jour l'affichage
    en cliquant sur le bouton DOWN je décrémente i
    en cliquant sur le bouton UP j'incrémente i
    en cliquant sur le bouton OK je j'accede au sou menu ainisi de suite
    j'affiche toujours à la fin menuj[i]

  13. #12
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    voici le syntaxe correct(d'un autre forum)

    char i;
    switch (menu) {
    case 1: ecran = menu1[i]; break;
    case 2: ecran = menu2[i]; break;
    case 3: ecran = menu3[i]; break;
    case 4: ecran = menu4[i]; break;
    }
    @+

  14. #13
    Seb.26

    Re : chaines de caracteres avec mikroC

    Citation Envoyé par amgab2003 Voir le message
    J'ai un systeme de gestion de menu j'ai un routine pour mettre a jour l'affichage
    en cliquant sur le bouton DOWN je décrémente i
    en cliquant sur le bouton UP j'incrémente i
    en cliquant sur le bouton OK je j'accede au sou menu ainisi de suite
    j'affiche toujours à la fin menuj[i]
    Ok, d'où l'utilité de mettre tes chaines dans un tableau

    NB: une liste chainée serait AMA plus adaptée car le problème d'un tableau, c'est que c'est carré ( ou cubique ) ... alors qu'un menu est plus un arbre qu'un carré ... mais c'est ton choix, alors faisons avec.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  15. #14
    Seb.26

    Re : chaines de caracteres avec mikroC

    Code:
    char i;
    char *ecran;
    
    switch (menu) {
    case 1:
     ecran = menu1[i];
     break;
    case 2:
     ecran = menu2[i];
     break;
    case 3:
     ecran = menu3[i];
     break;
    case 4:
     ecran = menu4[i];
     break;
    }
    Oui, ça semble déjà mieux !

    Tout est OK alors, ou tu as encore des soucis ?

    [Edit] plutôt qu'un switch, fait un tableau de tout tes menu1,menu2, et utilise 'menu' comme indice de ce tableau ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  16. #15
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    Citation Envoyé par Seb.26 Voir le message
    Ok, d'où l'utilité de mettre tes chaines dans un tableau

    NB: une liste chainée serait AMA plus adaptée car le problème d'un tableau, c'est que c'est carré ( ou cubique ) ... alors qu'un menu est plus un arbre qu'un carré ... mais c'est ton choix, alors faisons avec.
    c'est seulement pour faciliter l'affichage mais pour aussi editer le mesages de menus
    par exemple:

    char *menu1[] = {"Climat", "Temperature", "Humidite sol", "Lumlinosite"};

    après avoir lu la valeur de la température j'édite seulement deux caractères de la chaine menu1[1]

    Citation Envoyé par Seb.26 Voir le message
    NB: une liste chainée serait AMA plus adaptée car le problème d'un tableau, c'est que c'est carré ( ou cubique ) ... alors qu'un menu est plus un arbre qu'un carré ... mais c'est ton choix, alors faisons avec.
    comment une liste chainé? je connais pas ca.
    Si je trouve que c'est plus pratique je l'adopterai

    Citation Envoyé par Seb.26 Voir le message
    Tout est OK alors, ou tu as encore des soucis ?
    jusqu'à maintenant ca marche bien

    Citation Envoyé par Seb.26 Voir le message
    [Edit] plutôt qu'un switch, fait un tableau de tout tes menu1,menu2, et utilise 'menu' comme indice de ce tableau ...
    je ne comprend pas trop ce que tu veut dire... un tableau à 2 dimensions??

    Merci

  17. #16
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    ça avance bien grâce aux votre aide

    mais il y a quand même quelques petits problèmes:

    lorsque je compile il réussit mais avec quelques warnings:

    Code:
    char *menu1[] = {"Climat", "Temperature", "Humidite sol", "Lumlinosite"};
    char *menu2[] = {"Electrovannes", "Voie 1", "Voie 2", "Voie 3", "Voie 4","Voie 5"};
    char *menu3[] = {"Seuils", "Seuil Temp", "Seuil Humi", "Seuil Lumli"};
    char *menu4[] = {"Choix methode", "Automatique", "Cycle 1", "Cycle 2", "Cycle 3"};
    le compilateur répond:
    Const truncated: _menu4
    et lorsque j'essaie d'afficher menu4[i] (j'ai essayé avec i=0)
    il affiche "ie 2"
    je ne comprend pas !! (le RAM et le ROM sont assez libres)
    pourtant avec menu3 et 2 et 1 ca marche très bien
    Comment résoudre ça?
    merci d'avance

  18. #17
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    Bonsoir,
    ci dessous une réponse pour la meme question sur un autre forum(merci bruno)
    si il s'agit d'éléments de menus, il faut les placer en ROM en utilisant le modifieur const :

    Code:
    const char *menu1[] = {"Climat", "Temperature", "Humidite sol", "Lumlinosite"};
    sinon ils sont placés en RAM mais tronqués en raison du manque d'espace contigu pour former le tableau, ce qui explique le warning.

    le fait de les placer en ROM va cependant induire d'autres problèmes, car la plupart des fonctions de librairie utilisant des chaines sont prévues pour des chaines en RAM et non en ROM, il faudra donc les ré-écrire ou les encapsuler.
    je vois que c'est très logique ce qu'il a dit
    Mais lorsque j'ai essayé le compilateur dit au niveau de ces lignes:

    switch (menu) {
    case 1: ecran = menu1[i]; break;
    case 2: ecran = menu2[i]; break;
    case 3: ecran = menu3[i]; break;
    case 4: ecran = menu4[i]; break;
    }

    illigal pointer conversion:[?T30] to [ecran] (le même erreur sur chaque ligne)
    lorsque j'enleve les "const"s ca se compile (mais avec les warnings): ce que j'ai compris que le compilateur n'arrive pas à manipuler les constantes
    veuillez m'expliquer
    merci d'avance

  19. #18
    Seb.26

    Re : chaines de caracteres avec mikroC

    AMA : "const" indique que la variable est une constante ( donc en lecture seule ) ... pas que c'est en ROM ou en RAM ...
    Pour placer une constante en ROM, on utilise "rom".

    ex:

    Code:
    const rom char str_Hello[] = "Hello world !";
    Par contre, comme indiqué dans le post que tu mentionne, sur PIC un pointeur doit être typé en fonction de sa "cible" ( ROM / RAM ) :

    Code:
    // uChar = unsigned char
    void DriverLcd_WriteString( uChar line, uChar startPos, const uChar* string, uChar char_PreFill, uChar char_PostFill );
    void DriverLcd_WriteRomString( uChar line, uChar startPos, const rom uChar* string, uChar char_PreFill, uChar char_PostFill );
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  20. #19
    katmai

    Re : chaines de caracteres avec mikroC

    Salut,

    switch (menu) {
    case 1: ecran = menu1[i]; break;
    case 2: ecran = menu2[i]; break;
    case 3: ecran = menu3[i]; break;
    case 4: ecran = menu4[i]; break;
    }
    Je ne crois pas que tu aies le droit d'affecter des chaines de caractères comme ça.

    Voir ici (strcpy).

    A+

  21. #20
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    Merci pour vos réponses
    Je vois que ca va se compiliquer j'essaierai de simpilifier la structure de gestion de menu de façon à liberer la ram et reduire la manipulation des variables.
    je posterai mon essai.

  22. #21
    Seb.26

    Re : chaines de caracteres avec mikroC

    Citation Envoyé par amgab2003 Voir le message
    Merci pour vos réponses
    Je vois que ca va se compiliquer j'essaierai de simpilifier la structure de gestion de menu de façon à liberer la ram et reduire la manipulation des variables.
    je posterai mon essai.
    Bonne idée !

    Alors, pourquoi pas un ensemble de chaines en ROM, et un genre de liste chainée 1->n pour représenter l'arbre de ton menu ?

    Avec chaque élément de ta liste chainée qui contient :
    > Un texte ( pointeur vers chaine en rom )
    > Un père ( sauf pour le niveau 0 de ton menu )
    > Un frère ( l'entrée suivante dans le même sous menu )
    > Un fils ( le sous menu )



    Pour une intro sur les listes chainées : http://en.wikipedia.org/wiki/Linked_list
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  23. #22
    invite2d9e7c03

    Re : chaines de caracteres avec mikroC

    Citation Envoyé par Seb.26 Voir le message
    Bonne idée !

    Alors, pourquoi pas un ensemble de chaines en ROM, et un genre de liste chainée 1->n pour représenter l'arbre de ton menu ?

    Avec chaque élément de ta liste chainée qui contient :
    > Un texte ( pointeur vers chaine en rom )
    > Un père ( sauf pour le niveau 0 de ton menu )
    > Un frère ( l'entrée suivante dans le même sous menu )
    > Un fils ( le sous menu )



    Pour une intro sur les listes chainées : http://en.wikipedia.org/wiki/Linked_list

    Infiniment merci SEB.26
    Mais je vois que ça dépasse les limites pour les quelles.
    pour garder l'archive de forum bien ordonné j'ai crée une discussion sous le nom: gestion de menus avec pic.

Discussions similaires

  1. Le PWM avec MikroC
    Par invited3dcf66c dans le forum Électronique
    Réponses: 12
    Dernier message: 24/02/2013, 16h04
  2. Programmer un 16F628 avec MikroC
    Par invited3dcf66c dans le forum Électronique
    Réponses: 30
    Dernier message: 16/10/2011, 01h00
  3. Analyse de chaines de caracteres (VB ?)
    Par JLB29 dans le forum Logiciel - Software - Open Source
    Réponses: 11
    Dernier message: 13/10/2007, 11h13
  4. problème avec mikroC
    Par invitec35bc9ea dans le forum Électronique
    Réponses: 4
    Dernier message: 07/03/2007, 17h47
  5. Chaines de caractères/passement de fonctions
    Par invite91a05f0b dans le forum Électronique
    Réponses: 3
    Dernier message: 12/07/2006, 09h06
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...