argp in structs

26/06/2011 - 14:21 von Markus Wichmann | Report spam
Hi all,

ich hab da ein Problem. Und zwar wollte ich für eine kleine Anwendung
einen Konfigurationsheader schreiben, der in etwa so aussehen sollte:

static struct {
Keycode kc;
Keysym ks;
char* argp[];
} config[] = {
{0, XF86XK_AudioPlay, {"/usr/bin/mocp", "-G", NULL}}
};

Spàter sollen da noch weitere Eintràge hin. Ziel soll es sein, dass
config[0].argp ein Pointer auf einen Bereich von 3 char-Pointern ist,
von denen der erste auf "/usr/bin/mocp" zeigt, der zweite auf "-G", und
der dritte NULL ist. Diese Struktur wird zur Laufzeit nur insoweit
geàndert, als das kc beim initialisieren gesetzt werden muss

Das ganze soll anschließend an execve() verfüttert werden, was hier aber
OffTopic ist. OnTopic ist, wie ich das in C formuliere.

Obiges compiliert jedenfalls nicht, und àndere ich die Deklaration von
argp zu

char** argp;

kompiliert es mit einem Haufen Warnungen:

alsaonoff.c:22:5: warning: excess elements in scalar initializer
alsaonoff.c:22:5: warning: (near initialization for ‘config[1].argp’)

Das sagt mir zwar, dass das so, wie es jetzt ist, falsch ist, aber
nicht, wie es richtig wàre. Und nach sowas zu googlen ist auch eher
schwierig.

Ciao,
Markus
 

Lesen sie die antworten

#1 Jan Seiffert
26/06/2011 - 16:36 | Warnen spam
Markus Wichmann schrieb:
Hi all,

ich hab da ein Problem. Und zwar wollte ich für eine kleine Anwendung
einen Konfigurationsheader schreiben, der in etwa so aussehen sollte:

static struct {
Keycode kc;
Keysym ks;
char* argp[];



Das ist ein Varialbe Length Array

} config[] = {



Und hier versuchst du ein Array draus zu machen.

Du kannst kein Array aus VLAs machen.

Der Compiler weiss im aeusseren Array dann nicht, wie gross ein innerer Record
ist (das muss konstant sein), also um wieviel er den aeusseren Pointer weiter
schieben muss.

{0, XF86XK_AudioPlay, {"/usr/bin/mocp", "-G", NULL}}
};


Spàter sollen da noch weitere Eintràge hin. Ziel soll es sein, dass
config[0].argp ein Pointer auf einen Bereich von 3 char-Pointern ist,



Dann schreibt doch:
static struct {
...
char *argp[3];
} config[] = {
...
}

von denen der erste auf "/usr/bin/mocp" zeigt, der zweite auf "-G", und
der dritte NULL ist. Diese Struktur wird zur Laufzeit nur insoweit
geàndert, als das kc beim initialisieren gesetzt werden muss

Das ganze soll anschließend an execve() verfüttert werden, was hier aber
OffTopic ist. OnTopic ist, wie ich das in C formuliere.

Obiges compiliert jedenfalls nicht, und àndere ich die Deklaration von
argp zu

char** argp;




Das ist ja auch die Syntax fuer was ganz anderes...

Da sieht die ini. so aus:

static char *mocp_args[] = {
"/usr/bin/mocp", "-G", NULL
};

static config_struct config[] = {
{0, XF86XK_AusioPlay, mocp_args}
}

kompiliert es mit einem Haufen Warnungen:

alsaonoff.c:22:5: warning: excess elements in scalar initializer



Eben, du versuchst in einen scalar (pointer auf pointer auf char) ein array rein
zu tun.

alsaonoff.c:22:5: warning: (near initialization for ‘config[1].argp’)

Das sagt mir zwar, dass das so, wie es jetzt ist, falsch ist, aber
nicht, wie es richtig wàre. Und nach sowas zu googlen ist auch eher
schwierig.

Ciao,
Markus



Gruss
Jan

Ähnliche fragen