Go Down

Topic: Comment remplacer une valeur d'une varaiable (Read 587 times) previous topic - next topic

pierrot10

Sep 27, 2013, 10:58 pm Last Edit: Sep 27, 2013, 11:12 pm by pierrot10 Reason: 1
Bonjour à tous,

je mexcuse pour cette question si bête, mais ca me plane dans un doute.


Sachant que
Code: [Select]

unsigned int index_EPROM = 0;
const unsigned int eprom_size = 256000; // Micro proc : 24LC256
const unsigned int eprom_inc = 84;

// Si index2_EPROM est plus grand que 0, alors loop toute l'eeprom. index2_EPROM est > 0, car l'eeprom a été remplie et est donc pleine.
// (les enregistrement suivants, aurons repris à 0x0000).
if(index2_EPROM>0){
   // Si oui index_EPROM prend la valeur maximal que peut avoir index_eprom, sachant que l'eprom 24LC256 à 250k
   index_EPROM += ((eprom_size/eprom_inc)-1);
   index2_EPROM = 0;
   
 }
 // Loop the eeprom
 for(int c=0; c <= index_EPROM; c++){
   readEEPROM(rom,(eprom_inc*c)+eprom_cou, course_id);
   readEEPROM(rom,(eprom_inc*c)+eprom_lon, lon);
   readEEPROM(rom,(eprom_inc*c)+eprom_lat, lat);
   readEEPROM(rom,(eprom_inc*c)+eprom_alt, alt);
   readEEPROM(rom,(eprom_inc*c)+eprom_tim, time);
   readEEPROM(rom,(eprom_inc*c)+eprom_vel, vel);
   readEEPROM(rom,(eprom_inc*c)+eprom_sta, _stat);
   
   // Convert into XML format (has to be done very soon)

  // Merge in coords
   sprintf(coords, "g=%s,%s,%s,%s,%s,%s,%s,%s",course_id,lon,lat,alt,time,vel,_stat,c);
  #ifdef DEBUG
     // Display the red values, but will be soon built in XML format
     Serial.println(coords);
 #endif
  }
 
 index_EPROM = 0;



Dans un préceédent post, on m'avait expliquer que
Code: [Select]
index_EPROM += ((eprom_size/eprom_inc)-1);
était la meme chose que
Code: [Select]
index_EPROM = index_EPROM + ((eprom_size/eprom_inc)-1);
Donc le premier est plus simple en écriture
Dans ce cas on parle "d'incrémentation" ou d'addition.

Donc dans mon code, si-dessus, ceci est faux
Code: [Select]
index_EPROM += ((eprom_size/eprom_inc)-1);
Car il incrémente alors que je veux remplacer, et devrait être
Code: [Select]
index_EPROM = ((eprom_size/eprom_inc)-1);
pour prendre sa valeur.

Donc on est bien d'accord ensemble?

J'ai un peu honte de poser cette question, car je donne probablement la réponse et peut etre que je suis encore confu avec les chars.

Vlaaaa, au pire des cas j'ai un blâme  =(
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Super_Cinci

#1
Sep 27, 2013, 11:13 pm Last Edit: Sep 27, 2013, 11:17 pm by Super_Cinci Reason: 1
le blâme, non, mais ...

premièrement, tu fais :
Code: [Select]

const unsigned int eprom_size = 256000; // Micro proc : 24LC256
si tu veux parler de la taille de l'eprom, qui doit être de 256Ko, saches que contre toute attente, en programmation, 1Ko n'est pas 1000 octets, mais 1024 octets (une histoire de puissances de 2, on y revient toujours, aux bases binaires...). du coup, 256Ko = 256 x 1024 octets = 262144 octets. ça, c'est dit.

oui, A += B équivaut à A = A + B (A incrémenté de B).

Code: [Select]
index_EPROM = ((eprom_size/eprom_inc)-1); te donne en effet l'index max d'enregistrements possibles dans ton eprom. (index max = nombre max - 1)

Code: [Select]
index_EPROM += ((eprom_size/eprom_inc)-1); te donnera l'ancienne valeur de index_EPROM ajoutée à l'index max d'enregistrement, soit un dépassement de capacité de l'eprom potentiel.

un conseil : définis in truc genre index_eprom_max dès le début, ça te fera gagner du temps et de la "stabilité" dans ton code.

pour répondre à la question "Comment remplacer une valeur d'une variable", je dirais que :

l'opérateur "+=" incrémente,
l'opérateur "=" affecte.

pierrot10

ok
Quote

du coup, 256Ko = 256 x 1024 octets = 262144 octets

En effet, j'ai voulu arondir à 256000. De toute maniere je crois que j'ai beaucoup de marge. Ceci etant dit, j'ai comme meme modifier à 262144
Quote

un conseil : définis in truc genre index_eprom_max dès le début

Oui c'est bien ce que j'ai fait. Il est en tete de mon script
Code: [Select]

const unsigned int eprom_size = 262144; //32768  // taille de l'EPROM en octets


Quote

l'opérateur "+=" incrémente,
l'opérateur "=" affecte.

Super, c'est maintenant très très claire.

je suis super content. Car ca semble vraiment bien fonctionner. Je dois encore tester et vérifier pour continuer serainement  :)
J'étais vraiment bloqué mais là, j'ai déjà pu deja attaqué la lecture de l'eeprom pour l'envoi, grâce a tes exemples. Ca ma vraiment débloqué:
Code: [Select]

writeEEPROM(rom,(eprom_inc*index_EPROM)+eprom_lon,lon);


Encore merci.

Prochain gors chapitre : XML; mettre ce qui est collecter par la boucle
Code: [Select]

for(int c=0; c <= index_EPROM; c++){}

