Bataille contre les pointeurs

Bonjour,

N’étant pas expert en code, je fais tout pour éviter d’avoir affaire aux pointeurs, mais malgré mon abnégation, ils finissent toujours par me rattraper…

Je code un petit programme de manipulation de trames GPS, le code marche bien, je suis maintenant en train de créer une librairie afin de raccourcir mon code, et d’implémenter un menu. Mais voila ce qui marchait sur mon code sans librairie, ne marche maintenant avec une librairie, et me retourne une erreur :
Programme_final_librairies.ino: In function ‘void loop()’:
Programme_final_librairies:33: error: invalid conversion from ‘char*’ to ‘char’
Programme_final_librairies:33: error: initializing argument 1 of ‘int USBL::checkline(char)’

Voici mon main:

#include <USBL.h>
#include <ctype.h>
#include <string.h>

/*librairie USBL*/
USBL usbl;

/*--------déclaration des variables globales au programme------*/
extern char line[200];          
extern int length;          


/*-------- fonction de setup des ports série ----------*/
void setup(){                  
  Serial.begin(4800);         
  Serial1.begin(19200);       
  Serial2.begin(4800);        
  Serial3.begin(19200);
  for (int i=0;i<200;i++) {          //RAZ du buffer
      line[i] = ' ';
  }
}

void loop(){
char ByteGAPS=-1;                     //variable de chaque byte reçus de la GAPS
int result = 0;                       //résultat de reconnaissance de ligne
if(Serial.available()){               //si on reçoit qqchose sur le port d'entrée
  ByteGAPS=Serial.read();             //on store le bit reçu dans ByteGAPS
  line[length]=ByteGAPS;              //on store le ByteGaps indexé dans le buffer de lignes
  length++;   
  if(ByteGAPS == 13){                 //si on recoit un bit de retour chariot (correspondant à la fin d'une ligne) ('/n' == 0x13)
    line[length] = (0);               //declaration de la fin de ligne
    result = usbl.checkline(line);    // "1" si GGA, "2" si PTSAG
  }
}


}

Mon .cpp:

#include "USBL.h"
#include "string.h"
#include "ctype.h"


USBL::USBL() {
	};

USBL::~USBL() {
	};

char line[200];						//déclaration du buffer de ligne
int length = 0;						//compteur de l'index du buffer de ligne


/* Fonction de reconnaissance de ligne, renvoie "1" pour GGA, "2" pour PTSAG */
int USBL::checkline(char ligne[]) {
char commandGPGGA[7] = "$GPGGA";    //pour vérifier le début des lignes voulues
char commandGPVTG[7] = "$GPVTG"; 
char commandHEHDT[7] = "$HEHDT";
char commandPTSAG[7] = "$PTSAG";
int bien = 0;						//compteur de reconnaissance de début de lignes
Serial2.print(line);
int i;
int j;
for (i=0; i<7;i++){                  //boucle de reconnaissance de début de ligne
	Serial2.print("test");
	if(ligne[i] == commandGPGGA[i-1]){                //En cas de ligne GPGGA, on renvoie "1"
        bien++;
        if (bien == 6){
			Serial2.println("ligne GPGGA");
			Serial2.println(ligne);
			return 1;
        }
      } else if (ligne[i] == commandHEHDT[i-1]){      //En cas de ligne HEHDT, on renvoie "1"
        bien++;
        if (bien == 6){
			Serial2.println("ligne HEHDT");
			Serial2.println(ligne);
			return 1;
        }
      } else if (ligne[i] == commandGPVTG[i-1]){      //En cas de ligne GPVTG, on renvoie "1"
        bien++;
        if (bien == 6){  
			Serial2.println("ligne GPVTG");
			Serial2.println(ligne);
			return 1;
        } else if (ligne[i] == commandPTSAG[i-1]){      //En cas de ligne PTSAG, on renvoie "2"
        bien++;
        if (bien == 6){  
			Serial2.println("ligne PTSAG");
			Serial2.println(ligne);
			return 2;
    } 
	for (j=0;j<200;j++) {          //RAZ du buffer
      ligne[j] = ' ';
    }
    length = 0;                    //RAZ de l'index du buffer 
}

}

Et enfin mon .h:

#ifndef USBL_H
#define USBL_H

#include "Arduino.h"

class USBL {
private:
//rien

public:
	USBL();
	~USBL();
	int checkline(char);
};

#endif

Ma question est la suivante, à quel moment mon paramètre ligne est associé à un pointeur ? Est-ce lors de sa déclaration char line[200], je pensais que cette déclaration était associé à un tableau de char de 200 caractères justement. Ou ai-je fais une erreur dans la déclaration des variables dans la librairie (ce qui est fort probable).

Merci à vous, Vincent

Quand tu définis un tableau, implicitement tu définis un pointeur
char toto[100]; crée un tableau de 100 octets
toto est un pointeur sur le premier élément

Mais ton erreur est dans le .h

Dans le .cpp tu as écrit ça:
int USBL::checkline(char ligne) {

Dans le .h, tu as écrit ça:
int checkline(char);

Dans le .h il faudrait écrire
int checkline(char*);
ou ça
int checkline(char);
puisque la méthode checkline attend un tableau de char

Mais si je comprend bien, chaque caractère du tableau correspond à un pointeur non ?

toto[0]* est un pointeur sur le premier élément, et toto est un pointeur sur le tableau ? Désolé si je m'embrouille, tu as le droit de me renvoyer à un tuto, je le mérite !

Ok pour le reste, j'ai été bête de différer entre le .cpp et le .h

Merci beaucoup !

Non, en parlant directement en code :

toto; // = pointeur
toto[1] // = élément pointé à l'adresse pointée par toto + (1*emplacement d'un élément)

Donc par exemple :

int tableau[] = {2,8,5};

int test1 = maFonction(tableau);  // retournera 2*8*5 = 80
int test2= maFonction(talbeau[1]); // retournera 2*8 = 16

int maFonction(int x) {

return (x*2);

}

inbt maFonction(char* tab) {

return (tab[0]*tab[1]*tab[2])

}

D'accord j'ai saisi, j’attends encore d'en avoir besoin dans un application dans mon code pour vraiment comprendre la nécessite des pointeurs (bien que remarque sans le savoir je les utilisais déjà).

Merci pour vos réponses !

Vincent

En fait les pointeurs t'en a pas besoin jusqu'à ce que tu les découvres xD