struct Vergleich

Gast #2122929
Lesenswert?

Abend, ich habe Probleme mit dem Vergleich von struct. Kann mir jemand 
helfen? index wird nicht gefunden, somit auch 255.
1
typedef struct {
2
  uint8_t deviceID;
3
  int16_t measuredTime;
4
  int16_t actuelTime;
5
  bool active;        
6
} shutter_t;
7

8
shutter_t poolShutter[30];
9

10
// Such den Index wo das device drinsteht
11
uint8_t poolShutterIndex(uint8_t device) {
12
  uint8_t i;
13
  for(i=0; i<30; i++) {
14
    if(poolShutter[i].deviceID == device)
15
      return i;
16
  }
17
  return 255;
18
}

Eintragung:
1
shutter_t new_shutter_device;
2
new_shutter_device.deviceID = 0x01;
3
new_shutter_device.measuredTime = 0;
4
new_shutter_device.actuelTime = 0;
5
new_shutter_device.active = false;
6
      
7
poolShutter[index] = new_shutter_device;

Vergleich:
1
uint8_t index = poolShutterIndex(0x01);  // suche im poolShutter den Index
2
if(index != 255) {
3
   if(poolShutter[index].deviceID == 0x01) {
4
      poolShutter[index].measuredTime = rxbuf[1];
5
      poolShutter[index].actuelTime = 0;
6
      poolShutter[index].active = true;          
7
   }
8
}
Gast #2122953
Lesenswert?

> poolShutter[index] = new_shutter_device;

Kopiert nicht.

Du hast zwei Möglichkeiten

1) Tatsächlich kopieren z.B. mit memcpy(), Frisst aber ziemlich Speicher

2) poolShutter[] als Feld von Zeigern anlegen und in den Feldelementen 
die Adressen der tatsächlichen Structs eintragen
1
shutter_t * poolShutter[30];
2
...
3
poolShutter[index] = &new_shutter_device;
4
...
5
uint8_t index = poolShutterIndex(0x01);  // suche im poolShutter den Index
6
...
7
if(index != 255) {
8
   if(poolShutter[index]->deviceID == 0x01) {
9
      poolShutter[index]->measuredTime = rxbuf[1];
10
      poolShutter[index]->actuelTime = 0;
11
      poolShutter[index]->active = true;          
12
   }
13
}
14
...
15
uint8_t poolShutterIndex(uint8_t device) {
16
  uint8_t i;
17
  for(i=0; i<30; i++) {
18
    if(poolShutter[i]->deviceID == device)
19
      return i;
20
  }
21
  return 255;
22
}
Gast #2122980
Lesenswert?

Hi,

das Problem liegt in folgender Zeile:

"poolShutter[index] = new_shutter_device;"

hier versuchst du die Adresse von "new_shutter_device" nach 
"poolShutter[index]", dass wird so nicht funktionieren.

Um einen neuen Eintrag zu erstellen (kopieren) musst du den Inhalt 
deiner Struktur "new_shutter_device" in dein Array "poolShutter[index" 
kopieren.

Geht zum Beispiel so:

memcyp (poolShutter[index], new_shutter_device, sizeof (shutter_t));

Wichtig: Bei sizeof unbedingt den typedef angeben, nicht die Struktur 
ansich, da du sonst nur die Länge des Pointers kopieren würdest.

Gruß Alex
#2122991
Lesenswert?

Alex schrieb:
> Hi,
>
> das Problem liegt in folgender Zeile:
>
> "poolShutter[index] = new_shutter_device;"
>
> hier versuchst du die Adresse von "new_shutter_device" nach
> "poolShutter[index]",

Ist doch gar nicht wahr.

Was er macht ist völlig legal.

Aber mich würde mal der Wert von index bei der Zuweisung interessieren. 
Mich würde auch interessieren, ob er sich irgendwo mit lokalen Variablen 
ein Schnippchen geschlagen hat. Mich würde interessieren, ob er sein 
Array einigermassen vernünftig vorinitialisiert hat.

Das Problem steckt irgendwo in den Teilen, die er nicht gezeigt hat.

> Geht zum Beispiel so:
>
> memcyp (poolShutter[index], new_shutter_device, sizeof (shutter_t));

Genau das macht die Zuweisung ganz von alleine
#2123014
Lesenswert?

Karl Heinz Buchegger schrieb:
>> Geht zum Beispiel so:
>>
>> memcyp (poolShutter[index], new_shutter_device, sizeof (shutter_t));
>
> Genau das macht die Zuweisung ganz von alleine

nicht nur, daß die Zuweisung das in der Tat schafft, wäre die
memcpy-Variante auch noch so falsch, wie es nur geht.
- es heißt memcpy, nicht irgendwie ähnlich
- statt poolShutter[index] müsste man &poolShutter[index] schreiben
- entsprechend statt new_shutter_device muß es &new_shutter_device
  heißen
Gast #2123131
Lesenswert?

also ich hab jetzt den index komplett auf 0 umgestellt, da ich im moment 
nur mit einem gerät experementiere. ich habe festgestellt, dass

new_shutter_device.deviceID = 0x01;
poolShutter[0] = new_shutter_device;


poolShutter[0].deviceID

0 ist.
Also ich schreibe 0x01 rein aber es ist nur 0x00 vorhanden. Die Werte 
werden also nicht gespeichert.
Gast #2123228
Lesenswert?

Dein Code funktioniert bei mir wie erwartet. Die unerwartete Ausgabe
1
ID = 0x00  index =   1
kommt daher, dass alle Einträge von poolShutter[] am Anfang  --  wie von 
Karl Heinz Buchegger erwähnt -- mit Nullen gefüllt sind und die erste 
Fundstelle der ID 0x00 das erste nicht veränderte Element im Array (hier 
bei index==1) ist.
Angehängte Dateien:
Gast #2123825
Lesenswert?

Ok Vielen Dank.

Hab nochmal alles kontrolliert und festgestellt, dass ich das device 
nicht abspeichere aufgrund von falschen variablen. Deshalb war das 
Device auch immer 0x00. Fehlersuche ohne uart oder lcd display ist halt 
etwas schwieriger.

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