IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

how to ? remplir un tableau via un callback


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut how to ? remplir un tableau via un callback
    Bien le bonjour

    je code actuellement un programme qui gere une BDD embarqué ( sqlite )

    pour exectuer des requêtes et récupérer les données ont me fournir la fonction suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     int sqlite3_exec(
      sqlite3*,                                                   /* Pointeur sur ma BDD */
      const char *sql,                                       /* requête sql */
      int (*callback)(void*,int,char**,char**),  /* fonction Callback  */
      void *,                                                    /* 1st argument du callback */
      char **errmsg                                        /* utilisé  pour les messages d'erreur */
    );
    la fonction me renvoi les données comme ceci ( c'est un exemple, mon programme travaille sur des données boursières )

    Name | Age
    -----------------------
    Alice | 43
    Bob | 28
    Cindy | 21

    donc le prototype de la callback m'est imposé

    le int représentant le nombre de colonne de la réponse

    le premier char** est un tableau de chaine contenant les valeurs de chaque colonne pour une ligne donné ( la callback étant apellé à chaque ligne autre que la 1ere )

    le second char** est un tableau de chaine contenant le nom de chacune des colonnes

    il est donc évident qu'à chaque fois le contenu de la ligne précedente est écrasé
    hors j'aimerais bien stocker ces valeurs de façons à pouvoir les réutiliser de mon programme plusieurs fois ( vu que j'ai besoin de leur appliquer plusieurs fonction )
    je pense donc les sotcker dans un tableau de chaine à 2 dimension ( donc un char*** , de façon à ensuite pouvoir traiter chaque ligne ou bien chaque colonne de façon séquentielle )

    donc je pense que le void* du callback ( envoyé par le 4ème argument de ma fonction sqlite3_exec ) doit être fait pour cela mais je n'en suis pas sur

    donc c'est pour cela que j'ai besoin de votre aide


    d'avance merci pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sysko le prospecteur Voir le message
    donc je pense que le void* du callback ( envoyé par le 4ème argument de ma fonction sqlite3_exec ) doit être fait pour cela mais je n'en suis pas sur
    Effectivement, le void * permet de passer l'adresse de n'importe quelle variable utilisateur. C'est une pratique courante (et indispensable) quand on manipule les callbacks et qu'on ne programme pas comme un barbare à coup de globales...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    ouaip je sais le mal que peut faire l'utilisation de variable globales ^^ ( effets de bord et tutti quanti )

    par contre j'arrive à passer mon tableau , ok

    ensuite

    je crée une variable char*** Tableau_temp = ( char*** ) Argument_void

    et après ? ^^

    car la callback ne me donne pas tout le tableau d'un coup mais une seul ligne par appelle ( donc dans mon cas callback est apellé une bonne centaine de fois et elle le sera surement plusieurs millier de fois quand le programme sera achevé )

    je pense pouvoir arriver à recuperer dès le debut les dimensions finale du tableau ( mais pas la taille de chaque cellule vu que ce sont des chaine de caract )

    et ensuite en admettant que j'y arrive ( à coup de malloc realoc sa devrait y aller je pense ) ?

    pour récuperer le tableau je fait comment ? ( car j'ai fait des petit test avec des requête ne me renvoyant que 5 element dans une même colonne
    donc un resultat du genre

    nom
    -----

    tata
    tooto
    titii
    tutu

    mais impossible de lire le resultat en dehors de la focntion callback ...

    donc un coup de pouce serais pas de refus


    ah oui la callback vierge donc avant que j'y mette tout mon bor***
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    int DB_CB_Query( void* Array_result, int argc, char **argv, char **azColName)
    {
     
     int i;
     
    	for(i=0; i<argc; i++)
    	{
                    // on  affiche  le resultat sur la stdout  sous la forme  nomcolonne = valeur
    		printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
     
    	}
     
    	printf("\n");
    return 0 ;
    }

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    ben la je pense que t'as pas trop le choix de faire soit une structure avec un tableau de char*** et un int (le nombre de lignes), soit une liste chainee de structures (lignes,colonnes)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    hum un tableau de char*** ?
    donc ma struct aurait cette forme la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struc  toto 
    {
      int nbrligne ;
      char**** tableau_dechar3;
     
    }
    c'est cela ?

    oui car je pense que la solution des listes chainés ne conviendra pas dans la suite de mon programme ( vu que je traiterais les resutat soit lignes par lignes ou colonnes par colonnes , donc un tableau me semble le plus approprié )

    bon et bien il ne me reste plus qu'à coder
    je pense d'abord me limiter à des resultat à une seule colonne le temps de comprendre le mecanisme et ensuite l'étendre à n colonnes ,

    à moins que passer de une à n colonnes entrainera trop de modification du code ?

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    bah juste une ou 2 etapes de pointeurs de plus...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    bon en fait mon probleme va être plus simple à resoudre que prévu ( tant mieux d'habitude c'est plus dans l'autre sens , on croit que cela va être simple et non .... )

    Je vous avoue que ce programme est l'occassion pour moi de découvrir les BDD les requêtes SQL and co ^^

    je viens de trouver la requête qui me donne le nombre de ligne du tableau de resultat d'une requête SELECT ,

    donc à présent j'ai dès le debut le nombre de ligne et de colonne de mon tableau ce qui est très bien

    il ne me reste plus qu'à avoir la taille de chaque cellule (la taille max est fixe pour toute les cellules d'une même colonne mais différe entre chaque colonne )

    donc il ne me reste qu'à savoir comment obtenir la taille max d'une cellule de chacune des colonnes et je pourrais faire un beau malloc dès le premier apelle et il n'y aura plus ensuite qu'à remplir chaque cellule

Discussions similaires

  1. remplir un tableau de structure via une fonction
    Par B65AcR dans le forum Débuter
    Réponses: 2
    Dernier message: 07/01/2014, 17h06
  2. Remplir un tableau via Javascript & Action Controller
    Par Invité dans le forum ASP.NET MVC
    Réponses: 5
    Dernier message: 21/06/2013, 14h03
  3. Remplir 2 tableaux via une fonction booléenne filtrant sur un tableau
    Par Elvaiz dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 31/03/2013, 16h06
  4. [Toutes versions] Lire un tableau via VBA pour remplir un formulaire
    Par kimai dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/07/2012, 10h07
  5. Remplir un tableau via un fichier texte en c
    Par SweetLeaf dans le forum Débuter
    Réponses: 15
    Dernier message: 23/11/2009, 12h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo