Problème de conversion sur un char

Bonjour,
Je m'excuse si je ne métrise pas encore bien les char.
Mais j'ai ce message d'erreur qui s'affiche quand je compile mon code

Erruer: Invalid conversion 'char' to 'const char'

à ce niveau
strcpy(sms_from_number,c[1]);

Voici mon code

char sms_from[15];
boolean sms_read(int sms_pos,char *sms_from_number, char *sms_date, char *sms_time, char *sms_text)
{
  // Definie une variable
  char cmd[12];
  // Defini la command
  sprintf(cmd,"AT+CMGR=%d,1",sms_pos);
  execute la commande et place la réponse dans buffer
  sendATcommand(cmd,"OK",2000,true,false,true); // commande, attend pour le OK, ln, retourne uniquementla réponse de la commande, debug
  // Met chaque ligne du bouffer dans un array 0:AT+CMGR=1,1, 1:, 2:+CMGR: "REC READ","33333","","13/09/08,14:24:43+08", 3:, 4:OK
  bufferByLine(buffer, buffer_by_line);
  // Split la lign 2, delimiter par une virgule
  char * c = strtok(buffer_by_line[2],",");
  /*
  0:+CMGR: "REC READ",
  1:"+41763334455"
  2:""
  3:"13/09/08
  4:14:24:43+08"
  */
  
  Serial.println("-----");
    Serial.print(F("From : "));Serial.println(c[1]);
    strcpy(sms_from_number,c[1]); // Erruer: Invalide conversion  'cha' to 'const char'
    Serial.print(F("Date : "));Serial.println(c[3]);
    //strcpy(sms_date,c[3]);
    //strcpy(sms_time,c[4]);
    Serial.print(F("Message : "));
    Serial.println(buffer_by_line[3]);
 
}

Je ne sais pas si ca se résout avec un *. Ce que je ne comprnds pas non plus c'est strcpy est fait pour copier des char, non?

Merci

cha ? connais pas cha...

Fais un copier/coller précis de l'erreur, et pas une retranscription avec fautes de frappes.

strcpy manipule des char*, des tableaux de char terminés par un zéro. Si tu veux écrire un caractère dans un string, tu fais simplement

str[0] = car;
str[1] = 0;

Pardon, le message d'erreur est exactement (en effet j'avais oublié un r et....... * :~

sim908_cooking:799: error: invalid conversion from 'char' to 'const char*'

Non non, c'est bien char qui remplace un autre.

Si c'est pour remplacer un char, par un autre, il ne faut pas passer par strcpy() mais accéder directement au caractère dans le tableau, et le remplacer.

strcpy() est fait pour des chaînes de caractères terminées par un caractère nul (char*), pas un caractère tout seul.

Salut pepe et tous,

D'abord pepe j'aimerais encore te remercie. Tes fonctions et aide m'ont vachement aidé!!!!!

Aussi, je me suis trompé dans mon exemple. Je remets le code correct avec explication.
Ensuite, je collerai les fonction de pele qui pourrait être utile à d'autre.
Ensuite, je poserai mon problème, car il est toujours là. (J'ai encore du mal avec les char et pointer)

boolean sms_read(int sms_pos,char sms_from_number, char *sms_date, char *sms_time, char *sms_text)
{
  // Definie une variable
  char cmd[12];
  // Defini la command
  sprintf(cmd,"AT+CMGR=%d,1",sms_pos);
  //execute la commande et place la réponse dans buffer
  sendATcommand(cmd,"OK",2000,true,false,true); // commande, attend pour le OK, ln, retourne uniquementla réponse de la commande, debug
  // Met chaque ligne du bouffer dans un array 0:AT+CMGR=1,1, 1:, 2:+CMGR: "REC READ","33333","","13/09/08,14:24:43+08", 3:, 4:OK
  
  // La fonction sendATcommand enregistrer le buffer par ligne dans buffer_by_line
  
  // Ci-dessous je controlle buffer_by_line
  for(int b =0; b<NBLINES;b++)
  {
    Serial.print(b);
    Serial.print(F(" : "));
    Serial.println(buffer_by_line[b]);
  }
  /* ce qui affiche ceci, donc OK
  0 : AT+CMGR=2,1
  1 : 
  2 : +CMGR: "REC READ","55555","","13/09/08,14:25:34+08"
  3 : Das von Ihnen gesendete Keyword ist leider falsch. Le mot cle envoye est malheureusement faux.
  4 : 
  5 : 
  */
  
  // J'affiche le message recu
  Serial.print(F("Message :")); Serial.println(buffer_by_line[3]);
  
  // Maintenant j'ai besoin de 5555, de 13/09/08 et de 14:25:34+08
  
  // Donc j'utilise une des fonction de _pepe_. Mais ca bug de mon cote
  splitString(buffer_by_line[2], splitedString, ",");
  
  Serial.print(F("From :")); Serial.println(buffer_by_line[2]);
  
}

Ci-dessu, j'utilise un fonction qui va splité le contenu de buffer_by_line[2] et avoir le résultat de splitedSttrig comme ceci

0:+CMGR: "REC READ",
1:"55555",
2:"",
3:"13/09/08,
4:14:25:34+08"

Il faudra aussi que je trouve une solution pour supprimer les ". En PHP, il y str_replace('"','');, mais en C++??

Dans tous les cas, ceci

 splitString(buffer_by_line[2], splitedString, ",");

m'affiche un message d'erreur

sim908_cooking:814: error: cannot convert 'char*' to 'char**' for argument '2' to 'void splitString(char*, char**, char)'

Pourtant splitString() demand trois char, et je lui envoie trois char, non????????

Moi je crois que je ne métrise pas les * comme char * var[], ou encore char **var[]; :~ :~

Voilà la finction splitString de pepe. J'ai ajouté un troisième paramètre.

// SlitString
#define NBVALS 14
char splitedString[NBVALS];
void splitString(char *ligne, char **splitedString, char delimiter)
{
  char *p = ligne;
  int i = 0;
  splitedString[i++] = p;
  while (*p) {
    //if (*p==',') {
    if(*p = delimiter){
      *p++ = '\0';
      if (i<NBVALS)
         splitedString[i++] = p;
    } else
      p++;
  }
  while(i<NBVALS)
    splitedString[i++] = p;
}

Pour info, la function qui me permets d'avoir le buffer par ligne est la suivante. Ca fonctionne

// bufferByLine
#define NBLINES 6
char *buffer_by_line[NBLINES];
void bufferByLine(char *buffers, char **buffer_by_line) // Buffer, resulta in, nb of line
{
  char *p = buffers;
  int i = 0;

  buffer_by_line[i++] = p;

  while (*p) {
    if (*p=='\n') {
      *p++ = '\0';
      if (*p=='\r')
        *p++ = '\0';
      if (i<NBLINES)
         buffer_by_line[i++] = p;
    } else
    if (*p=='\r') {
      *p++ = '\0';
      if (*p=='\n')
        *p++ = '\0';
      if (i<NBLINES)
         buffer_by_line[i++] = p;
    } else
      p++;
  }
  while(i<NBLINES)
    buffer_by_line[i++] = p;
}

Aïe!, ouiiiii :.
Mais le problème reste à ce niveau

splitString(buffer_by_line[2], splitedString, ",");

Hello

Puis-je te demander un dernier truc.

void splitString(char *ligne, char **splitedString)
{
  
  char *p = ligne;
  int i = 0;
  splitedString[i++] = p;
  while (*p) {
   
    if (*p==',') {
      *p++ = '\0';
      if (i<NBVALS){
       
         splitedString[i++] = p;
      }
        
    } else
    {
      p++;
    }
 
  }
  while(i<NBVALS)
    splitedString[i++] = p; 
    
}

Ci-dessus m'affiche ceci

0:+CMGR: "REC READ"
1:"+4176000000"
2:""
3:"13/09/30
4:00:02:36+08"

J'aimerais ceci

0:+CMGR: "REC READ" (s il n y a pas les " ici, ccest pas grave)
1:+4176000000
2:
3:13/09/30
4:00:02:36+08

Soit sans les ".

J'ai chercher un super moent a modifier la fonction ci dessus, mais sans succès. Idéalement, j'aimerais passer en parametre le caracter, ou les caracter à supprimer. Mias pour le moment ca me va très bien, si les " sont supprimer, tout simplement.

Après je crois que je suis au bout :slight_smile: :slight_smile: :slight_smile: :slight_smile:
Merci

Salut pepe

Encore Merci,
Ca ne marche pas, il me supprime que le premier!

void supprimeCaractere(char *chaine, char caractere)
{
  char *p, *q;

  p = chaine;
  while (*p != caractere) {
    if (! *p)
      return;
    p++;
  }
  q = p;
  do {
    p++;
    while (*p == caractere)
      p++;
    *q++ = *p;
  } while (! *p);
  
  Serial.print("Supp caracter : ");Serial.println(p);
}

Supp caracter : REC READ","33333","","13/09/08,14:24:43+08"

J'ai ca : +CMGR: "REC READ","33333","","13/09/08,14:24:43+08"
et je dois avoir ca : +CMGR: REC READ,33333,,13/09/08,14:24:43+08

Je dois tous les enlever!
Je prend note de ta remarque sur les ". En effet, mais dans mon cas, j'ai besoin de ces informations sans ".

Je suis comme même surpris qu'il n'y ait pas de fonction comme en php str_replcae('"','',$variable)?

Salut pepe
:blush: :blush:
Ca marche toujours pouasss. Cette fois ca affiche rien.
A part ca, je te remercie sincerement pour ta patience. C'est cool d'avoir des gras comme ca sur le forum. Ce qui me frustre, c'est de solicité sur un truc simple :. :.

Bref...

Serial.println(buffer_by_line[2]); // Affiche +CMGR: "REC READ","33333","","13/09/08,14:24:43+08"
supprimeCaractere(buffer_by_line[2],'"'); // ' " ' sans espace. J'ai aussi essayé "\"" sans succes
void supprimeCaractere(char *chaine, char caractere)
{
  
  char *p, *q;

  p = chaine;
  // Je parcours p tant que le caracter n'est pas egal à "
  while (*p != caractere) {
    if (! *p) // ??
      return;  // Jje quitte la boucle
    p++; // si non j'incrémente
  }
  q = p; // q prend la valeur de p
  do { // fait tant que..
    p++; // incremente p
    while (*p == caractere) // tant que le caractere est esgal à "
      p++; // increment
    *q++ = *p; // q prend la valeur de p et q incremente
  } while (*p); // ... tant que ???
  
  Serial.print("Supp caracter : ");Serial.println(p);
}

Si

...
} while (*p);
  Serial.print("Supp caracter : ");Serial.println(p); // p n'affiche rien

si

...
} while (!*p);
  Serial.print("Supp caracter : ");Serial.println(p); // que le premier " est supprimé

Si tu étais par geneve, je te payerai une bonne quinte!!!! 8)

Super, ca marche !!!!!!!!!
Merci beaucoup pepe, t'es génial et merci pour ta grande patience :slight_smile:

char * supprimeCaractere(char *chaine, char caractere)
{
  char *p, *q;

  p = chaine;
  while (*p != caractere) {
    if (! *p)
      return false;
    p++;
  }
  q = p;
  do {
    p++;
    while (*p == caractere)
      p++;
    *q++ = *p;
  } while (*p);
  
  Serial.print("Supp caracter : ");Serial.println(chaine);
return chaine;
}

Ceci dit je ne comprens pas comment 'chaine' est modifié.
chaine est utilisé que dans la troisème ligne lorsqu'il donne sa valur à p? comment 'chaine' peut prendre une valeur s'il n'y a pas un truc du genre chaine=p??..
J'ai aussi un peu changer la fonction pour qu'il retourne la valeur