Pages: [1]   Go Down
Author Topic: Comment remplacer une valeur d'une varaiable  (Read 532 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 456
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

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


Sachant que
Code:
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:
index_EPROM += ((eprom_size/eprom_inc)-1);
était la meme chose que
Code:
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:
index_EPROM += ((eprom_size/eprom_inc)-1);
Car il incrémente alors que je veux remplacer, et devrait être
Code:
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  smiley-cry
« Last Edit: September 27, 2013, 04:12:44 pm by pierrot10 » Logged

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

Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1398
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

le blâme, non, mais ...

premièrement, tu fais :
Code:
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:
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:
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.
« Last Edit: September 27, 2013, 04:17:01 pm by Super_Cinci » Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 456
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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  smiley
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:
writeEEPROM(rom,(eprom_inc*index_EPROM)+eprom_lon,lon);

Encore merci.

Prochain gors chapitre : XML; mettre ce qui est collecter par la boucle
Code:
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.
Logged

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

Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1398
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bonnes continuations alors smiley-wink !
Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 456
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
Logged

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

Offline Offline
Sr. Member
****
Karma: 0
Posts: 456
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai rwgardé un peu la doc arduino

Es-tu sure de ca ?
Code:
const unsigned long int eprom_size = 262144L ; //32768  // taille de l'EPROM en octets
ne serait-ce pas
Code:
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:
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?
Logged

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

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
const unsigned long int eprom_size = 262144L ; //32768  // taille de l'EPROM en octets
ne serait-ce pas
Code:
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.

Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 456
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

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

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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?
Logged

Pages: [1]   Go Up
Jump to: