[Résolu] Déclaration initialisation d'une fonction - portée des variables

Bonjour,
Débutant en Arduino et en C, je fais des exercices classiques. (webserver)
J’arrive à créer des variables simples.
Dans l’extrait suivant, je voudrais mettre la Réponse au client “client.println(…”
soient une vingtaine de lignes dans un sous programme. Pas moyen d’y arriver.

//                             Je passe les lignes d'initialisation
void loop(){
  // Traitement d'un requete GET sur la liaison Ethernet
  EthernetClient client = server.available(); // Page demanndée
  if (client) { 
    // traitement de la demande du browser internet
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
   //  ... etc...                      je passe qq lignes
        // --- Réponse au client ---
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.println("<html>");
        client.println("<head>");
    // .... etc...

J’ai mis l’ensemble des lignes concernées dans un sous-programme, quelque chose comme :

void reponse_client( ?? .client ){
        client.println("HTTP/1.1 200 OK");
        // .... etc...     une vingtaine de lignes
   }

et je voudrais l’appeler par :

        // --- Réponse au client ---
  reponse_client( ?? .client )

Je n’y arrive pas. Le b-a ba ! A priori quelque chose de simple pour un connaisseur ?
Merci pour votre aide.
(c’est la 1ère fois que j’insère du code . Il n’y a pas les couleurs habituelles ??)
Geryko

Salut,

Essaye :

void reponse_client(*EthernetClient MonClient) {

*MonClient.println("HTTP/1.1 200 OK");
*MonClient.println("Content-Type: text/html");
.....

}

Avec un appel comme ça :

reponse_client(&client);

Bonjour B@tto,
Désolé, ça ne foncfionne pas.
J'ai les erreurs suivantes à la "Vérification" :

WebServer_gery_21b_void:51: error: variable or field 'reponse_client' declared void
WebServer_gery_21b_void:51: error: expected primary-expression before 'MonClient'
WebServer_gery_21b_void:231: error: variable or field 'reponse_client' declared void
WebServer_gery_21b_void:231: error: expected primary-expression before 'MonClient'

ma ligne 51 = byte ip = { 192, 168, 0 , 112 };
ma ligne 231 = void reponse_client(*EthernetClient MonClient) {

et en prime, je lis l'anglais sur google traduction.
J'ai essayé d'autres petites modifs mais sans succès.
Geryko

Ce ne serait pas plutôt

void reponse_client(EthernetClient *MonClient) {

MonClient->println("HTTP/1.1 200 OK");
MonClient->println("Content-Type: text/html");
.....

}

Bonsoir B83s,
Désolé, ça ne foncfionne pas mais ça s'en approche ?
J'ai les erreurs suivantes à la "Vérification" :

WebServer_gery_21b_void.ino: In function 'void reponse_client(EthernetClient*)':
WebServer_gery_21b_void:232: error: request for member 'println' in 'MonClient', which is of non-class type 'EthernetClient*'
WebServer_gery_21b_void:233: et toutes les autres lignes.

ma ligne 232 = MonClient.println("HTTP/1.1 200 OK"); (la 1ère ligne de la fonction et les autres)
Géryko

ah … chez moi ce code compile sans erreurs …

#include <Ethernet.h>
#include <HttpClient.h>
#include <SPI.h>

EthernetClient client;
EthernetServer server(80);
byte mac[] = { 0x00, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

void setup() {
  Ethernet.begin(mac);
}

void loop() {
  EthernetClient client = server.available(); 
  if (client) { 
    // traitement de la demande du browser internet
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //bla bla bla
        reponse_client(&client);
     }
   }
  }
}

void reponse_client(EthernetClient *MonClient) {

    MonClient->println("HTTP/1.1 200 OK");
    MonClient->println("Content-Type: text/html");

}

Je me disais aussi …

Bonjour B83s,
ça fonctionne et c’était bon à ton 1er post. Mea-culpa

Je n’avais pas vu sur tes lignes du sous-programme le “->” remplaçant un “point”
il y avait MonClient . println(“HTTP/1.1 200 OK”);
il fallait MonClient->println(“HTTP/1.1 200 OK”);
J’avais seulement corrigé le nom du sous-programme (en déplaçant l’étoile).

Par contre, je n’avais pas les 2 lignes de configuration suivantes :
#include <HttpClient.h>
EthernetClient client; (J’avais seulement #include <Ethernet.h>)
et je m’aperçois qu’en les supprimant elles ne sont pas indispensables ?
Faut-il vraiment les mettre ? (1)
Je n’aime pas l’inutile (ou alors il faudrait en donner la raison).

Pour maîtriser les déclarations, les syntaxes et les variables j’ai encore
“du pain sur la planche” !

Merci à vous B83s et B@tto pour vos réponses ultra rapides.
Géryko

(1) Je n’ai plus d’erreurs mais mon disque dur de PC avec Auduino vient de me lacher.
Je n’ai pas pu faire le test réel. Pas avant 2 ou 3 jours car je dois tout réinstaller / télécharger.
(depuis qq jours j’avais un bruit bizarre, ce matin j’avais justement sauvegardé mes fichiers. Ouf !)

J'ai fait ce test vite fait sur un morceau de code qui fonctionnait ... Alors peut être que la librairie http.h n'est pas utile, je n'ai pas vérifié ...

Depuis le dernier crash de disque dur... Je mets tous mes codes arduino sur drop box ... Et sur Google drive une fois par semaine... Suis un peu parano :astonished:

B83s:
Depuis le dernier crash de disque dur... Je mets tous mes codes arduino sur drop box ... Et sur Google drive une fois par semaine... Suis un peu parano :astonished:

Le plus simple c'est encore de créer le répertoire sketchbook dans le répertoire Dropbox comme ça c'est sauvé en permanence. J'utilise ce principe pour pouvoir travailler indifféremment sur mon PC de bureau ou mon portable de manière totalement transparente.

+1

Je fais exactement la même chose pour les mêmes raisons xD (sauf que je suis sur OneDrive)