Hiho!
benutzt jemand von euch die libconfig.h ?
Ich komme DAMIT ->
1
charpin[1];
2
charvalue[1];
3
4
for(i=0;i<4;i++)
5
6
{
7
8
sprintf(pin,"pin%d",i);
9
sprintf(value,"value%d",i);
10
11
config_lookup_string(&cfg,pin,&value);
12
13
}
nicht klar :-(
Das Configfile sieht so aus:
pin01 = "rot"
pin02 = "grün"
pin03 = "blau"
pin04 = "schwarz"
Ich möchte die Config_Values (rot, grün ...) in value1, value2 ... etc.
Der ggc meint:
warning: passing argument 3 of 'config_lookup_string' from
incompatible pointer type [enabled by default]
expected 'const char **' but argument is of type 'char (*)[1]'
Was sein Problem ist, denke ich ich zu wissen. Nur egal wie ich es
drehe,
entweder passt es sprintf() nicht oder config_lookup_string().
HILFE!
Henrik Wellschmidt schrieb:> char pin[1];> char value[1];
Ein char Array mit einer Länge von 1 ist in den wenigsten Fällen
sinnvoll. Was willst du darin speichern, was du nicht mit einem normalen
einfachen char auch speichern könntest.
> sprintf(pin, "pin%d", i);> sprintf(value, "value%d", i);
Das geht mit Sicherheit in die Hose.
Egal welchen Wert i hat, ein Array der Länge 1 kann diesen String mit
Sicherheit nicht aufnehmen. Denn dieses 1 verfügbare Zeichen wird ja
schon durch das String-abschliessende \0 Zeichen aufgebraucht. Wie soll
denn da dann noch die ASCII Repräsentierung einer Zahl reinpassen?
> Ich möchte die Config_Values (rot, grün ...) in value1, value2 ... etc.> Der ggc meint:>> warning: passing argument 3 of 'config_lookup_string' from> incompatible pointer type [enabled by default]> expected 'const char **' but argument is of type 'char (*)[1]'
Ich hab mir mal die Doku zu config-Lookup_string gesucht.
1
Function: int config_lookup_string (const config_t * config,
2
const char * path,
3
const char ** value)
4
5
These functions look up the value of the setting in the configuration
6
config specified by the path path. They store the value of the setting
7
at value and return CONFIG_TRUE on success. If the setting was not found
8
or if the type of the value did not match the type requested, they leave
9
the data pointed to by value unmodified and return CONFIG_FALSE.
10
11
Storage for the string returned by config_lookup_string() is managed by
12
the library and released automatically when the setting is destroyed or
13
when the setting's value is changed; the string must not be freed by the
14
caller.
Aha. d.h. du brauchst dich da um die Allokierung von value überhaupt
nicht kümmern. Du machst einfach einen
const char * value;
rufst die Funktion auf, und wenn die Erfolg meldet, kannst du mit value
arbeiten.
Karl Heinz Buchegger schrieb:> Aha. d.h. du brauchst dich da um die Allokierung von value überhaupt> nicht kümmern. Du machst einfach einen>> const char * value;>> rufst die Funktion auf, und wenn die Erfolg meldet, kannst du mit value> arbeiten. char pin[10];> const char* value;>> for (i=0; i<4; i++)> {> sprintf(pin, "pin%02d", i);> if( config_lookup_string( &cfg, pin, &value) == CONFIG_TRUE )> printf( "%s = %s", pin, value );> }
Super, funzt! Danke Karl Heinz!
>> und kauf dir ein C-Buch. Auch eine Config-Lib befreit dich nicht davon,> über grundlegende C-Konzepte, wie zb C-Strings Bescheid zu wissen.
Jaaa, hatte ich auch schon überlegt. Würdest Du was empfehlen?
Grüsse Henrik!
Ein Problem habe ich aber noch :-D
Ich muss die Werte in jeweils eigenen Variablen haben ?!
Deshalb hatte ich das so versucht ->
sprintf(value, "value%d", i);
Henrik Wellschmidt schrieb:> Ein Problem habe ich aber noch :-D>> Ich muss die Werte in jeweils eigenen Variablen haben ?!
Na, dann musst du dir eben eigene Variablen oder zb ein Array von
Strings anlegen
char werte[4][10];
values ist ein Array von 4 Strings, wobei jeder String maximal 10
Zeichen (9 + '\0') aufnehmen kann. Und da sich die Funktion selbst die
Strings hält, wirst du die umkopieren müssen.
Karl Heinz Buchegger schrieb:> Na, dann musst du dir eben eigene Variablen oder zb ein Array von> Strings anlegen>> char values[4][10];>> values ist ein Array von 4 Strings, wobei jeder String maximal 10> Zeichen (9 + '\0') aufnehmen kann.
So richtig?
Henrik Wellschmidt schrieb:> Karl Heinz Buchegger schrieb:>> Na, dann musst du dir eben eigene Variablen oder zb ein Array von>> Strings anlegen>>>> char values[4][10];>>>> values ist ein Array von 4 Strings, wobei jeder String maximal 10>> Zeichen (9 + '\0') aufnehmen kann.>> So richtig?
No.
Wenn du dir die Pointer aufheben willst, dann musst du auch ein Array
von Pointern machen
const char* vzuuid[5];
for (i=0; i<inputs; i++)
{
char gpio[BUF_LEN];
sprintf ( gpio, "GPIO%d", i );
if ( config_lookup_string( &cfg, gpio, &vzuuid[i]) == CONFIG_TRUE
)
syslog ( LOG_INFO, "%s = %s", gpio, vzuuid[i] );
}