[resolu] le type string qui me fait tourner en bourique

salut salut
bon ca fonctionne avec gogol

Alors voila je suis sur un projet avec le shield ethernet v2 ou tout fonctionnai bien carré jusqu’à ce que je fasse appel à la fontion url()
comment dire…

#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include "traitementRequetes.h"
#include "gestionDonnees.hpp"

#define SD_CS_PIN 47

bool isOn = false;

byte macAddr [] = {0xA8, 0x61, 0x0A, 0xAE, 0x7B, 0xB5};
IPAddress ipAddr(192, 168, 0, 42), mask(255, 255, 255, 0);
int serverPort = 4200;
EthernetServer server(serverPort);

void setup()
{
//tout le cirque d'initialisation
}


void loop()
{
  EthernetClient client = server.available();
  if (client.connected())
  {
    if (client.available())
    {
      String requestText(getRequest(client));
      Serial.print(requestText);
      Request clientRequest(requestText);
      if(!clientRequest.valid())
      {
        Serial.println("requete invalide (!clientRequest.valid())\n\n");
      }
      Serial.println("type de requete : " + clientRequest.type());
      Serial.println("url demandee : " + clientRequest.url());
      Serial.println("fichier demande : " + clientRequest.urlPath());
      Serial.println("parametres : " + clientRequest.urlParameters());
      Serial.print("nombre de parametres : ");
        Serial.println(clientRequest.nbParameters());
      Serial.print("parametres separes : ");
        Serial.println(clientRequest.parameter());
        
      int i = 0;
      while(i < clientRequest.nbParameters())
      {
        Serial.print("parametre ");
          Serial.print(i);
          Serial.println(" : ");
          Serial.print("\t nom : ");
          Serial.println(clientRequest.getParameter(i).param);
          Serial.print("\t valeur : ");
          Serial.println(clientRequest.getParameter(i).value);
          i++;
      }
      Serial.println(client.available());
      //sendD(client);
      url(clientRequest, client);
      client.stop();
    }
  }
}

donc dans le constructeur de Request clientRequest(requestText); situé dans traitementRequetes.cpp, j’analyse toute la requete envoyée par le client. ca tournait bien rond (c’etait carré) et j’envoyai une petite page avec la fonction sendD(client) (page directement ecrite dans le code).

et puis j’ai fait la fonction url(Request req, EthernetClient client) qui renvoie au client le fichier demandé mais à partir d’une carte SD.
sauf que quand cette fonction est appelée dans le loop, le constructeur de Request ne fait plus bien son travail alors qu’il est appelé avant le fonction url(). Et la j’ai des sorties v=bizarres sur le moniteur série, les chaines de caractère restent vides après un +=, la carte se réinitialise intempestivent… bref c’est n’imp.

du coup est-ce que quelqu’un à une idée de ce qui se passe?
le code est en pj.
merci d’avance pour l’aide, ca fait plus d’une semaine que je suis coincé la dessus.

traitementRequetes.h (975 Bytes)

traitementRequetes.cpp (7.24 KB)

serveurEthenet.ino (4.52 KB)

gestionDonnees.cpp (1.15 KB)

gestionDonnees.h (277 Bytes)

bool url(Request req, EthernetClient client)
{
  Serial.println("\ntraitement de l'url et envoi de donnees\n");
  String fileAsk = req.urlPath();
  if (fileAsk == "/")
  {
    sendPage(client);
  }
}

Y a pas de return ?
La méthode est définie comme un bool, elle devrait renvoyer un bool...

Passez vos instances en référence pas en copie. écrivez vos fonctions comme cela

bool url(Request & req, EthernetClient & client);
bool sendPage(EthernetClient & client);
bool sendData(EthernetClient & client);

(et puis laissez tomber la classe String si vous ne maitrisez pas bien l'allocation dynamique)

merci pour vos réponses rapides
pas faux lesept, je n’avais pas fini.
J-M-L c'est vrai je n'avais même pas pensé à ça. du coup ça marche merci :slight_smile:

J-M-L:
(et puis laissez tomber la classe String si vous ne maitrisez pas bien l'allocation dynamique)

mais c'est tellement pratique quand ca fonctionne, plutôt que d'utiliser de tableaux qui n'ont meme pas de taille variable...
en fait si je veux m'en passer je doit maitriser l'allocation dynamique et si je maitrise l'allocation dynamique alors je n'aurai pas de problèmes à utiliser String...
J'ai tout compris merci ! :grin:

:slight_smile:

Avec de cString on fait souvent de l’allocation statique

cString? ca existe sur arduino?
d'ailleurs ca me fait penser à un truc : c'est quoi la macro F()?

Non cString c’est le petit nom du tableau de caractères terminé par un caractère nul - utilisé en C ou C++

choucroute_melba:
d'ailleurs ca me fait penser à un truc : c'est quoi la macro F()?

Bonjour,
c'est une macro qui te permet de stoker des données dans la mémoire flash pour ne pas encombrer la RAM.
La taille de la RAM est assez limitée et il est préférable, quand c'est possible, de la réserver pour les variables.
Bien entendu, tu ne pourras stoker que des constantes de cette manière, la mémoire flash étant statique, et tu diminueras l'espace utilisable par le programme. Tout dépend de tes besoins.
Amicalement,
naute

choucroute_melba:
c'est quoi la macro F()?

exactement @naute

pour info c'est documenté à la fin de la doc de PROGMEM

ok merci :sunglasses:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.