2011-11-07 4 views
1

Je suis mettre en œuvre un objet DBUS avec fixations Glib et ai des problèmes avec GArrays retour:DBUS serveur Crashing

gboolean TestObject_get_data(TestObject* obj, GArray* buffer, GError** error) 
{ 
    int i; 

    printf("%s Entering\n", __PRETTY_FUNCTION__); 

    buffer = g_array_new(FALSE, FALSE, sizeof(char)); 

    if(buffer) 
    { 
     for(i = 0; i < 5 ; i++) 
     { 
      g_array_append_val(buffer, i); 
     } 
     return TRUE; 
    } 

    /* TODO: Error handling */ 

    return FALSE; 
} 

Quand j'appelle la méthode de l'objet avec un client de test, je reçois une erreur de segmentation:

[email protected]$ ./testObject 
TestObject_get_data Entering 

** ERROR **: out of memory 
aborting... 
Aborted (core dumped) 

Le programme se bloque après le retour de la fonction. C'est la première fois que j'utilise Glib, il y a peut-être quelque chose qui me manque. J'ai lu this tutorial, et la plupart des exemples fonctionne. Malheureusement, il n'a pas d'exemple pour renvoyer un tableau au client.

+0

On dirait que @Mike est correct. Vous créez une nouvelle zone de mémoire et obtenez une adresse. Vous devez en quelque sorte transmettre cette adresse à l'appelé. La réponse est un pointeur vers un pointeur. – Earlz

Répondre

1

Si vous souhaitez attribuer le tableau à votre fonction, vous devez transmettre une référence. Votre fonction actuelle perd de la mémoire puisque vous affectez une variable locale lorsque vous créez le tableau.

gboolean TestObject_get_data(TestObject *obj, GArray **buffer, GError **error) 
{ 
    if (buffer) { 
     *buffer = g_array_new(FALSE, FALSE, sizeof(char)); 
     if (*buffer) { 
      int i; 
      for (i = 0; i < 5 ; ++i) { 
       g_array_append_val(*buffer, i); 
      } 
      return TRUE; 
     } 
    } 
    return FALSE; 
} 
+0

Bonne prise. Certains comment j'ai raté ça. – waffleman