2017-08-01 1 views
0

J'essaie de faire un simple programme getter setter de la chaîne en utilisant avro-c.erreur lors de l'obtention de la chaîne avro

Mon code est:

avro_value_t frame_value; 
avro_schema_t frame_schema = avro_schema_string(); 
avro_value_iface_t *frame_iface = avro_generic_class_from_schema(frame_schema); 
avro_generic_value_new(frame_iface, &frame_value); 

char *name; 
int size; 

avro_value_set_string(&frame_value,"hello"); 
avro_value_get_string(&frame_value,name,&size); 
printf("\nname is %s",name); 
printf("\nsize is %d",size); 

mais il émet une chaîne vide, bien que la taille est correcte qui est 6, y compris le caractère nul. Qu'est-ce que je fais mal?

+1

Quels avertissements ont votre impression du compilateur? Et qu'avez-vous essayé de les faire taire? – Gerhardh

+0

Suppression de tous les avertissements. Working.size doit être de type size_t. Je pensais que int peut être casté à size_t. –

+0

'int' et' size_t' peuvent avoir une taille différente. Il pourrait y avoir une raison pour laquelle 'size_t' existe. ;) Et votre compilateur n'a pas crié mal sur le type incorrect pour 'name'? Outre les autres défauts présentés dans la réponse de AndreKampling, qui ne sont pas faciles à corriger. Si votre compilateur fournit un indice, écoutez! – Gerhardh

Répondre

0

Il doit être le suivant, notez &name au lieu de name:

avro_value_get_string(&frame_value, &name, &size); 

que la fonction attend un double pointeur à caractère constant. Il est nécessaire de placer le pointeur sous le capot sur le tableau de caractères interne défini par le setter.

Voir here in the API documentation:

int avro_value_get_string(const avro_value_t *value, 
          const char **dest, size_t *size); 

Assurez-vous également votre pointage de pointeur name à caractère constant et votre size étant un type size_t pas int:

const char *name; 
size_t size; 

De plus après l'utilisation avro_generic_value_new vous avez à désaffecter l'espace après l'utilisation par:

avro_generic_value_free(&frame_value); 

vous devez également utiliser:

avro_value_iface_decref(frame_iface); 
avro_schema_decref(frame_schema); 

que l'API fait comptage de référence, il est nécessaire de libérer l'espace après l'utilisation.


De plus, je vous recommande de toujours vérifier les valeurs de retour des fonctions, ils sont int ou un pointeur et le sens est expliqué par les API documentation:

La plupart des fonctions dans le retour de la bibliothèque Avro C un seul code d'état int. Suivant la convention POSIX errno.h, un code d'état de 0 indique le succès. Les codes non nuls indiquent une condition d'erreur. Certaines fonctions renvoient une valeur de pointeur au lieu d'un code d'état int; pour ces fonctions, un pointeur NULL indique une erreur.

Vous pouvez récupérer une description de la chaîne de l'erreur la plus récente en utilisant la fonction avro_strerror:

avro_schema_t schema = avro_schema_string(); 
if (schema == NULL) { 
    fprintf(stderr, "Error was %s\n", avro_strerror()); 
} 
+0

il se ferme avec un défaut de segmentation.Débogué avec le nom gdb a une certaine valeur indésirable (gdb) p nom $ 2 = 0x100000000 "\ 317",

+0

Salut @sanyamjain si cela ou une réponse a résolu votre question s'il vous plaît envisager [acceptant] (https://meta.stackexchange.com/q/5234/179419) en cliquant sur la coche. Ceci indique à la communauté plus large que vous avez trouvé une solution et donne une certaine réputation à la fois le répondeur et vous-même. Il n'y a aucune obligation de le faire. –