Forum: PC-Programmierung ANSI C - open() als Schleife


von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Hallo *!

kurze Frage, kann man das etwas smarter machen? Mit einer Schleife?
1
char gpio0[] = "17";
2
char gpio1[] = "18";
3
char gpio2[] = "21";
4
5
      snprintf(fn_gpio0, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio0);
6
      fd_gpio0=open(fn_gpio0, O_RDONLY);
7
      if(fd_gpio0<0) 
8
      {
9
        perror(fn_gpio0);
10
        return 1;
11
      }
12
      
13
      snprintf(fn_gpio1, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio1);
14
      fd_gpio1=open(fn_gpio1, O_RDONLY);
15
      if(fd_gpio1<0) 
16
      {
17
        perror(fn_gpio0);
18
        return 1;
19
      }
20
      snprintf(fn_gpio2, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio2);
21
      fd_gpio2=open(fn_gpio2, O_RDONLY);
22
      if(fd_gpio2<0) 
23
      {
24
        perror(fn_gpio0);
25
        return 1;
26
      }

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

for(z ............
{
 snprintf(fn_gpio[z], GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", 
gpio[z]);
 n=open(fn_gpio[z], O_RDONLY);
 if(n<0)
 {
  perror(fn_gpio0);
  return 1;
 }
 else fd_gpio[....]=n;
}

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Sieht schick aus, versuch ich gleich zu adaptieren! Danke Dennis!

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Blöde Frage :-)

Kann ich die ->
1
close ( fd_gpio0 );
2
close ( fd_gpio1 );
3
close ( fd_gpio2 );
4
return 0;

auf die gleiche Weise auch wieder zu machen?

Oder ist das nicht so ein guter Stil?

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

char gpio[][3] = {"17","18","21"};

Hast Du Ahnung vom Programmieren in C ?

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

char gpio0[][3] = {"17","18","21"};
FILE (*fp)[3]={0};

//Öffnen

for(z=0;z<3;z++)
{
 char buffer[GPIO_FN_MAXLEN+1];
 snprintf(buffer, GPIO_FN_MAXLEN-1,
 "/sys/class/gpio/gpio%s/value",
 gpio[z]);
 FILE n=open(buffer,O_RDONLY);
 if(n<0)
 {
  perror(fn_gpio0);
  return 1; //Eventuell ein fp[z]=0;
 }
 else
  fp[z]=n;
}

//Schliessen
for(z=0;z<3;z++)
 if(fp[z])fclose(z);

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Nee, ich weiss das sieht man :-)

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Eventuell sind da noch ein paar Fehler drin.

Aber im Prinzip ginge es so

char gpio0[][3] = {"17","18","21"};
FILE *fp[3]={0};

//Öffnen
int z;
for(z=0;z<3;z++)
{
 char buffer[GPIO_FN_MAXLEN+1];
 snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", 
gpio[z]);
 FILE *n=open(buffer,O_RDONLY);
 if(n<0)
 {
  perror(buffer);
  fp[z]=0;
 }
 else
  fp[z]=n;
}

//Schliessen
for(z=0;z<3;z++)
 if(fp[z])fclose(fp[z]);

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Fummel ich mir hin :-)

---


Kannd das sein, das open() kein FILE mag?

311: FILE *n=open(buffer,O_RDONLY);

311:13: warning: initialization makes pointer from integer without a 
cast

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

ah Linux
http://linux.die.net/man/2/open


nimm dann ein Array von int.

int fp[3]={0};

int n=open(buffer,O_RDONLY);

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Hmm ... siehst Du n Fehler?

1
        char gpio[][3] = {"17","18","21"};
2
        int fp[3]={0};
3
4
        //Öffnen
5
        int z;
6
        for(z=0;z<3;z++)
7
        {
8
          char buffer[GPIO_FN_MAXLEN+1];
9
          snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z]);
10
          int n=open(buffer,O_RDONLY);
11
          
12
          if(n<0)
