C > Chaîne de caractères variable & fonctions

Fermé
Bill_Bockay Messages postés 5 Date d'inscription lundi 21 mai 2012 Statut Membre Dernière intervention 22 mai 2012 - Modifié par Bill_Bockay le 21/05/2012 à 22:15
Bill_Bockay Messages postés 5 Date d'inscription lundi 21 mai 2012 Statut Membre Dernière intervention 22 mai 2012 - 22 mai 2012 à 13:12
Salut à tous,

Je viens poser ma question après plusieurs heures de Googueulage intempestif et des yeux trop rouges pour continer (à cause de l'écran, hein!)

Voilà, je cherche à programmer un PIC24FJ256GB110 afin d'utiliser les 4 modules UART on-chip de la bête. Celui-ci aura pour fonction principale d'aiguiller les trames entre les différents modules de mon système.

J'ai donc pensé "améliorer" les fonctions du stdio telles que le printf(), putc(), getc(), etc..

Voici le bout de code qui devrait remplacer le printf:


#define mce 0                       // placer dans main.h 
#define wifi 1                      // placer dans main.h 
#define lcd 2                       // placer dans main.h 
char *str = NULL;                   // placer dans main.h 

void uart_string(char *a, char **str) 
{  
   int len1 = strlen(str); 
   int len0; 
    
      switch (a) { 
      case 0:  
            #use rs232(baud=9600,parity=N,xmit=PIN_D8,rcv=PIN_D10,bits=8) 
            break; 
      case 1:  
            #use rs232(baud=9600,parity=N,xmit=PIN_D2,rcv=PIN_D1,bits=8) 
            break; 
      case 2:  
            #use rs232(baud=9600,parity=N,xmit=PIN_D0,rcv=PIN_D11,bits=8) 
            break; 
     }; 
     for (len1=0 ; len1>=len0 ; len1++) 
     { 
            printf("%s",str[len1]); 
     } 
     len1=0; 
     len0=len1; 
     break; 
             
 } 


Et dans mon programme principal, appeler la fonction...

 
 while(true) 
   { 
... 
   uart_string(wifi,"Quand je pense a Fernande"); 
... 
... 
   } 


Mais quand je compile, j'obtiens cette sempiternelle erreur de pointeur de CCS:
"Attemp to create a pointer to a constant"

Cette erreur est sûrement une absurdité aberrante qui fera enrager plus d'un programmeur, mais je suis novice et perdu dans le royaume du C et de l'Assembleur..

M'sieurs Dames, une idée?

D'avance, merci. Bill

A voir également:

6 réponses

Xerium Messages postés 80 Date d'inscription lundi 21 mai 2012 Statut Membre Dernière intervention 13 avril 2016 1
21 mai 2012 à 22:50
Je crois que j'avais déjà eu des erreurs avec des pointeurs dans un "switch". Je ne suis vraiment pas sûr du résultat, mais essaye de remplacer le switch par des "if" pour voir.
0
Bill_Bockay Messages postés 5 Date d'inscription lundi 21 mai 2012 Statut Membre Dernière intervention 22 mai 2012
21 mai 2012 à 23:07
Hélas, j'ai déjà tenté de voir si le problème provenait d'un switch farceur mais ce n'est pas le cas.

En fait le compileur me signale que le problème vient de la fonction lorsqu'elle est appelée dans le programme principal.

uart_string(wifi , "CHAINE");


C'est les guillemets qu'il ne supporte pas... ;)

Je pense que c'est un problème d'un pointeur, d'un tableau, d'une variable mal dimensionnée, mais je ne parviens pas à en trouver la cause.
0
Bill_Bockay Messages postés 5 Date d'inscription lundi 21 mai 2012 Statut Membre Dernière intervention 22 mai 2012
21 mai 2012 à 23:13
En posant la question différemment, comment faire pour mettre une chaîne de caractères dans le tableau de ma fonction et l'envoyer par le printf(); planqué dans mon uart_string(); ?
0
Xerium Messages postés 80 Date d'inscription lundi 21 mai 2012 Statut Membre Dernière intervention 13 avril 2016 1
Modifié par Xerium le 21/05/2012 à 23:22
Tu as essayé de débuguer ? Et il y a deux points que je n'arrive pas à comprendre :

1) len0 n'est pas initialisée mais tu l'utilises dans ton "for"
2) d'après ce que j'ai compris, ta boucle "for" initialise len1 à 0, et tant que len1 est supérieur ou égal à len0 (qui comme dit précédemment ne me paraît pas initialisé), len1 est incrémenté

Si j'ai mal compris/vu quelque chose, alors tu m'excuseras ;)

EDIT : ça ne serait pas plutôt printf("%c",str[len1]); au lieu de printf("%s",str[len1]); ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bill_Bockay Messages postés 5 Date d'inscription lundi 21 mai 2012 Statut Membre Dernière intervention 22 mai 2012
22 mai 2012 à 12:10
Merci beaucoup pour ta réponse. Alors j'initialise len0 au début de ma fonction.

printf("%c",str[len1]); et printf("%s",str[len1]); sont utilisés pareil puisque j'envoie les caractères de ma chaîne un à un dans ma boucle for. Mais oui, du coup tu as raison, c'est plus propre avec le %c ;)

Au passage j'ai vu que je me suis emmellé les pinceaux dans ma boucle for, c'est len0 qui doit s'incrémenter jusqu'à qu'il soit supérieur ou égal à len1.


Mais le problème, je pense, viens de l'appel de ma fonction, une mauvaise définition de la variable dans laquelle la chaine doit être stockée?

Merci
0
Bill_Bockay Messages postés 5 Date d'inscription lundi 21 mai 2012 Statut Membre Dernière intervention 22 mai 2012
22 mai 2012 à 13:12
C'est tout bon, j'ai résolu le problème en utilisant une fonction qui permet de stocker automatiquement les chaînes de caractères dans la RAM du PIC et qui résout dans les maux de la terre, enfin, les miens ;)

#device PASS_STRINGS=IN_RAM


Magique!
0