2011-12-17 3 views
0

Я пытаюсь реализовать функцию обратного вызова, которая возвращает массив указателей. Вот мой код, но я продолжаю получать сообщение об ошибке. Кто-нибудь знает правильный синтаксис для функции обратного вызова, которая возвращает массив указателей?Как написать функцию обратного вызова, которая возвращает массив указателей?

код:

//The original array is here: 
    __declspec(dllexport) bot_movestate_t *botmovestates[MAX_CLIENTS+1]; 
    __declspec(dllexport) struct bot_movestate_s **Getbotmovestates(void) 
    { 
     return botmovestates; 
    } 

/---------------/

//The caller  
    struct bot_movestate_s *ai_main_botmovestates[MAX_CLIENTS+1]; 
    typedef struct bot_movestate_s **(* fGetbotmovestates_t)(void); 
    struct bot_movestate_s **fGetbotmovestates(fGetbotmovestates_t pfGetbotmovestates){ 
     return pfGetbotmovestates(); 
    } 

    //sm func 
    void smfunc() 
    { 
     fGetbotmovestates_t pfGetbotmovestates; 
     HMODULE hLib; 

    ///////////////////////////// 

     hLib = LoadLibrary(TEXT("smdll.dll")); 
      if (hLib == NULL) { 
      //Module not found, permission denied, ... 
      return; //inform caller of error 
     } 

     pfGetbotmovestates = (fGetbotmovestates_t)GetProcAddress(hLib, TEXT("Getbotmovestates")); 
     if (pfGetbotmovestates == NULL) { 
      return; 
     } 

     ai_main_botmovestates = fGetbotmovestates(pfGetbotmovestates);//error C2106: '=' : left operand must be l-value 

    ///////////////////////////// 

    } 
    //error 
    error C2106: '=' : left operand must be l-value 
+0

Либо вернуть _pointer к pointer_ или использовать контейнер, как 'g_list' (от БОЙКОГО) вместо массива и возвращает указатель на это. – ApprenticeHacker

ответ

1

Вы объявили ai_main_botmovestates как массив указателей, но вы пытаюсь присвоить ему одно значение. Либо вам нужно объявить его как указатель на указатель, либо вам нужно назначить один элемент массива.

+0

Я переопределил это так, но теперь я получаю указатель на первую ячейку в массиве, а не на весь массив. У кого-нибудь есть идеи по синтаксису записи? struct bot_movestate_s ** ai_main_botmovestates; typedef struct bot_movestate_s ** (* fGetbotmovestates_t) (void); – user598208

2

Не возвращайте массивы.

Вместо этого сделать вызывающий передать массив, который вы заполните.

Если выделить и возвращает массив, вы в конечном итоге с проблемами несогласованной deallocator, когда абонент переходит освободить его.

Другим вариантом является использование SAFEARRAY, где распределитель и дезактиватор предоставляются ОС, а не поставщиком вашего компилятора.

+0

Код, который выделяет/dellocates массив, написан уже в исходном коде. Я просто хотел бы получить доступ к этому массиву извне. Вы знаете, какой синтаксис выше неверен? – user598208

0

Я изменил определение:

struct bot_movestate_s **ai_main_botmovestates; 
Смежные вопросы