au fomat XML pour envoyer une fois, le tout, après la boucle, sur le serveur! Mais j'ai déjé une piste.
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Super_Cinci


fdufnews

Quote
je suis super content. Car ca semble vraiment bien fonctionner. Je dois encore tester et vérifier pour continuer sereinement

Je me permets de douter que cela fonctionne bien.
262144 est très supérieur à 65536. Donc 262144 ne rentre pas dans un int. Il faut travailler avec des long. En plus une constante longue doit être suffixé avec un L pour indiquer son type.

Code: [Select]
const unsigned long int eprom_size = 262144L ; //32768  // taille de l'EPROM en octets

Évidemment la remarque sur le type long s'applique aussi aux variables qui vont utiliser cette constante.

pierrot10

Salut,
Merci pour cette Remarque qui a sont importance. J ai compile sans avoir de message d erreur, Mais je n ai pas encore tester le cas ou.

Je vais Donc me pancher la dressus. Merci pour ce detail  :)
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

pierrot10

J'ai rwgardé un peu la doc arduino

Es-tu sure de ca ?
Code: [Select]

const unsigned long int eprom_size = 262144L ; //32768  // taille de l'EPROM en octets

ne serait-ce pas
Code: [Select]

const unsigned long eprom_size = 262144L ; //32768  // taille de l'EPROM en octets

sans le int? Qu'es-ce qui diffère réellement?

Mais au final, il faudrait que je moifie pas mal de petite chose
Code: [Select]

unsigned int index2_EPROM =0;
unsigned long int index_EPROM = 0L; // PARCE QU?IL PEUT MONTER JUSQU A 262144
const unsigned long int eprom_size = 262144L; // Micro proc : 24LC256
const unsigned long int eprom_inc = 84L; // PARCE QU IL EST DIVISER AVEC eprom_size (J aurai peut etre un probleme avec celui-la...

// Si index2_EPROM est plus grand que 0, alors loop toute l'eeprom. index2_EPROM est > 0, car l'eeprom a été remplie et est donc pleine.
// (les enregistrement suivants, aurons repris à 0x0000).
if(index2_EPROM>0){
    // Si oui index_EPROM prend la valeur maximal que peut avoir index_eprom, sachant que l'eprom 24LC256 à 250k
    index_EPROM += ((eprom_size/eprom_inc)-1);
    index2_EPROM = 0;
   
  }
  // Loop the eeprom
  for(long int c=0; c <= index_EPROM; c++){ // PARCE QU'IL EST COMPARER AVEC index_EPROM QUI PEUT MONTER JUSQU A 262144L
    readEEPROM(rom,(eprom_inc*c)+eprom_cou, course_id);
    readEEPROM(rom,(eprom_inc*c)+eprom_lon, lon);
    readEEPROM(rom,(eprom_inc*c)+eprom_lat, lat);
    readEEPROM(rom,(eprom_inc*c)+eprom_alt, alt);
    readEEPROM(rom,(eprom_inc*c)+eprom_tim, time);
    readEEPROM(rom,(eprom_inc*c)+eprom_vel, vel);
    readEEPROM(rom,(eprom_inc*c)+eprom_sta, _stat);
   
    // Convert into XML format (has to be done very soon)

   // Merge in coords
    sprintf(coords, "g=%s,%s,%s,%s,%s,%s,%s,%s",course_id,lon,lat,alt,time,vel,_stat,c);
   #ifdef DEBUG
      // Display the red values, but will be soon built in XML format
      Serial.println(coords);
  #endif
   }
 
  index_EPROM = 0L; // L PAREC QUE C EST UN LONG

En gros, c'est ca si j ai bien compris fdufnews. N'es-ce pas?
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

fdufnews


J'ai rwgardé un peu la doc arduino

Es-tu sure de ca ?


Pour faire une petite mise au point, la doc arduino ce n'est pas la bible. Le langage utilisé pour développer avec l'IDE arduino c'est un sous-ensemble du C.
Il y a de la littérature autrement meilleur que la doc arduino.

Code: [Select]

const unsigned long int eprom_size = 262144L ; //32768  // taille de l'EPROM en octets

ne serait-ce pas
Code: [Select]

const unsigned long eprom_size = 262144L ; //32768  // taille de l'EPROM en octets

sans le int? Qu'es-ce qui diffère réellement?


int c'est un type (comme char, float et double)
long c'est un qualifieur (comme short) que l'on ajoute au type int pour indiquer une modification de sa longueur
il peut être omis. Cela ne génère donc pas d'erreur. Mais en même temps en le laissant on ne risque pas d'oublier le type que l'on utilise.


pierrot10

Ok, merci fdufnews,

Juste encore un petit détail.

On es d'accord, si je t'ai bien compris, que ci je compatre

int c = 0;
et unsigned long int d = 22222222222;

c doit être alors un long int alors?
J'aurai tendance à dire, non, qu'il n'y a pas besoin.

Mais tu as écris
Quote

Évidemment la remarque sur le type long s'applique aussi aux variables qui vont utiliser cette constante.

Qui me met donc dans le doute.
Dans un sens ca me semble logique que la variable c doit est un long int, si du coup elle prend une valeur supérieur à 65536.
Mais si elle ne devait pas être supérieur à 65536 (ce qui ne sera pas mon cas), elle peut rester en int.

non?
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

fdufnews



On es d'accord, si je t'ai bien compris, que ci je compatre

int c = 0;
et unsigned long int d = 22222222222;

c doit être alors un long int alors?
J'aurai tendance à dire, non, qu'il n'y a pas besoin.


Si tu compares la variable avec un long c'est bien qu'à un moment ou un autre elle risque de prendre une telle valeur. Sinon à quoi servirait de faire cette comparaison?

Go Up