Bonjour,
Je dispose d'une base de données avec des numéros de téléphone, je souhaite récupérer ces numéros depuis mon programme c++. J'ai donc créer une fonction callback que j'utilise lors de l'appel de sqlite3_exec.
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 int SMS::setRecipients(){ char** recipients; recipients = (char**) malloc(128*sizeof(char*)); for(int i = 0; i < 128; i++) recipients[i] = (char*) malloc(16 * sizeof(char)); recipients[0] = "1"; bd.setSql("SELECT tel FROM Sms WHERE etat = 1"); sqlite3_exec(bd.getConnection(), bd.getSql().c_str(), callbackGetRecipients, recipients, NULL); std::cout << "requete : ok" << std::endl; for(int i = 1; i < atoi(recipients[0]); i++){ this->recipients += "*"; this->recipients += recipients[i]; } std::cout << this->recipients << std::endl; }
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int callbackGetRecipients(void *recipients, int nbCol, char** res, char** name){ char **temp = (char **)recipients; int i = atoi(temp[0]); strcpy(temp[i], res[0]); i++; char buffer[16]; memset(buffer, 0, 16); sprintf(buffer, "%d", i); strcpy(temp[0], buffer); return 0; }
La fonction callback est appelée pour chaque ligne retournée par la base de données. Afin de savoir quel ligne je suis en train de traiter j'incrémente la variable i et je stock son résultat dans la case 0 du tableau "recipients". A chaque passage dans la fonction callback je récupère la valeur contenu dans recipients[0] afin de savoir dans quel case je dois stocker le résultat.
L'erreur intervient sur la ligne 10 de la fonction callback : "Erreur de segmentation".
Cependant si je remplace strcpy(temp[0], buffer); par strcpy(temp[1], buffer); (en changeant de case), je n'ai plus cet erreur.
Je ne peux donc pas avoir accès à la même case que celle que j'ai utilisé pour la récupération de l'index (i).
Je ne comprend pas à quoi est dû cet erreur, si quelqu'un peut m'aider ...
Partager