Forum: Compiler & IDEs struct Vergleich


von Stefan T. (Gast)


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
}

von Helfer (Gast)


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
}

von Karl H. (kbuchegg)


Lesenswert?

Helfer schrieb:
>> poolShutter[index] = new_shutter_device;
>
> Kopiert nicht.

Doch. Das kopiert schon.
Strukturen können zugewiesen werden.

Zeig mal ein wenig mehr Code

von Alex (Gast)


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

von Karl H. (kbuchegg)


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

von Klaus W. (mfgkw)


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

von Stefan T. (Gast)


Lesenswert?

Das ist gut zu hören, dass der Fehler schonmal nicht bei struct ist. Die 
poolshutter initialisiere ich garnicht. sollte man es mit poolShutter[0] 
= 0; initialisieren?

von Karl H. (kbuchegg)


Lesenswert?

Stefan T. schrieb:
> Das ist gut zu hören, dass der Fehler schonmal nicht bei struct ist. Die
> poolshutter initialisiere ich garnicht. sollte man es mit poolShutter[0]
> = 0; initialisieren?

Das kommt drauf an.
Wenn es sich um eine globales Array handelt, dann ist es bereits 
komplett mit 0-Byte zur Welt gekommen.

von Stefan T. (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Poste endlich deinen kompletten Code!

Dein Problem liegt irgendwo anders.

von Tom (Gast)


Angehängte Dateien:

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.

von Stefan T. (Gast)


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.

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.