13
          {
14
          perror(buffer);
15
          fp[z]=0;
16
          }
17
          else
18
          fp[z]=n;
19
        }

syslog(LOG_INFO, "%s", fd_gpio0);

Nov 24 00:24:33 rpi s0vz: (null)

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Funktionierts denn ?

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Nee, leider nisch ... irgendwie ist der Filepointer leer ?!

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Komisch
1
        char gpio[][3] = {"17","18","21"};
2
        int fd_gpio[3]={0};
3
4
        //Öffnen
5
        int z;
6
        for(z=0;z<3;z++)
7
        {
8
          char buffer[GPIO_FN_MAXLEN+1];
9
          snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z]);
10
          syslog(LOG_INFO, "%s", buffer);
11
          int n=open(buffer,O_RDONLY);
12
          
13
          if(n<0)
14
          {
15
          perror(buffer);
16
          fd_gpio[z]=0;
17
          }
18
          else
19
          fd_gpio[z]=n;
20
        }

Das geht

Nov 24 00:56:16 rpi s0vz: /sys/class/gpio/gpio17/value
Nov 24 00:56:16 rpi s0vz: /sys/class/gpio/gpio18/value
Nov 24 00:56:16 rpi s0vz: /sys/class/gpio/gpio21/value

.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

fd_gpio[ ist leer ?
Wo ist fd_gpio definiert ?
Es hört sich für mich nach einem Gültigkeitsproblem an.
Zeig mal mehr Programmcode.

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Das ist alles :-)

http://pastebin.com/gE3ymsSK

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

fd_gpio0 kann übrigens keinen Sinnvollen Wert enthalten.

fd_gpio[0] allerdings schon.

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Du meinst so ->

1
        char gpio[][3] = {"17","18","21"};
2
        int fd_gpio[3]={0};
3
4
        int z;
5
        for(z=0;z<3;z++)
6
        {
7
          char buffer[GPIO_FN_MAXLEN+1];
8
          snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z]);
9
          int n=open(buffer,O_RDONLY);
10
          syslog(LOG_INFO, "%s", buffer);          
11
        
12
          if(n<0)
13
          {
14
            perror(buffer);
15
            fd_gpio[z]=0;
16
          }
17
          else
18
          fd_gpio[z]=n;
19
        }
20
21
22
    irq=read(fd_gpio[0], rdbuf, RDBUF_LEN-1);
23
    if(irq<0) 
24
    {
25
      perror("read()");
26
      return 4;
27
    }
28
    
29
    irq=read(fd_gpio[1], rdbuf, RDBUF_LEN-1);
30
    if(irq<0) 
31
    {
32
      perror("read()");
33
      return 4;
34
    }
35
    
36
    irq=read(fd_gpio[2], rdbuf, RDBUF_LEN-1);
37
    if(irq<0) 
38
    {
39
      perror("read()");
40
      return 4;
41
    }

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Vom logischen Standpunkt her werden die Filepointer ja auch in das Array 
fd_gpio eingelesen.
Japp genau so

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Irgendwo ist in der Open-Schleife noch ein Wurm ...

Nov 25 16:40:18 rpi s0vz: :/sys/class/gpio/gpio17/value
Nov 25 16:40:18 rpi s0vz: :Bad file descriptor
Nov 25 16:40:18 rpi s0vz: :/sys/class/gpio/gpio18/value
Nov 25 16:40:18 rpi s0vz: :Bad file descriptor
Nov 25 16:40:18 rpi s0vz: :/sys/class/gpio/gpio21/value
Nov 25 16:40:18 rpi s0vz: :Bad file descriptor

%m ist der letzte Return-Code? Dann von: int n=open(buffer,O_RDONLY); ?!
1
        char gpio[][3] = {"17","18","21"};
2
        int fd_gpio[3]={0};
3
4
        int z;
5
        for(z=0;z<3;z++)
6
        {
7
          char buffer[GPIO_FN_MAXLEN+1];
8
          snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z]);
9
          syslog(LOG_INFO, ":%s", buffer);
10
          int n=open(buffer,O_RDONLY);
11
                
12
          if(n<0)
13
          {
14
            syslog(LOG_INFO, "Error > %m: %s", buffer);
15
            fd_gpio[z]=0;
16
          }
17
          fd_gpio[z]=n;
18
          syslog(LOG_INFO, ":%m");
19
        }

von EmbededLinux (Gast)


Lesenswert?

sind die GPIO's vorher auch aktiviert worden?
Andernfalls gibt es sie nämlich nicht, d.h. Fehler ist korrekt.

Hier mal auf die Schnelle als Shell-Script:

# Set up GPIO 4 and set to output
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction

# Set up GPIO 7 and set to input
echo "7" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio7/direction

# Write output
echo "1" > /sys/class/gpio/gpio4/value

# Read from input
cat /sys/class/gpio/gpio7/value

# Clean up
echo "4" > /sys/class/gpio/unexport
echo "7" > /sys/class/gpio/unexport

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Klar ;-)

Aber danke für den Tip!

1
pi@rpi ~ $ ls -la /sys/class/gpio/gpio*
2
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio17 -> ../../devices/virtual/gpio/gpio17
3
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio18 -> ../../devices/virtual/gpio/gpio18
4
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio21 -> ../../devices/virtual/gpio/gpio21
5
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio22 -> ../../devices/virtual/gpio/gpio22
6
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio23 -> ../../devices/virtual/gpio/gpio23
7
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio24 -> ../../devices/virtual/gpio/gpio24
8
lrwxrwxrwx 1 root root 0 Nov 25 17:35 /sys/class/gpio/gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
9
pi@rpi ~ $ cat /sys/class/gpio/gpio*/value
10
1
11
1
12
1
13
0
14
0
15
0

Ich überprüfe das hier ->
1
if (fd_gpio[z] < 0 )
2
          {
3
            syslog(LOG_INFO, "Error > %m: %s", buffer);
4
            fd_gpio[z]=0;
5
          }

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Was bekommste für nen filedescriptor wenn du das von Hand machst ?

Also ein open("/sys/class/gpio/gpio18/value",O_RDONLY) ?

und

if(n<0)
{
 syslog(LOG_INFO, "Error > %m: %s", buffer);
 fd_gpio[z]=0;
}
else
 fd_gpio[z]=n;

sieht eleganter aus.

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

:-D

Nov 25 20:03:58 rpi s0vz: VzServer:localhost
Nov 25 20:03:58 rpi s0vz: VzPort:80
Nov 25 20:03:58 rpi s0vz: VzPath:middleware.php
Nov 25 20:03:58 rpi s0vz: :/sys/class/gpio/gpio17/value
Nov 25 20:03:58 rpi s0vz: debug_fp1:2
Nov 25 20:03:58 rpi s0vz: debug_fp2:2
Nov 25 20:03:58 rpi s0vz: :/sys/class/gpio/gpio18/value
Nov 25 20:03:58 rpi s0vz: debug_fp1:3
Nov 25 20:03:58 rpi s0vz: debug_fp2:3
Nov 25 20:03:58 rpi s0vz: :/sys/class/gpio/gpio21/value
Nov 25 20:03:58 rpi s0vz: debug_fp1:4
Nov 25 20:03:58 rpi s0vz: debug_fp2:4
Nov 25 20:03:58 rpi s0vz: debug:2
Nov 25 20:03:58 rpi s0vz: debug:3
Nov 25 20:03:58 rpi s0vz: debug:4

_
1
        char gpio[][3] = {"17","18","21"};
2
        int fd_gpio[3]={0};
3
4
        for ( z=0; z<3; z++ )
5
        {
6
        
7
          char buffer[GPIO_FN_MAXLEN+1];
8
          snprintf ( buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z] );
9
          syslog ( LOG_INFO, ":%s", buffer );
10
          int n = open ( buffer, O_RDONLY );
11
              
12
          if(n<0)
13
          {
14
            syslog(LOG_INFO, "Error > %m: %s", buffer);
15
            fd_gpio[z]=0;
16
          }
17
          else
18
            fd_gpio[z]=n;
19
            syslog ( LOG_INFO, "debug_fp1:%d", n );
20
            syslog ( LOG_INFO, "debug_fp2:%d", fd_gpio[z] );
21
                                 
22
        }
23
24
          syslog ( LOG_INFO, "debug:%d", fd_gpio[0] );
25
          syslog ( LOG_INFO, "debug:%d", fd_gpio[1] );
26
          syslog ( LOG_INFO, "debug:%d", fd_gpio[2] );

...

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

leer sind die fd's ja schonmal nicht.

          if(n<0)
          {
            syslog(LOG_INFO, "Error > %m: %s", buffer);
            fd_gpio[z]=0;
          }
          else
          {
            fd_gpio[z]=n;
            syslog ( LOG_INFO, "debug_fp1:%d", n );
            syslog ( LOG_INFO, "debug_fp2:%d", fd_gpio[z] );
          }

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Danke Dennis für den Input!

Es läuft :-)

1
    // S0 starts here!
2
    char buffer[BUF_LEN];
3
    char vzuuid[36];
4
    int inputs = 6;
5
    struct pollfd fds[inputs];
6
    char gpio_pin_id[][6] = {"17", "18", "21", "22", "23", "24"};
7
    int i;
8
    
9
      for (i=0; i<inputs; i++) 
10
      {
11
        char buffer[BUF_LEN];
12
        snprintf ( buffer, BUF_LEN, "/sys/class/gpio/gpio%s/value", gpio_pin_id[i] );
13
        
14
        if((fds[i].fd = open( buffer, O_RDONLY )) ==-1)
15
        {
16
          syslog(LOG_INFO,"Error:%s (%m)", buffer);
17
        }
18
      }
19
    
20
      for (i=0; i<inputs; i++) 
21
      {
22
        fds[i].events = POLLPRI;
23
      }
24
        
25
      while(1) 
26
      {
27
        int ret = poll(fds, inputs, -1 );
28
            
29
          if(ret<0) 
30
          {
31
            syslog(LOG_INFO,"Error: poll(fds, inputs, -1 )");
32
          }
33
        
34
        for (i=0; i<inputs; i++) 
35
        {
36
          if (fds[i].revents & POLLPRI)
37
          {
38
            int in = read(fds[i].fd, buffer, BUF_LEN);
39
          
40
            sprintf(vzuuid, "%d", fds[i].fd);
41
            http_post(vzuuid);
42
          }
43
        }
44
      }

.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

noch 'n Tipp

bei

char gpio_pin_id[][6] = {"17", "18", "21", "22", "23", "24"};

steht die 6 nicht für die Anzahl der Einträge.
Es ist ein Wert für die einzelnen Elemente die die Einträge jeweils 
Aufnehmen können.
Für Strings mit maximal 2 Zeichen reichen dann 2 + 1(Nullbyte) chars.

char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};

wieviele INPUT-Werte du dann hast kann man mit sizeof(gpio_pin_id)/3 
berechnen.
So bleibts etwas variabler.

(sizeof(gpio_pin_id)/3) sollte 6 ergeben.


Also statt

int inputs = 6;
struct pollfd fds[inputs];
char gpio_pin_id[][6] = {"17", "18", "21", "22", "23", "24"};
int i;

dieses

struct pollfd fds[inputs];
char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
int inputs = sizeof(gpio_pin_id)/3;
int i;

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Falls das mal einer hier findet :-)
1
                char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
2
                int inputs = sizeof(gpio_pin_id)/3;
3
                struct pollfd fds[inputs];
4
                int i;

Cool :-) Danke !!!

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Ohoh , dein

struct pollfd fds[inputs]

hab ich nicht gesehen sorry.

Da spielt der C-Compiler normal nicht mit.

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Was meinstn?

ich habe nur die Reihenfolge geändert?! Weil der gcc hier maulte:

