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

GTK+ avec C & C++ Discussion :

C, GTK+ et postgresql : récupérer le pointeur de connexion.


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    C, GTK+ et postgresql : récupérer le pointeur de connexion.
    Bonjour,
    Je suis en train d'explorer l'utilisation de postgresql pour stocker des données que l'utilisateur va saisir via un programme C/GTK+.
    Le prototype fonctionne très bien.
    Pour coller un peu plus aux recommandations du "gnome developper center", j'ai voulu faire ça, sans trop réfléchir :
    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 main (int argc, char *argv[])
    {
        GtkApplication *appli;
        int statut;
        PGconn *conn = NULL;
     
        appli = gtk_application_new("TiArn.Nantoo.PConstantes", G_APPLICATION_FLAGS_NONE);
        g_signal_connect(appli, "startup", G_CALLBACK(connexiondb), conn);
        g_signal_connect(appli, "activate", G_CALLBACK(cb_vueprincipale), conn);
        g_signal_connect(appli, "shutdown", G_CALLBACK(deconnexiondb), conn);
        statut = g_application_run(G_APPLICATION(appli), argc, argv);
        g_object_unref(appli);
     
    	return statut;
    }

    Mon problème :
    Comment récupérer le pointer de la connexion à ma database que j'ai initié via le signal "startup" ?
    La doc est assez pauvre sur le sujet et je me demande comment passer ce pointeur au signal "activate" ?
    Quand j'utilise le code ci-dessus, le signal "activate" passe en paramètre le pointer conn qui a pour valeur NULL.

    Merci par avance.

  2. #2
    Membre du Club
    Bonsoir,

    Peut-être ainsi:
    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
    17
    18
    19
    20
     
    typedef struct _MyApp {
        PGconn *conn;
    } MyApp;
     
    int main (int argc, char *argv[])
    {
        GtkApplication *appli;
        int statut;
        MyApp *conn = g_new0(MyApp);
     
        appli = gtk_application_new("TiArn.Nantoo.PConstantes", G_APPLICATION_FLAGS_NONE);
        g_signal_connect(appli, "startup", G_CALLBACK(connexiondb), conn);
        g_signal_connect(appli, "activate", G_CALLBACK(cb_vueprincipale), conn);
        g_signal_connect(appli, "shutdown", G_CALLBACK(deconnexiondb), conn);
        statut = g_application_run(G_APPLICATION(appli), argc, argv);
        g_object_unref(appli);
     
    	return statut;
    }


    Ou tout simplement en passant un pointeur de pointer g_signal_connect(appli, "startup", G_CALLBACK(connexiondb), (gpointer)&conn);:

    Bye

  3. #3
    Modérateur

    La bonne méthode est effectivement soit de passer par une structure qui contiendra les différents éléments de ton application, et où tu pourras initialiser un champ correspondant au pointeur vers ta connexion. L'autre solution si c'est la seule information que tu as à échanger, c'est d'utiliser un pointeur de pointeur (sans le cast en gpointer, qui est inutile). Si tu n'as pas trop l'habitude, l'endroit où c'est le plus utilisé dans l'API GLIb, GTK c'est pour GError. Les fonctions qui veulent renvoyer une erreur renvoient un booléen pour savoir si l'appel a fonctionné ou pas, et un GError pour avoir plus d'information. Pour cela on leur passe l'adresse d'un pointeur, qu'elles initialisent au besoin.

    Et parce que les pointeurs c'est fun:
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  4. #4
    Futur Membre du Club
    Merci beaucoup à vous deux.
    Le pointeur de pointeur me convient très bien. C'est l'idéal pour ce que je veux faire.
    Encore merci et bonne journée.