Go Down

Topic: Pourquoi ma variable est detruite au fure et a mseure (Read 841 times) previous topic - next topic

fdufnews

#5
Jul 15, 2013, 09:58 pm Last Edit: Jul 15, 2013, 09:59 pm by fdufnews Reason: 1
Code: [Select]
 int le = strlen(lo)+strlen(la)+strlen(al)+strlen(ti)+strlen(ve)+strlen(en)+strlen(lon)+strlen(lat)+strlen(alt)+strlen(vel)+strlen(time);
 
 char coords[le];


Ceci n'est pas autorisé. La taille des tableaux doit être connue à la compilation. Or à ce moment là le=0 donc tableau de taille nulle. C'est la porte ouverte à un gros plantage.
Pour faire de l'allocation dynamique il faut impérativement passer par les pointeurs.


Un exemple qui fonctionne semble-t-il comme tu le voudrais
Quote


#include "Arduino.h"
char lon[15];
char lat[15];
char alt[15];
char time[20];
char vel[15];
char buffer[150];

// créée pour les besoin de l'essai car je n'ai pas la librairie gps
void getPar(char*a, char* b, char* c, char* d, char* e){
 
 strcpy(a,"13.122545");
 strcpy(b,"3.254568");
 strcpy(c,"13245");
 strcpy(d,"15-7-2013 23:22:45"); // la chaine fait plus de 14 caractères
 strcpy(e,"135");
}

char * getGPSCoords(void){

 #ifdef DEBUG
   stat=gps.getStat();
   if(stat==1){
     Serial.println(F("NOT FIXED"));
   }else if(stat==0){
     Serial.println(F("GPS OFF"));
   }else if(stat==2){
     Serial.println(F("2D FIXED"));
   }else if(stat==3){
     Serial.println(F("3D FIXED"));
   }
   delay(5000);
 #endif    
 
 //Get data from GPS
 
  getPar(lon,lat,alt,time,vel);  // remplace gps.getPar()
 
 char lo[]="lo=";
 char la[]="&la=";
 char al[]="&al=";
 char ti[]="&ti=";
 char ve[]="&ve=";
 char en[]="\0";
 
 
 #ifdef DEBUG

 #endif
 
 // buffer suffisament large pour contenir la chaine finale
 // la place sera libérée en quittant la fonction donc ce n'est pas trop grave
 char coords[150];      
 
 strcpy(coords,lo);
 strcat(coords,lon);

 strcat(coords,la);
 strcat(coords,lat);
 
 strcat(coords,al);
 strcat(coords,alt);

 strcat(coords,ti);
 strncat(coords,time,14);  // là tu tronques la chaine à 14 caractères on le voit dans la chaine finale la fin est coupée
 
 strcat(coords,ve);
 strcat(coords,vel);
 
 strcat(coords,en);
 /*
 #ifdef DEBUG
   Serial.print(F("Coords : "));                              
   Serial.println(coords);
  // Serial.println(strlen(coords));
 #endif
 */
 return coords;

}

void setup(void){
 Serial.begin(9600);
 strncpy(buffer,getGPSCoords(),149);
 Serial.println(buffer);
 Serial.println("Going into loop");
}

void loop(void){
 strncpy(buffer,getGPSCoords(),149);
 Serial.println(buffer);
 delay(100);
}


pierrot10

#6
Jul 16, 2013, 12:27 am Last Edit: Jul 16, 2013, 12:34 am by pierrot10 Reason: 1
Merci beaucoup,
J'ai changé un peu mon coce, car j'avais fait trop compliquéet j'ai refait plus simple.
Mais ton exemple me sera fort utile et je prendrai le temps de le lire en entier.

Par contre je deviens fou et je crois qe j'ai des gros probleme a comprendre l'allocation des tailles pour un char.

Quand je tape 'send' dans mon terminal,
Serial.println(coords); affiche bien ca
Quote

lo=608.482777&la=4613.163541&al=459.471680&ti=20130715215238&ve=0.000000

Ce qui me rend fou, c'est quand je decommente ceci
Code: [Select]
Serial.println(strlen(coords));

mon programme plante.

Et j'ai pourtant change, comme tu l'a suggéré plus haut ceci
Code: [Select]
char coords[150];
mais ca ne vas pas mieux

J'ai refait mon code aisni:
Code: [Select]


// Ceci est aussi déclaré plus haut
char lon[15];
char lat[15];
char alt[15];
char time[14];
char vel[15];
char msg1[5];
char msg2[5];

char lo[]="lo=";
char la[]="&la=";
char al[]="&al=";
char ti[]="&ti=";
char ve[]="&ve=";
char en[]="\0";


    // SEND DATA
    if(!strcmp(inSerial,"send")){
        #ifdef DEBUG
          Serial.println(F(""));
          Serial.println(F("SENDING COORDS TO THE REMOTE SERVER"));
          Serial.println(F("---------------------------------------"));
        #endif
       
        #ifdef DEBUG
          stat=gps.getStat();
          if(stat==1){
            Serial.println(F("NOT FIXED"));
          }else if(stat==0){
            Serial.println(F("GPS OFF"));
          }else if(stat==2){
            Serial.println(F("2D FIXED"));
          }else if(stat==3){
            Serial.println(F("3D FIXED"));
          }
          delay(5000);
        #endif   
 
        //Get data from GPS
        /*
        memset(&lon, 0 , sizeof(lon));
        memset(&lat, 0 , sizeof(lat));
        memset(&alt, 0 , sizeof(alt));
        memset(&time, 0 , sizeof(time));
        memset(&vel, 0 , sizeof(vel));
        */
        gps.getPar(lon,lat,alt,time,vel);
     
        //char coords[150];
        char coords[97];
       
        //memset(&coords, 0 , sizeof(coords));
       
       
        strcpy(coords,lo);          //3
        //strncat(coords,lon,15);    //18
        strcat(coords,lon);

        strcat(coords,la);         //22
        //strncat(coords,lat,15);    //37
        strcat(coords,lat);
 
        strcat(coords,al);         //41
        //strncat(coords,alt,15);    //56
        strcat(coords,alt);

        strcat(coords,ti);         //60
        strncat(coords,time,14);   //74
        //strcat(coords,time);
 
        strcat(coords,ve);         //78
        //strncat(coords,vel,15);    //93
        strcat(coords,vel);
 
        strcat(coords,en);       //95
       
        Serial.println(coords);

      //  Serial.println(strlen(coords));
/*       
        inet.httpPOST(host, port_post, path_post, coords, "Result", 50);
   */     
        delay(10000);
       
        enterCommand();
    }


Pourquoi ca plante??? =(
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Christian_R


Ce qui me rend fou, c'est quand je décommente ceci
Code: [Select]
Serial.println(strlen(coords));
mon programme plante.

strlen cherche sans doute un caractère NUL en fin de chaîne sans le trouver ?
Christian

pierrot10

ha mais j'ai lu de la doc qui dit que la fonction strcat() écrase le caratere NUL (\n) et le rajoute apres, après la cacetanation.
M'es-ce pas ca?
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Go Up