Show Posts
Pages: 1 ... 114 115 [116] 117 118 ... 243
1726  International / Français / Re: DUE et ProgMem ou macro F(). on: July 19, 2013, 07:49:31 am

mon anglais etant souvent rouiller je n'est peut'etre pas bien compris les message du forum !

Si tu mettais le lien vers le(s) message(s) en question
1727  International / Français / Re: Pourquoi ma variable est detruite au fure et a mseure on: July 15, 2013, 02:58:18 pm
Code:
 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);
}

1728  International / Français / Re: Pourquoi ma variable est detruite au fure et a mseure on: July 15, 2013, 12:50:57 pm
2 problèmes:
  1) coords est définie dans la fonction getGPSCoords donc elle est locale à cette fonction et elle est détruite aussitôt que tu quittes getGPSCoords.
  2) tu fais un malloc dans getGPSCoords mais tu ne libères jamais cette zone mémoire donc tu as une fuite mémoire puisqu'à chaque appel tu refais l'allocation d'un buffer que tu ne libères jamais.

Le pointeur est bien retourné par getGPSCoords et il est donc récupéré par la fonction appelante.Il faudrait donc libérer l'espace occupé par coords lorsque tu quittes getGPSCoords et  faire un strcpy pour récupérer la chaîne pointée.

Sur des petites architectures comme l'arduino, je pense qu'il est préférable de créer un scratchpad en global de taille correcte qui servira de buffer à tout le monde (cela oblige à une certaine discipline dans son utilisation).
1729  International / Français / Re: Comment puis-je envoyer un array en post on: July 15, 2013, 05:47:17 am
Code:
fix.toCharArray(coords, 109);
//(j'aimerais remplacé 109 par fix.length()+1
Non c'est une fausse bonne idée. La valeur passée en argument est une limite haute à ne pas dépasser (pour éviter les débordement de chaîne). Il faut mettre la taille de la variable qui va accueillir la chaîne. Comme ça si tu essayes de copier trop de caractères la chaîne sera tronquée afin de ne pas corrompre la mémoire.

Aussi, ca ca ne marche pas non plus

Code:
String message = "test1"+"test2";
Le message d'erreur : "Invalid  operands of types 'const char [5]' and 'const char [5]' to binary 'operateu' +"

J'essaye de concatener des String, maintenant.
La surcharge de l'opérateur + ne fonctionne qu'avec des objets String pas avec des variables de type string.
1730  International / Français / Re: -Aide- Sculpture et arduino sur Télécran on: July 14, 2013, 03:11:51 pm
Quote
En fait je m'interroge sur la facilité d'être véritablement créatif avec arduino lorsque l'on ne bénéficie pas d'une formation initiale poussée
Sans vouloir être offensant ce n'est pas un problème d'Arduino. Tu aurais rencontré le même problème si tu avais voulu réaliser ce système par un automate mécanique.
Le passage d'une équation mathématique à un système réel n'est pas toujours trivial.
1731  International / Français / Re: Comment puis-je envoyer un array en post on: July 14, 2013, 03:10:18 pm

Mais que veux tu dire par
Quote
A chaque concaténation on gagne le terminateur de chaîne
Es-ce que le terminateur de chaine est le "\0"

Parce que la en effet, j'ai pas pensé à ca, et pour être franc je ne sais pas comment modifier mes variable/script.
Je pensais que de donner une valeur à une variable char, le \0 est automatique.

Pourrais-tu m'éclaircir, la dessus?


Oui, oui dans les affectations lors de la définition des variables et lors des opérations strcat, strcpy, str.... le terminateur est ajouté automatiquement. Par contre lorsqu'on construit une chaîne octet par octet (ce qui se produit lorsqu'on reçoit des caractères sur une liaison série par exemple) là il peut y avoir des cas où il n'y a pas de terminateur tout de dépend de la manière utilisée pour construire la chaîne.

Si tu as une chaîne de 10 caractères, il faut un tableau de 11 octets pour la stocker (10 caractères + \0)
Si tu prends 2 tableaux comme ci-dessus la concaténation des 2 chaînes donne une chaîne de 20 caractères + 1 terminateur donc il faut 21 octets. De 2 tableaux de 11 octets on arrive à 1 tableau de 21 octets

