Ich habe eine XML-Datei mit Koordinaten (lon, lat) und einer ID. Das Problem ist, ich möchte diese Informationen in einem HashMap
speichern, aber ich weiß nicht die Größe Max meiner Datei. Ich sah einige Beispiel in internet:HashMap mit search.h
#define _GNU_SOURCE
#include <search.h> // hcreate_r() hdestroy_r() struct hsearch_data
#include <string.h> // memset()
#include <stdio.h> // perror()
#include <stdlib.h> //exit()
#define TAB 4
...
struct hsearch_data hash;
size_t max_element = 42; // of elements in search table
...
char *food[] = { "Apple",
"Banana",
"Lemon",
"Carrot"
};
char *color[] = { "red",
"yellow",
"yellow",
"orange"
};
// we create the hash
memset(&hash, 0, sizeof(hash));
if (hcreate_r(max_element, &hash) == 0) {
perror("hcreate_r");
exit(1);
}
/*
adding some elements
*/
// we destroy the hash
hdestroy_r(&hash);
max_element
ist weiß nicht, in meinem Fall, und ich weiß nicht, wie das beheben, hier mein Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <libxml/tree.h>
#include <libxml/parser.h>
#define MAX_REF_LEN 10
static char der_ref[MAX_REF_LEN + 1];
static xmlChar *der_intitule = NULL;
void debut_document(void *user_data) {
*der_ref = '\0';
der_intitule = NULL;
}
void debut_element(void *user_data, const xmlChar *name, const xmlChar **attrs) {
if (xmlStrEqual(name, BAD_CAST "node")) {
if (NULL != attrs) {
int i;
for (i = 0; attrs[i] != NULL; i += 2) {
if (xmlStrEqual(attrs[i], BAD_CAST "lat")) {
strncpy(der_ref, (char *)attrs[i + 1], MAX_REF_LEN);
printf("lat %s\n", der_ref);
} else
if (xmlStrEqual(attrs[i], BAD_CAST "lon")) {
strncpy(der_ref, (char *)attrs[i + 1], MAX_REF_LEN);
printf("lon %s\n", der_ref);
}
}
}
}
}
int main() {
xmlSAXHandler sh = { 0 };
sh.startDocument = debut_document;
sh.startElement = debut_element;
if (xmlSAXUserParseFile(&sh, NULL, "map.osm") != 0) {
fprintf(stderr, "Une erreur est survenue lors du parsing\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
ich nicht das umgesetzt haben Bibliothek suchen, aber ich möchte meine HashMap in meiner debut_element
Funktion erstellen.
"map.osm" ist meine XML-Datei, aber die Größe ist nicht fix.
['hsearch'] (http://linux.die.net/man/3/hsearch_r) ist eine sehr eingeschränkte Implementierung der Hash-Tabelle: Sie hat eine feste maximale Größe und erlaubt keine Schlüssel zu löschen. Sie könnten mit einer anderen, vielseitigeren Hashtabellenimplementierung besser dran sein. (Oder Sie könnten Ihre eigenen rollen, es ist nicht so schwer.) –
Es ist nicht klar aus Ihrer Problembeschreibung, was Ihr Schlüssel für die Hash-Karte ist. Wenn Sie Knoten nach Koordinaten suchen möchten, ist ein kd-Baum oder eine andere räumliche Darstellung möglicherweise besser. –
Schlüssel: ID Wert: (lon, lat) Beispiel für Knoten: Wir benutzen hier id, lat und lon Der Rest des Knotens ist nutzlos für mein Programm. Kann ich ein Paar als Wert in der Suche verwenden? –
Jackie