Achtung, Fehler beim Pointer bauen!

Ralle

Super-Moderator , User des Jahres 2006-2007
Teammitglied
Beiträge
15.404
Reaktionspunkte
4.039
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich muß mal aus gegebenem Anlaß ein Stück Code korrigieren, daß wir recht oft hier im Forum verwenden.

Code:
// Pointerformat für indirekte Adressierung
      L     #iOffset
     [COLOR="Red"][B] ITD [/B][/COLOR]  
      SLD   3
      T     #dwAddr

ITD an dieser Stelle ist falsch.

Grund: Wenn man mit iOffset über 32767 kommt, (Ist ja dann ein negativer Wert, wenn man die Zahl als Int betrachtet), dann bewirkt ITD ein Verschieben des negativen Vorzeichens (Bit 16) nach Bit 32. Wenn man z.Bsp. Daten in Datenbausteinen > 32K adressieren will, geht das nicht.

Lösung: Das IDT kann man einfach weglassen.

PS: Für Datenbausteine < 32K macht das ITD nichts aus.
 
Der Wertebereich eines 16-Bit Integers ist bei der S7 aber nunmal -32.768 bis +32.767.
Wenn du Werte größer 32.767 haben möchtest ist ein Integer hier fehl am Platz, dann müsste man die Variable als Word deklarieren.

ITD ist aber wirklich über, auch wenn ich das selber bis jetzt immer so geschrieben habe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also ich wandle nie ITD in dem zusammenhang ... wo siehst du die häufige verwendung dieser zeilen?

betrachte den offset doch nicht als INT sondern als WORD, also wOffset ... dann ist der wertebereich doch schon richtig ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
pointer ist 32bit breit, da führt auch kein weg dran vorbei!

Schon klar, aber ein DInt ist auch 32 Bit breit.
Von Int nach Dint ist das ITD auch eigentlich gedacht um das Vorzeichen mitzunehmen.
In einer Hochsprache ginge das von Int nach DWord auch nur mit entsprechenden Casts um den Compililer zu besänftigen, AWL macht das halt einfach so...
 
deswegen sage ich: man betrachte den "offset" einfach als WORD oder im besten falle DWORD mit dem entsprechenden wertebereich ab 0 PUNKT
 
deswegen sage ich: man betrachte den "offset" einfach als WORD oder im besten falle DWORD mit dem entsprechenden wertebereich ab 0 PUNKT

Das weiß ich doch und deshalb habe ich das auch geschrieben, warum diskutierst du das jetzt noch 8 Mal. Aber wenn du mal hier im Forum suchst wirst du schon fündig. Ich selbst hatte das auch eine Weile lang in meinen Bausteinen, weil ich mal meinte, mann sollte 16 Bit doch explizit in 32 Bit überführen, alleine wegen der Übersichtlichkeit (man kanns halt auch übertreiben). In diesem Falle führt das aber wie ja oben erwähnt irgendwann zu einem Fehler.
 
Zurück
Oben