1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
void LCD::SendString(char* strToWrite, int line, int pos)
{
[...]
while (*strToWrite) // personnellement je trouve ça dangereux comme condition !!!!
// en C quand tu initialise par exemple char* string = "ceci est une chaîne"; le compilateur insert à la fin un caractère que tu ne vois pas : \0
// c'est le caractère de fin de chaînes. Et ce fameux \0 est la condition de sortie de la boucle while. Sauf que quand tu te mets a faire des
// copie de tableau ou de chaîne de caractère en jouant avec des pointeurs de pointeurs de tableau, si jamais ce caractère passe à la trape
// la boucle while va planter et comme juste en dessous on se sert d'un pointeur, celui ci ira attérir n'importe où !!! Donc plantage.
// Ce code n'est pas prévu pour recevoir un caractère unique de type char. Ni même un tableau initialisé manuellement.
//
// Exemple qui marche :
// char* test1 = "Bonjour";
// SendString(test1, 1, 1);
//
// Exemple qui marche :
// char test2 [] = "Bonjour";
// SendString(test2, 1, 1);
// Exemple qui devrait planter car pas de \0:
// char test3 [7] = {'B', 'o', 'n', 'j', 'o', 'u', 'r'};
// SendString(test3, 1, 1);
// Exemple qui devrait planter car pas de \0:
// char test4 [7];
// test4 [0] = 'B';
// test4 [1] = 'o';
// test4 [2] = 'n';
// test4 [3] = 'j';
// test4 [4] = 'o';
// test4 [5] = 'u';
// test4 [6] = 'r';
// SendString(test4, 1, 1);
// Et là ça remarche car on gère le \0:
// char test5 [8];
// test5 [0] = 'B';
// test5 [1] = 'o';
// test5 [2] = 'n';
// test5 [3] = 'j';
// test5 [4] = 'o';
// test5 [5] = 'u';
// test5 [6] = 'r';
// test5 [7] = '\0';
// SendString(test5, 1, 1);
this->Character(*strToWrite++);
[...]} |
Partager