Получение данных xml через непрозрачный указатель

У меня возникла проблема с получением xml-части сообщения с использованием API-интерфейса поставщика. В качестве примера того, что работает: getDestination(void* message, void* destination, void* size)

vendordestinationtype_t dest;
getDestination(msg_p, &dest, 16);
printf("Received message. (Destination: %s).\n", dest.dest);

выдает: Получено сообщение. (Назначение: какой-то пункт назначения).

Однако для извлечения XML-части сообщения требуется функция getXmlPtr(void* msg, void** xml_ptr, void* xml_length)

char ptr[10000];
int size;
getXmlPtr(msg_p, (void**)&ptr, &size);
printf("Received message. (XML: %s).\n", ptr);

Итак, вопрос в том, как мне объявить и передать ptr таким образом, чтобы я мог получить информацию xml (документация поставщика действительно плохая), в основном говорится, что аргумент должен быть указателем на указатель приложения для заполнения указатель данных XML сообщения при возврате. Программист может привести возвращаемый указатель void к любой ссылке, подходящей для приложения.


person Buraan    schedule 06.01.2012    source источник


Ответы (2)


Итак, вы объявляете указатель на void как указатель на void: void *ptr;.

person Šimon Tóth    schedule 06.01.2012
comment
Я предполагаю, что приведение затем выполняется оператором printf? Я предполагаю, что это то, что я делал неправильно, когда шел к этому раньше. Спасибо! - person Buraan; 06.01.2012
comment
@Buraan Это действительно зависит от того, что вы хотите с этим делать, но да. Также вы можете использовать вызов, но вам нужен совместимый тип (указатель на массив и указатель на указатель - это две разные вещи). - person Šimon Tóth; 06.01.2012

void** означает, что вы передаете указатель по ссылке; предположительно, функция изменит это, чтобы указать, где хранятся данные XML. Итак, вам нужен указатель, а не массив:

void * ptr;
int size;
getXMLPtr(msg_p, &ptr, &size);
person Mike Seymour    schedule 06.01.2012
comment
char ** не будет неявно преобразовываться в void**. - person Šimon Tóth; 06.01.2012
comment
@Let_Me_Be: Ты прав; Я забыл включить свой мозг, копируя код. - person Mike Seymour; 06.01.2012