Telegramm[3] |= (1<<2) legal?

Gast #1128979
Lesenswert?

Hallo,

ich bin noch recht grün, in der C Programmierung. Ich möchte über die
Serielle Schnittstelle ein Telegramm senden. Hierzu will ich in einem
array einzelne Bits setzen. Wenn ich nun folgenden Befehl schreibe
funktioniert das Ganze.

Telegramm[3] = (1<<2);

und dritte Element im array Telegramm wird beeinflußt.

Da ich aber nur ein Bit setzen will schreibe ich jedoch:

Telegramm[3] |= (1<<2);

Nun wird allerdings das Element 0 geändert.
Mache ich da etwas falsch?
Danke Mario
Gast #1128985
Lesenswert?

>Telegramm[3] = (1<<2);
>und dritte Element im array Telegramm wird beeinflußt.

Es wird das vierte Element geändert. In C beginnen Arrays mit dem 
Element 0.

>Telegramm[3] |= (1<<2);
>Nun wird allerdings das Element 0 geändert.

Wie stellst du das fest? Zeig mal deinen kompletten Code, nicht nur 
Mikrobruchstücke davon. Vermutlich machst du an anderen Stellen einen 
Fehler.

Es wird übrigens nicht gern gesehen, wenn du die selbe Frage in zwei 
verschiedenen Foren postest. Entscheide dich für das Forum, in das deine 
Frage am besten hineinpasst und poste nur einmal.
Gast #1128994
Lesenswert?

Danke für die Antwort.

Also das Programm ist natürlich länger. Festgestellt habe ich es, da das 
Element 0 in meinem Array das Startbyte ist. Es wurde überschrieben und 
der Empfänger antwortete nicht.
Darauf hin habe ich mir die Sache mal im Simulator angeschaut und es 
wurde tatsächlich Element 0 überschrieben.
Mein nächster Schritt war dann folgendes Miniprogramm:

C - Code

char Array[20];

void main() {

Array[1] = 1;
Array[5] |= (1<<2);
}


Der Compiler übersetzt es in das folgende Listing:
ASM - Listing

Arraytest.c,4 ::                 void main() {
;Arraytest.c,6 ::                 Array[1] = 1;
0x005C        0xE0B1            LDI        R27, 1
0x005E        0x006193B0          STS        _Array+1, R27
;Arraytest.c,7 ::                 Array[5] |= (1<<2);
0x0062        0x006091B0          LDS        R27, _Array+0
0x0066        0x60B4            SBR        R27, 4
0x0068        0x006093B0          STS        _Array+0, R27
;Arraytest.c,8 ::                 }
L_endmain:
0x006C        0xCFFF            RJMP       L_endmain

Man sieht also schon in der Übersetzung, dass das nullte Element 
manipuliert wird.
Ich habe den MikroC pro Compiler.
Ist da jetzt ein Fehler im meiner Quelle oder baut der Compiler Mist?
Gast #1129094
Lesenswert?

warum tust du das auch?
also geld für nen C compiler zahlen
oder hast du irgendwas exotisches für das es noch keinen gcc port gibt?

und ohne den compiler jetzt zu kennen... benutz den am besten garnicht 
mehr
wenn der schon bei so grundlegenden dingen wie einem eindimensionalen 
array  und bitmanipulation probleme macht dann will ich nicht wissen was 
der macht wenn die wirklich interessanten dinge kommen
und man macht immerhin schon genug eigene fehler ;)

gruß
sven
#1129135
Lesenswert?

Bei diesem Trivialcode gibt es keine verschiedenen Standards, da gibt es 
nichts zu interpretieren. Jedenfalls nicht wenn das wirklich auch nur 
entfernt etwas mit C oder gar einem offiziellen Standard zu tun haben 
soll.

Wäre allerdings ein komischer Fehler. Suggeriert, dass man für die 
Benutzung dieses Compilers Geld kriegen sollte statt dafür zu zahlen.
Persönliche Seite #1129227
Lesenswert?

http://www.avrfreaks.net/modules.php?op=modload&name=News&file=article&sid=712&mode=thread&order=0&thold=0

Es sit eine BETA Version wie es scheint, und da KÖNNTE es ja sein das es 
nicht ALLE vorgaben des neuesten C-Standards vorsieht/korrekt 
implementiert.

Und ich denke man könnte ohne probleme mal die langschreibweise 
ausprobieren, ggf wird hier ein operator verkehrt herum ausgewertet oder 
oder. Da steht aber auch nix von wegen das der was kostet...
Moderator Persönliche Seite #1129244
Lesenswert?

Läubi Mail@laeubi.de wrote:

> Es sit eine BETA Version wie es scheint, und da KÖNNTE es ja sein das es
> nicht ALLE vorgaben des neuesten C-Standards vorsieht/korrekt
> implementiert.

Das hat überhaupt nichts mit ,,neuestem C-Standard'' oder sowas zu
tun.  Wenn es ein Compiler nicht schafft, die Anweisungen a = a | b
und a |= b als äquivalent zu betrachten, dann brauch ich seiner
Codegenerierung schlicht und ergreifend nicht übern Weg trauen.
Gast #1129369
Lesenswert?

Hallo, danke für die zahlreichen Antworten.

Also, der Support hat sich mittlerweile gemeldet (über eine Woche) und 
den Bug bestätigt.
Ich habe halt bei der Anschaffung, des Compiler gedacht, dass 
komerzielle Produkte funktionieren und auch der Support stimmt. Leider 
erwies sich beides als Trugschluß.
Der Compiler ist auch nicht mehr in der Beta Phase.
Mal gespannt wie es weiter geht.

Gruß
Mario
#1129528
Lesenswert?

A. K. wrote:
> Im Changelog zur letzten Version findet sich dort beispielsweise:
>   - Fixed: Getting address of an extern variable with fixed address
>   - Fixed: Getting address of subaggregate (structure, array or union
> Mit Adressgenerierung haben die es scheint's nicht so.


Mario wrote:

> Der Compiler ist auch nicht mehr in der Beta Phase.

Da würden bei mir jetzt allerdings alle Glocken zu läuten anfangen.

Das in einem Compiler mal ein Fehler drinnen ist ... ok, kommt vor

Das es sich um einen fischigen Fehler handelt ... ok, auch das kommt vor

Das sich solche fischigen Fehler aus dem Alpha-Stadium in die Beta Phase
durchmogeln ... sollte zwar nicht sein, kommt aber vor

Das sich aber ein Fehler wie dieser, aus der Beta Phase in ein
kommerzielles Produkt einschleicht, wirft ein gewisses Licht auf die
Qualitätssicherung im Haus.

Denn eines muss klar sein: Wie A.K. weiter oben schon gesagt hat: Der
Fehler ist in der Adressgenerierung. Auf Anhieb fällt mir überhaupt
keine Möglichkeit ein, wie man bei einem normal aufgebauten Compiler so
einen Fehler einbauen kann, ohne dass es dem Entwickler bei den ersten
10 Programmen die er durch den Compiler jagt, in der Alpha Phase
auffällt.
Wer einen Compiler baut hat normalerweise eine Testsuite, die aus
meherern zig Test-Programmen besteht, die automatisiert durch den
Compiler gejagt werden und wo sich ein Programm den generierten
Maschinencode mit dem vorgegebenen Maschinencode vergleicht und sofort
Alarm schreit, wenn das nicht übereinstimmt. Sowas ist gängige Praxis
bei allen Compilerherstellern und man verhindert damit wirkungsvoll,
dass man sich unbemerkt blöde Fehler einbaut.


Edit: Nachdem ich diese Changelog Einträge gesehen habe, gebe ich den 
Text doch noch frei den ich im Nachhinein wieder gelöscht habe. 
Ursprünglich dachte ich: Beschuldige niemanden einer Nachlässigkeit die 
du nicht beweisen kannst. Aber diese Changelog Einträge werfen dann 
schon ein bezeichnendes Licht auf die Sache.

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