Forum: PC-Programmierung Arrays/Zeiger und Callbackfunktionen


von LXD (Gast)


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.

von Adapter (Gast)


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.

von Oliver S. (oliverso)


Lesenswert?

Wer zur Laufzeit auf eine der Strukturen zugreift, sollte sich schon für 
deren Lebensdauer interessieren. Und die kann sehr unterschiedliche 
sein.

Oliver

von jz23 (Gast)


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?

von LXD (Gast)


Lesenswert?

Stack und Heap ist mir klar. Meine Frage bezog sich auf das allgemeine 
Verhalten des Programms.

Beim zweiten Codeabschnitt sollte es else if heißen und es funktioniert 
auch .

von Raul (Gast)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.