Problème avec les pointeur

Bonjour!

Je ne métrise pas les poiteurs et j'au du mal à encapsuler des caractères

Voici mon code qui bloque:
Je ne mets pas tout le code, mais uniquement ce qui bloque et comment les variables sont déclarées. Le reste du code fonctionne sauf là ou j'undique l'erreur

char *lon, *lat, *day, *hour, *da;
char *cha = strtok((char *)comm_buf,",");
[...]
cha = strtok(NULL,",");
// Cha à la valeur de 22:30:14

char *da = cha;  // Je passe 22:30:14 dans da

// Je parcours da              
while(*da)
 {
    if(*da == ':')  // si da est égal à :, ne fais rien
    {
    }
    else
    {
// ICI CA BLOQUE
       *day++ = da;  // Si non, sauve le caracetre dans day et déplace le pointeur
    }
    da++;
   }

Je n'arrive pas à remplir la variable day. Le message d'erreur est:

error: invalid conversion from 'char*' to 'char' [-fpermissive]
day++ = da;

Je ne métrise pas les pointeurs et c'est l'occasion d'apprendre. Je pense que l'erreur vient du fait que je n'arrive pas à déplacer les pointeur dans 'day'. Je suis un peu largé :slight_smile:

Merci beaucoup pour vos lumières

Bonjour

Si tu veux sauver le caractère c'est

*day++ = *da;

Salut
Merci pour ta réponse.
J'ai fait la modofication mais ca m'affiche ceci

Lon: 6.141163
lat: 46.219819
Day: 2015/09/24
Hour: EG: 0,1

alors que je cherche à afficher ceci:

Lon: 6.141163
lat: 46.219819
Day: 20150924
Hour: 223014

:confused:
Hello,
J’arrive toujours pas à résoudre ce problème

Pour résumer:
Je déclare mes varibale ainsi

char *lon, *lat, *day, *hour, *da, *hr;

Aussi j’utilise strtok() pour sinder une réponse qui est la suivante et j’initie la variable cha

char *cha = strtok((char *)comm_buf,",");

un peu plus bas dans le code, je récupère l’huere aisni

cha = strtok(NULL,",");
Serial.println(cha); // Affiche 22:12:00

mais je souhaite supprimer les :

Donc j’ai essayé ceci

cha = strtok(NULL,",");
hr = cha;
c = 0;
do
{
    Serial.print(*hr);
    if(*hr == ':')
    {
    }
    else
    {
        *hour++ = *hr;
     }
     hr++;
     c++;
     Serial.println(c);
}while(c < strlen(hr));

Serial.println(hour);

mais ca ne marche pas. Le code va de travers…

J’aimerais bien insister sur les pointer car je ne métrise pas ceci et ce petit code me permettrait prendre la main.

Au final ceci doit afficher

Serial.println(hour); // Affiche 221200

Merci beaucoup pour votre coup de main!

Bonjour,

Ca ne fonctionne pas car strlen(hr) diminue au fur et à mesure que hr augmente (hr++)

Quand on utilise les pointeurs pour les chaines, le plus pratique c'est de tester le \0 de fin de chaine.

for (hr=cha; *hr; hr++)
{
  if (*hr!=':')
    *hour++=*hr;
}
*hour=0;

Je te remercie Kamill,
Je ne peux pas encore essayer car les batteries de mon module sont plates.
J’essayerai dans une petite demi-heure.

Ceci dit comment je peux “traduire” ton exemple. Je n’ai jamais utiliser le for ainsi. J’ai l’habitude de mettre un byte ou un int dans le for. Là, c’est des char.

for (hr=cha; *hr; hr++) // hr prend la veleur de cha; ??????; incrémente hr
{
  if (*hr!=':')
    *hour++=*hr;
}
*hour=0;

Dans la deuxième partie, généralement, je me hr < 10. Dans ton exemple, comment traduire cette limitation?

Je vais essayé ceci dans un petit moment, mais merci déjà.

le plus pratique c’est de tester le \0 de fin de chaine

Mais ou teste-tu le \0

Dernière question:
On est d’accord que tu fermre hour avec un ‘\0’

*hour=0;

Donc, ci-dessus, c’est la même chose que

*hour='\0';

?

Dans le for

  • la 1ère partie est exécutée au début de la boucle -> affectation du pointeur au début de la chaine
  • la 2ème partie est la condition pour exécuter la boucle -> ici *hr (c'est équivalent à *hr!=0) la boucle continue tant que l'on n'a pas atteint le 0 de fin
  • la 3ème partie est exécuté en fin de boucle -> incrémente le pointeur pour passer au caractère suivant

*hour=0 et *hour='\0' sont équivalents

Super, je te remercie pour ces précisions.

Néanmoins, ca ne marche pas!!!
C'est dur à expliquer le résultat mais je vais essayer.

J'appelle une fonction get_gps() et qui va afficher un message qui indique que la fonction commence a etre exécutée. Le message est tout bête : "GPS".

Quand je ne mets pas tont code, ma fonctini par m'afficher ceci:

fix:cid=11633&mnc=03&mcc=228&lac=6001&gprmc=$GPRMC,18:28:24,V,46.219821,,6.141161,,,2015/09/26,,

et ca c'est parfait saud que l'heure et le jour ont toujours les " et /.

Quand je décommente ton code, j'ai l'impression qu'un variable est saturée ou je ne sais pas, mais j'ai continuellement ceci qui s'affiche:
(+CIPGSMLOC=1,1 est un debug de la commande AT que j'envoi)

GPS
+CIPGSMLOC=1,1 6.141161,46.219821,2015/09/26,18:31:07


GPS
+CIPGSMLOC=1,1 6.141161,46.219821,2015/09/26,18:31:07


GPS
+CIPGSMLOC=1,1 6.141161,46.219821,2015/09/26,18:31:07


GPS
+CIPGSMLOC=1,1 6.141161,46.219821,2015/09/26,18:31:07


GPS
+CIPGSMLOC=1,1 6.141161,46.219821,2015/09/26,18:31:07


GPS
+CIPGSMLOC=1,1 6.141161,46.219821,2015/09/26,18:31:07


GPS
+CIPGSMLOC=1,1 6.141161,46.219821,2015/09/26,18:31:07


GPS
+CIPGSMLOC=1,1 6.141161,46.219821,2015/09/26,18:31:07


GPS
+CIPGSMLOC=1,1 6.141161,46.219821,2015/09/26,18:31:07

Je pense qu'au moment ou il arrive au code que tu m'as donnée, il perd les pédales. Ca doit un petit truc qui bug.

As-tu une idée?

Voici le code. Il est dans un switch

      do
        {
          switch(c){
            case 0:
              cha = strtok(NULL,",");
              lon = cha;
           //   Serial.println(lon);
              break;

            case 1:
              cha = strtok(NULL,",");
              lat = cha;
           //   Serial.println(lat);
              break;

            case 2:
              cha = strtok(NULL,","); // 2015-09-26
              
              
// TON EXMPLE EST ICI
              for (da=cha; *da; da++)
              {
                if (*da!='/')
                  *day++=*da;
              }
              *day=0;   // 20150926
              
              //day = cha;
              break;

            case 3:
              cha = strtok(NULL,",");
              /*
              for (hr=cha; *hr; hr++) // *hr c'est équivalent à *hr!=0)
              {
                if (*hr!=':')
                  *hour++=*hr;
              }
              *hour=0;
              */
              hour = cha;
              break;

            case 4:
              cha = strtok(NULL,",");
              #ifdef DEBUG
               // sprint(F("?:"));
               // sprintln(cha);
              #endif
              break;

            default:
              cha = strtok(NULL,",");
              #ifdef DEBUG_GPS
                Serial.print(F("Def : "));
                sprintln(cha);
              #endif
          }
          c++;
        }while(cha != NULL);

Milles mercis

tu as bien laissé l'instruction cha = strtok(NULL,","); ?
A la fin remet l'instruction Serial.println(hour); pour voir ce qui se passe

Oui bien sur, il est juste au dessus, dans le case 2

Voici ce que j'ai maintenant dans mon case 2:

case 2:
              cha = strtok(NULL,",");
  
              Serial.println(cha);
              for (da=cha; *da; da++)
              {
                if (*da!='/')
                  *day++=*da;
              }
              *day=0;
              Serial.print(F("Day:"));
              Serial.println(day);
              
              //day = cha;
              break;

Les trois Serial.println n'affiche rien. Je pense que le code ne va pas jusqu'à la.

Par contre si je décommente

//day=cha

et je commente le reste en gardant le

cha = strtok(NULL,",");

Ca marche

Pour rapelle, je déclare mes variable ainsi:

char *cha, *lon, *lat, *day, *hour, *da, *hr;

Je pense que le problème vient de

*day++=*da;

J'ai commenté ceci

          case 2:
              cha = strtok(NULL,",");
  
              Serial.println(cha);
              for (da=cha; *da; da++)
              {
                if (*da!='/')
                {
                  //*day++=*da;
                }
              }
              //*day=0;

              Serial.print(F("Day:"));
              Serial.println(day);

              //day = cha;
              break;

Et le code n'explose plus. Ca fonctionne. Bon, je n'ai pas le résultat voulu, mais le code tourne

Le premier sérial et les deux autre affiche bien ceci

2015/09/26
Day:

Faudrait donc juste encore ceci

2015/09/26
Day:20150926

:slight_smile:

Et ca ca marche aussi

case 2:
              cha = strtok(NULL,",");
  
              Serial.println(cha);
              for (da=cha; *da; da++)
              {
                if (*da!='/')
                {
                  Serial.print(*da);
                  //*day++ = *da;
                }
              }
              *day=0;

              Serial.print(F("Day:"));
              Serial.println(day);

              //day = cha;
              break;

Le problème vient vraiment de l'affection de *da dans day. Et ca, je bloque! :slight_smile:

C'est quoi la définition de day ?
Il pointe bien sur une zone mémoire ?

Hello, je ne suis plus devant mon PC.
Day je l'ai défini avec les autre variable

char •day;

Je n'ai rien fais de plus jusqu'à ce qu'il soit traité dans le for.

J'arrive pas faire un copier coller du code avec mon phone

Un pointeur c'est juste une adresse, il doit être initialisé pour pointer vers une variable ou un tableau
Par exemple

char bufDay[20];
char *day;
day=bufDay;

Salut,
Je te remercie.
J'ai finalement résilu mon problème en déclarant ainsi

char day[9]

et en remplacent ceci

*day++=*da;

par ceci

day[d++]=*da;

bien entendu, d est déclaré plus haut.

Merci pour ton aide