Hiho!
benutzt jemand von euch die libconfig.h ?
Ich komme DAMIT ->
1 | char pin[1];
| 2 | char value[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. 1 | char pin[10];
| 2 | const char* value;
| 3 |
| 4 | for (i=0; i<4; i++)
| 5 | {
| 6 | sprintf(pin, "pin%02d", i);
| 7 | if( config_lookup_string( &cfg, pin, &value) == CONFIG_TRUE )
| 8 | printf( "%s = %s", pin, value );
| 9 | }
|
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.
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!
Henrik Wellschmidt schrieb:
Wie immer. Den Klassiker
Kernighan & Ritchie
Programming in C
Wenn geht die englische Originalausgabe.
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.
1 | char pin[10];
| 2 | const char* value;
| 3 | char werte[4][10];
| 4 |
| 5 | for (i=0; i<4; i++)
| 6 | {
| 7 | sprintf(pin, "pin%02d", i);
| 8 | if( config_lookup_string( &cfg, pin, &value) == CONFIG_TRUE )
| 9 | {
| 10 | strcpy( werte[i], value );
| 11 | printf( "%s = %s", pin, werte[i] );
| 12 | }
| 13 | }
|
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?
1 | for (i=0; i<inputs; i++)
| 2 | {
| 3 | char gpio[BUF_LEN];
| 4 | const char* vzuuid[i][2];
| 5 |
| 6 | sprintf ( gpio, "GPIO%d", i );
| 7 |
| 8 | if ( config_lookup_string( &cfg, gpio, &vzuuid[i]) == CONFIG_TRUE )
| 9 |
| 10 | syslog ( LOG_INFO, "%s = %s", gpio, vzuuid[i] );
| 11 | }
|
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] );
}
Läuft perfekt! Danke nochmal!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|