Arrays/Zeiger und Callbackfunktionen

Gast #5111609
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
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
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
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 .
Gast
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.