'inputs' nicht definiert ...

struct pollfd fds[inputs];
char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
int inputs = sizeof(gpio_pin_id)/3;
int i;

So, gehts! ->

char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
int inputs = sizeof(gpio_pin_id)/3;
struct pollfd fds[inputs];
int i;

Meintest Du das?

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Ich hab da nur mal eben was gestutzt.
Hatte noch im Hinterkopf, daß Arrays mit Variabler Länge nicht 
generierbar sind. :)

Vergiß es, ich habs ausprobiert. Geht :)

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Klappt alles wunderbar! Je nach Taste haut er schöne HTTP_POSTs raus :-)

1
127.0.0.1 - - [26/Nov/2012:21:32:57 +0000] "POST /middleware.php/data/3.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
2
127.0.0.1 - - [26/Nov/2012:21:32:58 +0000] "POST /middleware.php/data/3.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
3
127.0.0.1 - - [26/Nov/2012:21:32:58 +0000] "POST /middleware.php/data/3.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
4
127.0.0.1 - - [26/Nov/2012:21:32:58 +0000] "POST /middleware.php/data/3.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
5
6
7
8
127.0.0.1 - - [26/Nov/2012:21:33:00 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
9
127.0.0.1 - - [26/Nov/2012:21:33:01 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
10
127.0.0.1 - - [26/Nov/2012:21:33:01 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
11
127.0.0.1 - - [26/Nov/2012:21:33:01 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
12
127.0.0.1 - - [26/Nov/2012:21:33:01 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
13
14
15
16
127.0.0.1 - - [26/Nov/2012:21:33:05 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
17
127.0.0.1 - - [26/Nov/2012:21:33:06 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
18
127.0.0.1 - - [26/Nov/2012:21:33:06 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
19
127.0.0.1 - - [26/Nov/2012:21:33:06 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
20
127.0.0.1 - - [26/Nov/2012:21:33:06 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Dann ist ja alles bestens :)

von Simon B. (nomis)


Lesenswert?

Dennis Heynlein schrieb:
> char gpio_pin_id[][6] = {"17", "18", "21", "22", "23", "24"};

warum nicht
1
char gpio_pin_id[] = { 17, 18, 21, 22, 23, 24 };

und dann "%d" im Format-String?

Grüße,
        Simon

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Hi Simon,

ich glaube, snprintf() kann nur 'char', kein 'int' ...

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Compilieren geht, aber nach zwei durchläufen steht das Programm ...

Nov 26 21:50:51 rpi s0vz: /sys/class/gpio/gpio17/value
Nov 26 21:50:51 rpi s0vz: /sys/class/gpio/gpio18/value

1
    // S0 starts here!
2
    char buffer[BUF_LEN];
3
    char vzuuid[36];
4
    //char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
5
    char gpio_pin_id[] = { 17, 18, 21, 22, 23, 24 };
6
    int inputs = sizeof(gpio_pin_id)/3;
7
                struct pollfd fds[inputs];
8
    int i;
9
    
10
      for (i=0; i<inputs; i++) 
11
      {
12
        char buffer[BUF_LEN];
13
        //snprintf ( buffer, BUF_LEN, "/sys/class/gpio/gpio%s/value", gpio_pin_id[i] );
14
        snprintf ( buffer, BUF_LEN, "/sys/class/gpio/gpio%d/value", gpio_pin_id[i] );
15
  
16
        syslog(LOG_INFO,"%s", buffer);
17
        
18
        if((fds[i].fd = open( buffer, O_RDONLY )) ==-1)
19
        {
20
          syslog(LOG_INFO,"Error:%s (%m)", buffer);
21
        }
22
      }

von Simon B. (nomis)


Lesenswert?

Henrik Wellschmidt schrieb:
> ich glaube, snprintf() kann nur 'char', kein 'int' ...

Also, "%d" kann snprintf definitiv.

Und - gerade ausprobiert - das funktioniert auch, wenn man dem als 
Argument ein char verfüttert...

Grüße,
        Simon

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Simon Budig schrieb:
> Henrik Wellschmidt schrieb:
>> ich glaube, snprintf() kann nur 'char', kein 'int' ...
>
> Also, "%d" kann snprintf definitiv.
>
> Und - gerade ausprobiert - das funktioniert auch, wenn man dem als
> Argument ein char verfüttert...

Check!

Aber die Routine läuft nicht mehr durch ... hmm

von Simon B. (nomis)


Lesenswert?

Henrik Wellschmidt schrieb:
> Compilieren geht, aber nach zwei durchläufen steht das Programm ...
>
> Nov 26 21:50:51 rpi s0vz: /sys/class/gpio/gpio17/value
> Nov 26 21:50:51 rpi s0vz: /sys/class/gpio/gpio18/value

Heh, klar   :)

Ich empfehle:
1
  int inputs = sizeof(gpio_pin_id)/sizeof(gpio_pin_id[0]);

Viele Grüße,
        Simon

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Ok, gekauft ... :-D

1
    //char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
2
    // 13 Chars weniger!
3
    char gpio_pin_id[] = { 17, 18, 21, 22, 23, 24 };
4
    
5
    //int inputs = sizeof(gpio_pin_id)/3;
6
    //int inputs = sizeof(gpio_pin_id)/sizeof(gpio_pin_id[0]);
7
    // 11 Chars mehr!
8
    int inputs = sizeof(gpio_pin_id)/sizeof(char);

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Hää, wo issn der Post von Dennis ?

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Simon, schau mal -> 8 Zeichen mehr :-)

1
    //char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
2
    // 13 Chars weniger!
3
    char gpio_pin_id[] = { 17, 18, 21, 22, 23, 24 };
4
    
5
    //int inputs = sizeof(gpio_pin_id)/3;
6
    //  21 Chars mehr!
7
    int inputs = sizeof(gpio_pin_id)/sizeof(gpio_pin_id[0]);

von Simon B. (nomis)


Lesenswert?

Henrik Wellschmidt schrieb:
> Ok, gekauft ... :-D

Fein.  :)

Noch ein Hinweis:
1
  // 13 Chars weniger!
2
  // 11 Chars mehr!

Ich kriege gerade Angst, dass Du hier die Größe des Sourcecode-Texts 
misst. Wofür?

Als Qualitätsmerkmal taugt das nicht - eher im Gegenteil: Mehr Text 
bedeutet meist auch bessere Lesbarkeit. Wenn dann wäre eher interessant 
wieviel RAM zur Laufzeit verbraucht wird. Aber das wäre im Moment noch 
viel zu früh um sich darüber Gedanken zu machen...

Ansonsten:
1
char i,b[BUF_LEN];char gpid[]={17,18,21,22,23,24};
2
struct pollfd fds[6];
3
for(i=0;i<6;i++){
4
snprintf(b,BUF_LEN,"/sys/class/gpio/gpio%d/value",gpid[i]);
5
syslog(LOG_INFO,"%s",b);
6
if((fds[i].fd=open(b,O_RDONLY))<0){
7
syslog(LOG_INFO,"Error:%s (%m)",b);}}

Viele Grüße,
        Simon

von Simon B. (nomis)


Lesenswert?

Henrik Wellschmidt schrieb:
> Simon, schau mal -> 8 Zeichen mehr :-)

Bitte meine das als Witz   :-)

Grüße,
        Simon

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

>>> Hää, wo issn der Post von Dennis ?

Ich lösch ja manchmal Beiträge, wenn ich Quark geschrieben hab oder 
jemand mit der Antwort schneller ist :)

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Simon Budig schrieb:
> Henrik Wellschmidt schrieb:
>> Simon, schau mal -> 8 Zeichen mehr :-)
>
> Bitte meine das als Witz   :-)
>
> Grüße,
>         Simon


Ok, ich meinte das als Witz ;-)

Zumindest im nachhinein :-D

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.