Mehrdimensionales char Array

#2958291
Lesenswert?

Hallo C-Freunde ...

ich möchte aus drei Datein jeweils die einzelnen Werte auslesen und in
ein  mehrdimensionales char Array schreiben ... 3 Zeilen, 64 Strings.

  1 2 3 4 5 6 7 8 ... (n)
1
2       X
3

um auf diese Strings dann direkt zu referenzieren (sensorid[2][4] = X).

Was meint ihr ->

1
int ds2482_sysfs_init(void) {
2

3
  char sensorid[3][64][17];  
4

5
  for (i=1; i<4; i++) 
6
  {
7
    char *fn;
8
    sprintf ( fn, "/sys/bus/w1/devices/w1_bus_master%d/w1_master_slaves", i );  
9
    FILE *fp = fopen( fn, "r");
10

11
      int count = 1;
12
            
13
      while ( fgets ( sensorid[i][count], sizeof(sensorid), fp ) != 0 )
14
      {
15
      count++;
16
      }
17
        
18
  fclose(fp);
19
  }
20

21
// zum Testen
22
syslog( LOG_INFO, "%s", sensorid[1][1]);
23
syslog( LOG_INFO, "%s", sensorid[1][2]);
24
syslog( LOG_INFO, "%s", sensorid[2][1]);
25

26
return ( EXIT_SUCCESS );
27
}
#2958335
Lesenswert?

Hi,

Ich denke du müsstest dein Array etwas größer machen, denn 
sensorid[3][...][...] geht ja von sensorid[0] bis sensorid[2] und nicht 
von 1 bis 3.

Der sizeof Befehl ist etwas ungeeignet, da er wahrscheinlich die 
Gesamtgröße des Arrays ausgibt. Der Wert von 16 darf aber nicht 
überschritten werden, da du deine Stringlänge auf 17 definiert hast.

syslog kenne ich nicht. Ich vertraue mal darauf, dass du den Befehl 
kennst ;)



1
#define Dateien = 3
2
#define Werte = 64
3
#define Zeichen = 16
4

5

6
int ds2482_sysfs_init(void) {
7

8
  char sensorid[Dateien+1][Werte+1][Zeichen+1];  
9

10
  for (i=1; i<=Dateien; i++) 
11
  {
12
    char *fn;
13
    sprintf ( fn, "/sys/bus/w1/devices/w1_bus_master%d/w1_master_slaves", i );  
14
    FILE *fp = fopen( fn, "r");
15

16
      int count = 1;
17
            
18
      while ( fgets ( sensorid[i][count], Zeichen, fp ) != 0 )
19
      {
20
      if (count > Werte) return ( EXIT_ERROR ); // wenn die Datei deine Array-größe sprengt
21
      count++;
22
      }
23
        
24
  fclose(fp);
25
  }
26

27
// zum Testen
28
syslog( LOG_INFO, "%s", sensorid[1][1]);
29
syslog( LOG_INFO, "%s", sensorid[1][2]);
30
syslog( LOG_INFO, "%s", sensorid[2][1]);
31

32
return ( EXIT_SUCCESS );
33
}
#2958375
Lesenswert?

Hi Martin ...

Martin L. schrieb:
> Hi,
>
> Ich denke du müsstest dein Array etwas größer machen, denn
> sensorid[3][...][...] geht ja von sensorid[0] bis sensorid[2] und nicht
> von 1 bis 3.
>
> Der sizeof Befehl ist etwas ungeeignet, da er wahrscheinlich die
> Gesamtgröße des Arrays ausgibt. Der Wert von 16 darf aber nicht
> überschritten werden, da du deine Stringlänge auf 17 definiert hast.

Ja, die IDs sind 15+/0+/n

1
syslog( LOG_INFO, "%s", sensorid[i][count] );

Dec 15 13:47:44 rpi 1wirevz: 28-0000042b0406
Dec 15 13:47:44 rpi 1wirevz: 28-0000042b410e
Dec 15 13:47:44 rpi 1wirevz: not found.
Dec 15 13:47:44 rpi 1wirevz: not found.
#2958865
Lesenswert?

Helfender schrieb:
> Mit
>
>>> char *fn;
>
> legst Du nur Speicher für einen Pointer (z.B. 4 Bytes auf 32 Bit System)
> an. Dann schreibst Du aber viele Bytes hinein...
>
> Du brauchst etwas wie
>
> char fn[128];

Ups, danke!

1
  char fn[64];
2
  sprintf(fn, "/sys/bus/w1/devices/w1_bus_master1/%s/w1_slave", sensorid );
3
  FILE *fp = fopen ( fn, "r" );

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren