dj4400 Ответов: 2

Функция C : как передать дескриптор в качестве ссылки


Привет,

У меня есть приложение C.

Я хочу построить функцию init, которая создает дескрипторы событий, которые будут использоваться вне функции init

Что-то вроде этого:

InitEvents(HANDLE hEvent1, char *Event1Name, HANDLE hEvent2, char *Event2Name)
{
hEvent1 = CreateEvent(..Event1Name...);
hEvent2 = CreateEvent(..Event2Name...);
}

пустота главная()
{
Ручка h1,h2;

InitEvents(h1, "один", h2, "два");

SetEvent(hEvent1);
}

Как я могу передать дескрипторы по ссылке, чтобы созданные дескрипторы были доступны в основной функции?

Спасибо!

Что я уже пробовал:

Объявление InitEvents(HANDLE *hEvent1.....)
hEvent1 = CreateEvent(..Event1Name...);

2 Ответов

Рейтинг:
0

OriginalGriff

Это C, а не C# или C++: у вас нет ссылок - все параметры в C передаются по значению (то есть копия содержимого переменной передается функции, а не сама переменная).

Чтобы передать "ссылку", вы передаете адрес переменной и получаете его в функции в виде указателя:

void InitEvents(HANDLE* phEvent1 ...)
   {
   *phEvent1 = CreateEvent(...);
   ...
   }
void main()
   {
   HANDLE h1, h2;
   InitEvents(&h1, ....);
   ...
   }


dj4400

Спасибо!
Он хорошо работал с дескрипторами, но я также хочу создать общую память в функции init
это означает, что функция Init будет выглядеть следующим образом
InitEvents(HANDLE hEvent1, char *Event1Name, HANDLE hEvent2, char *Event2Name,
unsigned char* pSharedMemory, char* SharedMemName )
{
hEvent1 = CreateEvent(..Event1Name...);
hEvent2 = CreateEvent(..Event2Name...);
CreateSharedMemory(..SharedMemName ..);
}

пустота главная()
{
Ручка h1,h2;
unsigned char pBuf[1000];
InitEvents(h1, "один", h2, "два", pBuf, "общий");

SetEvent(hEvent1);
memcpy(pBuf,SomeData, DataLen);
}
Я попробовал передать **char и вызвать Init с &pBuf

CPallini

диджей забыл озвучить свое решение, возьми мои 5.

Рейтинг:
0

CPallini

Вы также можете передать массив struct в свою функцию InitEvents, что-то вроде (но более надежное)

typedef struct
{
  HANDLE handle;
  char * name;
} Event;


void InitEvents(Event event[], size_t event_count)
{ 
  event[0].handle = ...
  event[0].name = ...
  
  event[1].handle = ...
  event[1].name = ...
}

int main()
{

  Event event[2];


  InitEvents(event);

  //...
}


KarstenK

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

CPallini

Поверь мне, глобалы-это плохо.