Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Das ist kein Bug Kategorie: Programmierung (von André H. - 21.03.2004 12:56)
Als Antwort auf Re: Das ist kein Bug von Olaf - 21.03.2004 9:50
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT_V2, OSOPT V3.0
Hallo Olaf,

> da C2 ja eine getypte Sprache ist könnte der Compiler auch mal auf die linke Seite schauen,
> wie es "richtige" Programmiersprachen, wie z.B. Java tun. Folgendes Java Programm

Das hat nichts(zumindest nicht direkt) mit dem Compiler zu tun.
Aus der Zeile
long l; int i;
l=1 shl i;

werden folgende Anweisungen:
- Lade die (Integer-)Konstante 1 als Integer auf den Stack
- Lade den Inhalt der Integervariable i als Integer auf den Stack. (Ob Integer oder byte ist hier egal)
- Führe die Schiebeoperation aus und lade das Ergebis als Integer auf den Stack, da
  beides <= Integer.
- Speichere den letzten Stackeintrag in l.

> insofern ist Bug vielleicht der falsche Begriff, unerwartetes Verhalten und vor allem nicht
> konsistentes Verhalten (s.u.) trifft es wohl eher.
> ZugegebenermaÃ?en hat die Entwicklung der Java Programmiersprache JavaSoft bzw. Sun
> auch bestimmt ein bisschen mehr Geld gekostet als C2 den Leuten von Conrad.

Dieses Verhalten ist Sinnvoll. Denn es müssten alle Ganzzahlbereichnungen als
Long behandelt werden, damit dies geht. Da jedoch Longoperationen deutlich mehr
Rechenzeit benötigen, als Integer-Ops, wäre dies nicht vorteilhaft.
Auch ein Vorrauslesen würde das System unnötig langsam machen, da dies die VM
und nicht der Compiler machen müsste.
Gerde bei komplexeren Formeln würde man dies bemerken.
 
> > SchlieÃ?lich ist des C164CI ein 16Bit.-Controller und kein 32Bit. :-)
> das ist ein Implementationsdetail und sollte eine "Virtuelle" Maschine nicht beeindrucken, deswegen
> heiÃ?t Sie ja auch so.

OK. Das Argument ist etwas unglücklich gewählt.
Jedoch wollte ich so darauf hinweisen, da� Integer Controllerseitig unterstützt werden, und
Long nur teilweise.
Alles andere muÃ? VM-seitig  gemacht werden. Das schluckt wiederum Rechenzeit.


> Das stimmt so nicht ganz denn folgendes passiert
>
>
> long vlong, long1, vlong16;
> int vInt;
>
> vlong1 = 1;
> vInt16 = 16;
> vlong16 = 16;
>
> 1.) vlong = 1 shl 16;    funktioniert im Simulator, ccontrol habe ich nicht getestet.
> 2.) vlong = 1 shl vInt16;   funktioniert NICHT im Simulator und NICHT in der CCONTROL
> 3.) vlong = 1 shl vLong16;   funktioniert im Simulator aber NICHT in der CCONTROL
> 4.) vlong = vlong1 shl vInt16;  funktioniert im Simulator und in der CCONTROL
>

>
> Wenn deine Aussage oben richtig wäre würde Fall 1.) mit reinen Konstantenausdrücken
> nicht und Fall 3.) funktionieren.
> Im Fall 3.) passiert aber etwas wirklich unschönes, nämlich dass es im Simulator
> läuft in der echten CControl aber nicht.
> Wahrscheinlich ist der "shift" Operator hier ein Sonderfall, da dieser den Typ des rechten
> Operanten nur bedingt in die Berechnung einbezieht...

Meine Aussage stimmt 99%ig. :-)
Das kann ich sogar beweisen. ;-)

Zu Fall 1:
Dies wird nicht im Controller berechnet! :-)
Siehe Handbuch Kap. "5.3.5 Ausdrücke".
Berechnungen, bestehend aus Konstanten werden bereits vom Compiler durchgeführt.
Kurz: Der Compiler macht aus
vlong = 1 shl 16;
einfach
vlong = 0x10000;.
Da 0x10000 grö�er als der Integerbereich ist, legt der Compiler diesenb Wert als Konstante
im Konstantenspeicher ab.

Zu Fall 3:
Gut, hier macht die VM scheinbar einen Fehler, da sie den Variabel-Typ des
zu schiebenden Wertes beibehält.
Allerdings lässt sich dies auch wieder erklären:
Was für einen Sinn macht es, einen grö�eren Wertbereich als Byte
für die Anzahl der Schiebeoperationen anzugeben. :-)
Mehr als 32 macht keinen Sinn.
Daher ändere ich zu Fall 3 meine Aussage, da� der zu Schiebende Wert vom Typ
Long sein muÃ?, wenn das Ergebnis auch Long sein soll.
(genaugenommen habe ich das auch gerade im Handbuch etwas versteckt gefunden. :-)  )

> Also meine Warnung an alle Programmierer erhalte ich aufrecht und denke das dieses ein
> zumindest nicht korrektes Verhalten darstellt.

Die Warnung ist dennoch unnötig, da dies bereits in den FAQ steht. :-)
Nur, daÃ? bei den SH-Ops der zuschiebende Wert dem Typ des Ergebnisses entsprechen muÃ?.

MfG André H.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten: