Forum: Compiler & IDEs Struktur, auf die gezeigt wird, löschen


von Thomas (Gast)


Lesenswert?

Ich habe eine Struktur mit verschiedenen Bits. Ich denke, der Aufbau der
Struktur sollte hier keine Rolle spielen. Die Struktur nutze ich, um die
Bits besser auswerten zu können.

Diese Struktur werte ich in einer Funktion aus; Zugriff von anderer
Stelle auf diese Struktur zu diesem Zeitpunkt ist ausgeschlossen.
Nachdem ich die Struktur ausgewertet habe, muss ich sie komplett
löschen - bevor ich wieder Daten in die Struktur fülle.

//globale variable
volatile uint16_t mem_buffer;

//Funktion zum auswerten:
{
struct rx_incomming *rx_buffer;
rx_buffer = (struct rx_incomming *)(uint16_t)&mem_buffer;
//...verschiedenes
//und dann löschen
rx_buffer = 0;
}

Das löschen von rx_buffer, wobei es sich eigentlich um mem_buffer
handelt funktioniert aber nicht. Folge sind falsche Werte in den
nächsten Schritten. ersetze ich "rx_buffer = 0" geg. "mem_buffer =
0" arbeitet es tadellos! Ich kann das nicht ganz nachvollziehen.
lst-File gibt mir auch keinen Aufschluss.

Evtl. hat jemand einen Tipp! Ich nutze solche Funktionalität zum ersten
male (also Struktur über Variable legen (wie nennt man das eigentlich?
;-) ).

Danke

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

1
    *rx_buffer = 0;

von Thomas (Gast)


Lesenswert?

Nein - leider nicht!
Wird mit folgender Meldung quittiert:
main.c:69: error: incompatible types in assignment

von RAM (Gast)


Lesenswert?

Das geht so:
1
struct rx_incomming *rx_buffer;
2
rx_buffer = (struct rx_incomming *) &mem_buffer;
3
4
//und dann löschen
5
memset(rx_buffer, 0, sizeof (struct rx_incomming));

BTW: "incoming" wird mit einem m geschrieben

von -daniel- (Gast)


Lesenswert?

struct rx_incomming *rx_buffer;
*rx_buffer = (struct rx_incomming){0};

memset setzt allerdings auch padding bits zu null
wenn du allerdings immer über -> oder *. zugreifst
dann spielt es keine Rolle

hth, Daniel

von foox (Gast)


Lesenswert?

nagge danse ganse nachte lang!

von Thomas (Gast)


Lesenswert?

Guten Morgen,

der Stern vor "rx_buffer", also "*rx_buffer" hat bei mir stets
Fehler-Meldungen beim build zur Folge.

von Karl H. (kbuchegg)


Lesenswert?

Das liegt aber sicher nicht am Stern. Der ist nämlich
syntaktisch völlig in Ordnung.

Was denkst du eigentlich: Gibt der Compiler die Fehlermeldungen
nur so zum Spass aus?

von Peter D. (peda)


Lesenswert?

"Ich habe eine Struktur mit verschiedenen Bits. Ich denke, der Aufbau
der Struktur sollte hier keine Rolle spielen."


Wenn Du dadurch eine Fehlermeldung kriegst, na klar spielt das ne Rolle
!!!


Peter

von johnny.m (Gast)


Lesenswert?

Du hast nen Pointer auf ne struct deklariert. Wenn Du Deine Werte
löschen willst, darfst Du natürlich nicht den Pointer selbst '0'
setzen, sondern Du musst die Komponenten der Struct löschen. Mit
'rx_buffer = 0' löschst Du aber nur den Zeiger, der dann auf die
Adresse '0' zeigt, was sicher nicht das ist, was Du willst. Einer
struct-Variablen kannst Du aber auch nicht einfach eine '0' zuweisen,
da sie ja vermutlich aus mehreren Komponenten besteht. Deshalb meckert
Dein Compiler auch bei der (für eine einfache Variable, also kein
struct, auch korrekte) Variante '*rx_buffer = 0'. Deshalb spielt die
struct selber eine sogar sehr wichtige Rolle.

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.