Arrays/Zeiger und Callbackfunktionen

Gast #5111609
Lesenswert?

Moin Zusammen,
ich habe zwei Fragen. Meine erste Frage bezieht sich auf Arrays und 
Zeiger.

Sind folgende beide Codeabschnitte identisch?
1
#define MAX_EVENTS 100
2
struct epoll_event *events;
3
events = malloc (sizeof (struct epoll_event) * MAX_EVENTS);
1
#define MAX_EVENTS 100
2
struct epoll_event events[MAX_EVENTS];

Und meine zweite Frage bezieht sich auf folgenden Abschnitt:
1
  int n = epoll_wait (epollfd, events , num_events, -1 );
2
    for (int i = 0; i < n; ++i) {
3
        if (events[i].data.fd == timerfd) {
4
            read(....);
5
            printf ("Timer %....");
6
        }
7
        else (events[i].data.fd == signalfdfd){
8
            read();
9
        }
10
    }

Ich würde gerne den if/else Block komplett rausstreichen und statt 
dessen mit zwei Callbackfunktionen für timer und signal arbeiten. Leider 
weiß ich nicht, wie ich das am besten umsetzen könnte. Eventuell hat 
jemand einen Ansatz, möglicherweise über den freien pointer 
events.data.ptr oder ähnliches.
Gast #5111640
Lesenswert?

LXD schrieb:
>
> Sind folgende beide Codeabschnitte identisch?
> #define MAX_EVENTS 100

> struct epoll_event *events;
> events = malloc (sizeof (struct epoll_event) * MAX_EVENTS);


> #define MAX_EVENTS 100
> struct epoll_event events[MAX_EVENTS];

Definiere "identisch." Natürlich sind sie NICHT identisch, aber wer zur 
Laufzeit auf eines der Strukturen zugreift, interessiert sich nicht 
dafür, wo und warum die im Speicher liegen.
Gast #5111697
Lesenswert?

LXD schrieb:
> Sind folgende beide Codeabschnitte identisch?
> #define MAX_EVENTS 100
> struct epoll_event *events;
> events = malloc (sizeof (struct epoll_event) * MAX_EVENTS);
> #define MAX_EVENTS 100
> struct epoll_event events[MAX_EVENTS];

Nein.

Beim ersten Ausschnitt hast du einen Zeiger events*, der auf ein Array 
auf dem Heap zeigt. Beim zweiten Beispiel hast du einen Zeiger events*, 
der auf ein Array auf dem Stack zeigt (Oder auf den static Storage, 
falls du events global deklarierst).
Schau mal in dein Programmierbuch (Falls nicht vorhanden -> Dringend 
anschaffen), was der Unterschied zwischen Heap, Static Storage und Stack 
ist.


LXD schrieb:
> else (events[i].data.fd == signalfdfd){

Das wird nicht funktionieren. Soll da ein
1
else if (/*wasauchimmer*/)
stehen? Oder was meinst du?
Gast #5111823
Lesenswert?

Momentan stehe ich vor dem selben Problem. Mein Vorschlag wäre ...
1
// Callbackfunktion
2
void callback_timer (struct epoll_event *events, uint64_t *count)
3
{
4
  read(tfd, &count, sizeof(count));
5
  printf("Timer \n");
6
}
7

8
void callback_signal(struct epoll_event *events, uint64_t *count)
9
{
10
  read(sfd, &siginfo, sizeof(siginfo));
11
  printf("Signal: %d \n", siginfo.ssi_signo);
12
}
13

14
// Funktionszeiger
15
void pFunc (size_t x, struct epoll_event *events, uint64_t *count, void (*callback_timer)(struct epoll_event*, uint64_t*), void (*callback_signal)(struct epoll_event*, uint64_t*))
16
{
17
  int i = x;
18
  if ((events[i].data.fd) == tfd)
19
  callback_timer (events, count);
20
  else if ((events[i].data.fd) == sfd)
21
  callback_signal (events, count);
22
}
23

24
...
25
...
26
...
27
int main (){
28
for (i = 0; i < event_counter; i++) {
29
        pFunc(i, events, &count, callback_timer, callback_signal);
30

31
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren