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 ...