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 ?
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)' –
'holder' n'est pas initialisé. – vdenotaris
Si 'holder' n'est pas initialisé, alors vous passez un pointeur non initialisé à sscanf –