Je ne suis pas trop favorable à ceci, mais ne serait pas possible de trouver une alternative comme ceci:
Code:
String fix = "long=" + String(lon) + "&lat=" + String(lat) + "&alti=" + String(alt) + "&vel=" + String(vel) + "&time=" + String(time);
  char coord[]="";
  strcpy(coord,fix);
Dans lée cas ci-dessous, ca ne marche pas, car il n'accepte pas un String dans un char.

Mais, dans ce cas, est-ce possible de convertir un String en un char?


Il y a la méthode StringToCharArray pour faire ça.
1732  International / Français / Re: Taille des caractères des menus d'Arduino trop petite ! on: July 14, 2013, 11:32:58 am
Il y a ceci sur un des liens que t'as donné DrWaX
Fonts are Illegible

In addition to the suggestions mentioned below in #Better_font_rendering some fonts may still not be legible afterwards. If this is the case there is a good chance ms-fonts are being used. Install ttf-ms-fonts from the AUR.

Et j'ai vérifié sur ma conf j'ai les polices ms-fonts d'installées. Sur Ubuntu la paquet s'appelle ttf-mscorefonts-installer.
1733  International / Français / Re: Led clignote mais ne sort plus de la boucle.... on: July 14, 2013, 11:23:28 am
Code:
    while(ch == 'D')
      {
         if(currentMillis - previousMillis > interval) {
            // save the last time you blinked the LED
            previousMillis = currentMillis;   
            if(ledState == LOW)
              ledState = HIGH;
            else
             ledState = LOW; 
            digitalWrite(redLedDroite, ledState);
          }
         
          currentMillis = millis();
      }
A l'entrée dans la boucle ch='D'
A l'intérieur de ta boucle rien ne modifie ch.
Donc tu restes bloqué dans la boucle.
1734  International / Français / Re: Comment puis-je envoyer un array en post on: July 13, 2013, 03:31:03 pm
Quote
Mais pour une raison que j'ignore, mon programme crash 4 secondes apres avoir commencé. un peu comme si on faisait un reset
Cela me fait penser à une chaîne qui déborde.
Es-tu certain que ton tableau de 100 est suffisamment long dans tous les cas.
si on regarde ça:
Code:
char coords[100];
char lon[15];
char lat[15];
char alt[15];
char time[20];
char vel[15];
et ça
Code:
strcpy (coords,"lat=");
  strcat (coords,lat);
     
  strcat (coords,"&long=");
  strcat (coords,lon);
     
  strcat (coords,"&alt=");
  strcat (coords,alt);
     
  strcat (coords,"&vel=");
  strcat (coords,vel);
     
  strcat (coords,"&time=");
  strcat (coords,time);
On peut s'interroger

Les chaînes constantes font déjà 26 caractères
Les variables sont dimensionnées à 15 ou 20 si on fait la somme on arrive à 80 caractères.
A chaque concaténation on gagne le terminateur de chaîne pour le terme que l'on ajoute ce qui fait que l'on gagne 5 caractères. On arrive quand même à 105 caractères ce qui déborde de ton buffer de 100.

Pour dépanner, tu devrais:
  1) faire imprimer tes variables  lon, lat, alt, time, vel pour vérifier qu'elles sont correctes (un terminateur manquant lors de la construction d'une chaîne peut tout planter)
  2) faire imprimer après chaque strcat pour vérifier que la chaîne résultante n'excède pas 99 caractères (ne pas oublier de prévoir 1 caractère de plus pour la fin de chaîne)
1735  International / Français / Re: Comment puis-je envoyer un array en post on: July 13, 2013, 05:55:14 am
Quote
coords[0]=lat;
coords[1]=lon;
coords[2]=alt;
coords[3]=time;
coords[4]=vel;
Il faudrait que coords soit un tableau de tableau de char pour que cela fonctionne. Mais cela ne mettrait pas les chaînes bout à bout.
Si j'ai bien compris tu voudrais concaténer tes chaînes pour les passer en argument
Peut être que tu pourrais faire quelque chose avec strcat
Pour les besoins du test j'ai initialisé les variables.
Attention à la taille de coords si jamais la concaténation déborde cela plante le programme
Code:
char coords[100]={""};
char lon[15]={"12.324"};
char lat[15]={"4.3568"};
char alt[15]={"1234"};
char time[20]={"12:45"};
char vel[15]={"92"};
char msg1[5];
char msg2[5];

