Forum: PC-Programmierung Mehrdimensionales char Array


von Welle 🧐 S. (w3llschmidt)


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
}

von Martin L. (sbond)


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
}

von g457 (Gast)


Lesenswert?

> char *fn;
        ^^^
> sprintf(fn, "/sys/bus/w1/devices/w1_bus_master%d/w1_master_slaves", i);
          ^^
∗hüstel∗

von Helfender (Gast)


Lesenswert?

> fgets ( sensorid[i][count], sizeof(sensorid), fp )

sizeof(sensorid) ist die Größe des ganzen Arrays,
nicht nur eines einzelnen Eintrages.

Ich denke, Du müsstest (neben den anderen oberen Ratschlägen)
hier etwas in der Art

fgets ( sensorid[i][count], sizeof(sensorid[i][count]), fp )

verwenden.

von Welle 🧐 S. (w3llschmidt)


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.

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

g457 schrieb:
>> char *fn;
>         ^^^
>> sprintf(fn, "/sys/bus/w1/devices/w1_bus_master%d/w1_master_slaves", i);
>           ^^
> ∗hüstel∗

Hi g457 ... das passt nicht?

von Helfender (Gast)


Lesenswert?

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

von AVerr (Gast)


Lesenswert?

Henrik Wellschmidt schrieb:
> Hi g457 ... das passt nicht?

Wo zeigt fn denn hin ?
Richtig, irgendwohin ... nur in (mit großer Wahrscheinlichkeit) keinen 
initialisierten Bereich.
Da fehlt noch ein malloc Aufruf.

von Welle 🧐 S. (w3llschmidt)


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

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.