C++ Arduino variable [Résolu]

cricri1999 3 Messages postés lundi 15 février 2016Date d'inscription 16 février 2016 Dernière intervention - 15 févr. 2016 à 11:23 - Dernière réponse : cptpingu 3797 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 août 2018 Dernière intervention
- 16 févr. 2016 à 10:22
Bonjour,

Voilà je suis un vrai débutant en C++, j'arrive à faire ce que je veux mais là je bloque sur un problème de variable. J'ai le messahe d'erreur suivant :
exit status 1
invalid conversion from 'char' to 'const char*' [-fpermissive]

la chaine est du binaire style 101010010010100 et si je remplace

strcpy(src, ssss); par strcpy(src, "101010010010100" );

cela fonctionne.

et voici mon code :


#include <IRremote.h>

int broche_reception = 11; // broche 11 utilisée
IRrecv reception_ir(broche_reception); // crée une instance
decode_results decode_ir; // stockage données reçues
char src[40];
char ssss;

void setup()
{
Serial.begin(9600);
reception_ir.enableIRIn(); // démarre la réception
}

void loop()
{

if (reception_ir.decode(&decode_ir))
{

Serial.println(decode_ir.value, BIN);

ssss = decode_ir.value, BIN;

strcpy(src, ssss);

Serial.print(src[0]);
Serial.print(src[1]);
Serial.print(src[2]);
Serial.print(src[3]);
Serial.print(src[4]);
Serial.print(src[5]);
Serial.print(src[6]);
Serial.print(src[7]);
Serial.print(src[8]);
Serial.print(src[9]);
Serial.print(src[10]);
Serial.print(src[11]);
Serial.print(src[12]);
Serial.print(src[13]);
Serial.print(src[14]);
Serial.print(src[15]);
Serial.println(src[16]);


Serial.println("---------------");

reception_ir.resume(); // reçoit le prochain code
}
}


Avez-vous une possibilité ?

MErci de votre aide.

Christophe
Afficher la suite 

Votre réponse

5 réponses

cptpingu 3797 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 août 2018 Dernière intervention - Modifié par cptpingu le 15/02/2016 à 12:03
0
Merci
Bonjour.

char ssss représente un seul caractère.
strcpy prend en argument deux chaînes de plusieurs caractères.
Donc ssss ne peut pas "rentrer" dans un strcpy.

Le compilateur te dit (pourtant clairement) qu'on ne fait pas rentrer plusieurs caractères dans un seul.

Si "decode_ir.value" est un nombre, alors je ne vois pas l'intérêt de passer par une chaîne de caractères. Un simple masque permet de récupérer chacun des élements.
Ex:
int a = 123; // En binaire: 0111 1011

// a & 1        => 01111011 & 00000001 => 1
// a & 10       => 01111011 & 00000010 => 1
// a & 100      => 01111011 & 00000100 => 0
// a & 1000     => 01111011 & 00001000 => 1
// a & 10000    => 01111011 & 00010000 => 1
// a & 100000   => 01111011 & 00100000 => 1
// a & 1000000  => 01111011 & 01000000 => 1
// a & 10000000 => 01111011 & 10000000 => 0

// 1 << 0 => 1
// 1 << 1 => 10
// 1 << 2 => 100
// etc...

// Pour afficher le nombre binaire en partant de la fin, on ferait:
for (int i = 15; i > 0; --i)
  std::cout << a & (1 << i) << std::endl;



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
cricri1999 3 Messages postés lundi 15 février 2016Date d'inscription 16 février 2016 Dernière intervention - 15 févr. 2016 à 12:38
0
Merci
Bonjour,

un grand merci pour votre réponse et votre aide.

là je crois que ça dépasse ma connaissance de débutant. Je ne crois pas faire rentrer plusieurs dans 1 seul vu que src est un tableau ?!

Moi j'aurais besoin de chaque chiffre binaire dans un tableau, par exemple pour 1010101 :

Serial.print(src[0]); = 1
Serial.print(src[1]); = 0
Serial.print(src[2]); = 1
Serial.print(src[3]);= 0
Serial.print(src[4]);= 1
Serial.print(src[5]);= 0
Serial.print(src[6]);= 1

Vous voyez cela comme ça ?