void setup(void){
  Serial.begin(9600);
  strcat(coords,lon);
  strcat(coords,"+");
  strcat(coords,lat);
  strcat(coords,"+");
  strcat(coords,alt);
  strcat(coords,"+");
  strcat(coords,time);
  strcat(coords,"+");
  strcat(coords,vel);
  Serial.print(coords);
}

void loop(void){}
1736  International / Français / Re: -Aide- Sculpture et arduino sur Télécran on: July 12, 2013, 03:21:09 pm
Les équations que tu utilises
Code:
  x = a * sin(radians(t)) + (t * c + (360 - t) * cc) / 360;
  y = b * sin(radians(t)) * cos(radians(t)) + (t * d + (360 - t) * dd) / 360;
x =
     a * sin(radians(t))                        <-------- pour variant de 0 à 360  sin(t) est compris entre -1 et +1 et comme a = 1 ce terme est donc compris entre -1 et +1
  + (t * c + (360 - t) * cc) / 360;        <-c=0 et cc=0 donc ce terme est nul

Au bout du compte x compris entre -1 et +1.
Pour y je te laisse faire la calcul

Si tu veux un mouvement notable il faut jouer sur a, b, c, cc, d et dd pour modifier la forme.
a et b vont dilater la forme alors que le autres termes vont jouer sur son positionnement.
Au passage, les variables cc et dd ne sont pas initialisées ce qui fait qu'à la première itération de la boucle elles pourraient avoir une valeur quelconque.
1737  International / Français / Re: -Aide- Sculpture et arduino sur Télécran on: July 12, 2013, 09:55:00 am
Là pas bon
Code:
motorA.step((oldx - x)*10,FORWARD,SINGLE);
 motorB.step((oldy - y)*10,FORWARD,SINGLE);
 
 oldx = x;           //<----- là tu mets oldx = x
 oldy = y;
 
 delay(500);
 Serial.println(oldx-x);   // <--- donc là comme oldx et x sont égaux la différence est nulle

Là bon
Code:
motorA.step((oldx - x)*10,FORWARD,SINGLE);
 motorB.step((oldy - y)*10,FORWARD,SINGLE);

 Serial.println(oldx-x);   // <--- là oldx vaut la valeur de x à la précédente itération
 
 oldx = x;
 oldy = y;
 
 delay(500);
 
1738  International / Français / Re: Taille des caractères des menus d'Arduino trop petite ! on: July 11, 2013, 02:07:51 pm
Quote
Mais ça n'a aucun effet sur la taille de police de caractère des menus
Je me suis trompé.

Je suis sur Ubuntu même version java que toi et mes menus ont une police plutôt grosse bizarre!!!

Je viens de vérifier et par contre moi je suis toujours en version 1.0 de l'IDE
1739  International / Français / Re: Taille des caractères des menus d'Arduino trop petite ! on: July 11, 2013, 10:52:26 am
Regarde dans ton home le répertoire caché .arduino
il y a un fichier preference.txt tu l'ouvres avec ton éditeur préféré et tu cherches une ligne commençant par editor.font (ne pas confondre avec editor.font.macosx).
Là tu mets la police que tu veux dans le corps que tu veux.
Et tu vas voir qu'il y a plein d'autres options auxquels tu n'avais peut être pas pensé.
1740  International / Français / Re: Question pointeurs on: July 11, 2013, 10:38:36 am
Tu peux utiliser un pointeur de type void et ajouter un argument pour dire combien d'octet à transférer.
Mais le C++ te permet d'avoir plusieurs fonctions portant le même nom avec des arguments de type différents c'est le compilateur qui gère.
Exemple simple
Code:
float a=2.0,b=3.4;
int c=5,d=2;

void setup (void){
  Serial.begin(9600);
}

boolean superieur(int va, int vb){
  return(va>vb);
}

boolean superieur(float va, float vb){
  return(va>vb);
}

void loop(void){
  Serial.print(superieur(a,b));
  Serial.print(superieur(c,d));
}
Pages: 1 ... 114 115 [116] 117 118 ... 243