Forum: PC-Programmierung C89 - libconfig.h


von Welle 🧐 S. (w3llschmidt)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

Henrik Wellschmidt schrieb:

Wie immer. Den Klassiker
Kernighan & Ritchie
Programming in C

Wenn geht die englische Originalausgabe.

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

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);

von Karl H. (kbuchegg)


Lesenswert?

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
  }

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

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
  }

von Karl H. (kbuchegg)


Lesenswert?

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] );
    }

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Läuft perfekt! Danke nochmal!

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.