/*
Reception infrarouge
  • /#include <IRremote.h>int broche_reception = 11; // broche 11 utilisée IRrecv reception_ir(broche_reception); // crée une instance decode_results decode_ir; // stockage données reçuesvoid setup() { Serial.begin(9600); reception_ir.enableIRIn(); // démarre la réception }void loop() { if (reception_ir.decode(&decode_ir)) { Serial.println(decode_ir.value, BIN); int a = decode_ir.value, BIN; // En binaire: 0111 1011 for (int i = 15; i > 0; --i){ std::cout << a & (1 << i) << std::endl; } Serial.println("---------------"); reception_ir.resume(); // reçoit le prochain code } }
Commenter la réponse de cricri1999
cptpingu 3797 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 août 2018 Dernière intervention - Modifié par cptpingu le 16/02/2016 à 10:06
0
Merci
Je ne crois pas faire rentrer plusieurs dans 1 seul vu que src est un tableau ?!

Si si. Ex:
char c;=> 1 caractère
char tab[40] =>  40 caractères

c = tab; // Invalide. On essaie de mettre plusieurs caractères dans un seul.

// De même
strcpy(tab, c); // Invalide, car strcpy veut: strcpy(plusieurs, plusieurs) et on lui donne: strcpy(plusieurs, un seul).


Mais encore une fois, inutile de passer par une chaîne de caractères, et pas besoin de tableau non plus. Il suffit juste de donner à print, chacun des caractères à la suite dans l'ordre.

Donc à la place des "std::cout" qui ne sont là que pour l'exemple, on peut faire:
for (int i = 0; i < 16; ++i)
{
  Serial.print(decode_ir.value & (1 << i));
}
Serial.println("---------------");


D'après la documentation (je ne m'y connais pas du tout en Arduino), il serait même possible de faire:
Serial.println(decode_ir.value, HEX);

Attention, je dis cela sans avoir vérifié.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
cricri1999 3 Messages postés lundi 15 février 2016Date d'inscription 16 février 2016 Dernière intervention - 16 févr. 2016 à 09:43
0
Merci
Bonjour,

pas facile à comprendre :-) Merci de votre aide.

dans ma fonction httRequest, j'ai un char, comment je dois formuler pour envoyer correctement :

httpRequest(decode_ir.value, BIN);

J'ai l'impression que cette suite de 10101001001 n'est pas pris comme une chaine mais chaque bite séparer !?

Je dois convertir (decode_ir.value, BIN) ?



void httpRequest (char txt) {

retourServeur[0] = "" ;
retourServeur[1] = "" ;
retourServeur[2] = "" ;

IPAddress server(192,168,1,122);

Serial.println("\nConnection au serveur...");
// if you get a connection, report back via serial:
if (client.connect(server, 80)) {
Serial.println("connecte au serveur");
// Make a HTTP request:
client.println("GET /BIN.php?code=" + txt + " HTTP/1.1");
client.println("Host: 192.168.1.122");
client.println("Connection: close");
client.println();
}
}

void loop(void) {



if (reception_ir.decode(&decode_ir)) {

Serial.println(decode_ir.value, BIN);

Serial.println("---------------");

httpRequest(decode_ir.value, BIN);

reception_ir.resume();

}


}

Commenter la réponse de cricri1999
cptpingu 3797 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 août 2018 Dernière intervention - 16 févr. 2016 à 10:22
0
Merci
Je ne m'y connais pas du tout en Arduino, donc pour les questions trop spécifiques, je t'invite à regarder la documentation.

Au niveau du C, tu sembles encore confondre caractère et texte (chaînes de caractères).
char => 1 seul et unique caractère.
char* ou char[] => Chaîne de plusieurs caractères.
Donc quand tu marques "char text", à moins que ton texte ne fasse qu'un seul caractère, tu te doutes bien qu'il y a déjà un souci....

En C, on ne peut pas faire "+" entre deux char* (ça additionnera les adresses, mais ça ne concatenera pas). En C++, une chaine de caractères s'écrirait plutôt "std::string" et là, le "+" fait bien ce que tu attends. Si tu utilises du C++, préfère donc "std::string" à "char*", ça te simplifiera la vie (un std::string se converti en char* en utilisant sa méthode ".c_str()", ce qui te permet de le faire "rentrer" dans les fonctions qui te demande du char*).
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.