2010-07-06 3 views
-1

У меня есть функция обратного вызова, которая имеет параметр const unsigned char *pData. каждый раз, когда я нажимаю функцию обратного вызова, мне нужно сохранить значение pData в моей локальной переменной unsigned char*. Есть ли какая-либо функция для копирования данных?как скопировать данные?


Edit: Вот пример кода:

void Callbackfun(int x, const unsigned char* pData, const UINT cbData) { 
    switch(x) { 
    case 0: 
     // ptr is a global variable of structure containg name and number 
     ptr.name = (unsigned char*)pData; 
     break; 
    case 1: 
     ptr.number = (unsigned char*)pData; 
     break; 
    } 
} 

теперь каждый раз, когда эта функция называется я хочу сохранить pData значения в моей локальной структуры (как показано ptr.name).

+0

Что вы подразумеваете под 'копией данных'. Почему вы не используете непосредственно оператор '='? –

+0

Вам нужно будет отправить код. –

+0

Я не уверен, что правильно понял вопрос. это 'char c = * p;' что вы хотите сделать? – Naveen

ответ

2

В вашей функции обратного вызова вам потребуется выделить локальную память для ваших «данных». Таким образом вы можете сохранить его, когда вызывающая функция оставляет область. Если вы знаете длину данных и длина согласована, у вас есть два варианта. Динамическое выделение или выделение в стеке. Пример кода не проверен.

Вот динамическое распределение и копия.

unsigned char* localData = new unsigned char[42]; 
memcpy(localData, pData, 42); 

Вот стек выделяется версия

unsigned char localData[42]; 
memcpy(&localData, pData, 42); 

Я предполагаю, что вы не передаете строку данных, так как вы используете символ без знака. Поскольку вы имеете дело только с указателем, вам нужно знать размер буфера для выделения.

Если у вас нет постоянной длины данных, вам необходимо передать это как второй параметр вашей функции обратного вызова.

+0

@sbi Я написал пример, предполагающий данные строки переменной длины, а затем реализовал это могут быть не строковые данные. Я удалю инициализацию памяти. – nathan

+0

char * a = NULL; \t char * s = NULL; \t a = (char *) calloc (1, (sizeof (char))); \t s = (char *) calloc (1, (sizeof (char))); \t a = "DATA"; \t memcpy (s, a, (strlen (a))); \t printf ("% s", s); Можете ли вы рассказать мне, почему его печать DATA½½½½½½½½½ ■ ε ■ ???? Как печатать только DATA ?? Спасибо – SPB

+0

@SPB Я предлагаю добавить код, который у вас есть, в ваш комментарий к вопросу. Это позволит другим людям лучше ответить на ваш вопрос. Короткий ответ: ваша строка не завершена нулем. Когда вы вызываете memcpy, вы обрезаете свой нулевой символ, поэтому printf продолжает печатать. – nathan

1

Если вы можете изменить struct что ptr, как представляется, является экземпляром, я хотел бы предложить следующее:

#include <string> 

struct ptr_type { 
    std::string name; 
    std::string number; 
}; 

ptr_type ptr; 

И для обратного вызова, предполагая, что cbData говорит нам размер буфера, на который указывает pData:

void Callbackfun(int x, const unsigned char* pData, const UINT cbData) { 

    // The following line will copy the buffer pointed to by 
    // pData into an std::string object: 
    std::string data(pData, cbData); 

    switch(x) { 
    case 0: 
     // Simple assignment of std::string objects copies the 
     // entire buffer: 
     ptr.name = data; 
     break; 
    case 1: 
     ptr.number = data; 
     break; 
    } 
} 
Смежные вопросы