2015-08-25 1 views
0

Vu le code comme suit:pointeurs vide, l'amélioration de la coulée de type et le code possible

void get_value_by_peek_name(json_object *json_obj, const char *peak_name, void **value) { 
    json_object *value_obj; 
    if (json_object_object_get_ex(json_obj, peak_name, &value_obj)) 
     if (json_object_is_type(value_obj, json_type_double)) 
      sscanf(json_object_to_json_string(value_obj), "%lf", *value); 
} 

Cette mise en œuvre, comme prévu, génère un avertissement:

format ‘%lf’ expects argument of type ‘double *’, but argument 3 has type ‘void *’ 

Je cherche une suggestion de mieux mettre en œuvre cette fonction et, bien sûr, éviter l'avertissement ci-dessus.

Par ailleurs, compte tenu également le code:

double timestamp; 
void *holder; 

// some other code... 
// response_obj already initialized 
get_value_by_peek_name(response_obj, "timestamp", &holder); 
timestamp = *((double *) holder); 
printf("- timestamp: %lf\n", timestamp); 

est-il un bon moyen de rendre ce code plus élégant, sans déclarer explicitement le pointeur vide holder mais en utilisant directement timestamp pour maintenir la valeur ?

+1

Dans la ligne 'sscanf (json_object_to_json_string (value_obj), "% lf", * value);', changement de '(double *) * value', et assurez-vous d'avoir 'void * holder = & timestamp;', et supprimez la ligne 'timestamp = * ((double *) holder)' –

+0

'holder' n'est pas initialisé. – vdenotaris

+0

Si 'holder' n'est pas initialisé, alors vous passez un pointeur non initialisé à sscanf –

Répondre

3

évitez l'avertissement ci-dessus.

  1. Définir get_value_by_peek_name() prendre un void* en dernier paramètre:

    void get_value_by_peek_name(json_object * json_obj, const char * peak_name, void * value) 
    
  2. Faire holder sûr des points à un double (ou au moins assez de mémoire, qui ainsi est correctement aligné pour tenir), puis

  3. correctement cast le pointeur dans l'appel à sscanf()avant déréférencer le:

    sscanf(json_object_to_json_string(value_obj), "%lf", *((double**)value)); 
    
+0

ne serait pas le cast '(double *) value' est suffisant (en supposant que vous appelez' get_value_by_peek_name (....., & timestamp); ')? –

+0

@IngoLeonhardt ce serait une approche, alk suggère une approche différente –

+1

Non, car 'value' avait été initialisé sur appel en tant que' & holder'. Cela s'applique à la façon dont l'OP appelle 'get_value_by_peek_name()'. – alk