For-Schleife bricht unerwartet ab

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: For-Schleife bricht unerwartet ab

Beitrag von Warf »

siro hat geschrieben:Ich hoffe, er tut das nicht, das kam mir nur in den Sinn, weil ich mich fragte wie das mal funktioniert haben soll mit einem Shortint.
Der Fehler hätte doch dann früher auch schon auftreten müssen.

Ich habe mir meine eigenen Datentypen gemacht, sicherlich nicht jedermanns Geschmack,
aber ich kann meinen Code dadurch wesentlich besser lesen und dokumentieren.
Der Ursprung lag aber ursprünglich beim "C" weil ich auch nie wuste wie groß die Datentypen sind.
Der Typ Integer ist zwar in 99 Prozent der Fälle okay, aber es ist ja nie wirklich klar wie groß er nun wirklich ist.
Durch meine Deklarationen sehe ich sofort was gemeint ist.


Du weißt aber schon das es im system header vom fpc folgende Definitionen gibt oder?

Code: Alles auswählen

type
...
  NativeInt  = PtrInt;
  NativeUInt = PtrUInt;
 
  Int8    = ShortInt;
  Int16   = SmallInt;
  Int32   = Longint;
  IntPtr  = PtrInt;
  UInt8   = Byte;
  UInt16  = Word;
  UInt32  = Cardinal;
  UIntPtr = PtrUInt;   


Und ja die ganze verwirrung kommt ja vor allem zustande da weder der C noch der C++ standard wirklich die größe von Integers definiert. Im C und auch im C++ standard ist es so definiert: short mindestens 16 bit, int mindestens 16 bit, long mindestens 32 bit und long long mindestens 64 bit. Ein Compiler der ein 20 bit short, 50 bit int, 43 bit long und 500 bit long long kompiliert wäre also komplett Standard konform, auch wenn es wenig sinn macht (es wird noch verrückter wenn man mit signed und unsigned anfängt). Daher definiert der standard sogar die type intxx_t und uintxx_t, denn diese sind genau auf xx bit definiert

In praktisch allen anderen Sprachen wird dieser Fehler der in C gemacht wurde umgangen indem praktisch überall (wie auch beim fpc) int immer 32 bit ist und vermutlich wird das vorerst auch so bleiben, denn selbst wenn die 128 bit architektur raus kommt kennt man mittlerweile die probleme aus C, und würde einen teufel tun integer zu redefinieren

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: For-Schleife bricht unerwartet ab

Beitrag von indianer-frank »

Warf hat geschrieben:In praktisch allen anderen Sprachen wird dieser Fehler der in C gemacht wurde umgangen indem praktisch überall (wie auch beim fpc) int immer 32 bit ist und vermutlich wird das vorerst auch so bleiben, denn selbst wenn die 128 bit architektur raus kommt kennt man mittlerweile die probleme aus C, und würde einen teufel tun integer zu redefinieren

Das ist nur halb-richtig, im FPC-Default-Modus ist integer 16-Bit,
Reference guide for Free Pascal hat geschrieben:The integer type maps to the smallint type in the default Free Pascal mode
Zuletzt geändert von indianer-frank am Do 15. Feb 2018, 17:20, insgesamt 1-mal geändert.

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: For-Schleife bricht unerwartet ab

Beitrag von indianer-frank »

(Bitte löschen, falsche Funktion) :(

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: For-Schleife bricht unerwartet ab

Beitrag von Warf »

indianer-frank hat geschrieben:Das ist nur halb-richtig, im FPC-Default-Modus ist integer 16-Bit,
Reference guide for Free Pascal hat geschrieben:The integer type maps to the smallint type in the default Free Pascal mode

Stimmt, default FPC mode ist allerdings auch Praktisch eine andere, lang gestorbene, Sprache. Mit fpc meinte ich ObjFPC mode, da heutzutage keiner mehr das alte Pascal verwendet. Und auch da ist es wenigstens immer 16 bit, und nicht zwischen durch mal 32 oder 64 je nach dem wie der compiler lust und laune hat

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: For-Schleife bricht unerwartet ab

Beitrag von Mathias »

Timm Thaler hat geschrieben:
Mathias hat geschrieben:Was ich mir angewöhnt habe, wen es wichtig ist, wie ein Integer aussieht, dann deklariere ich mit int8, uint8, int16, uint16, etc.


Ist auf Embedded Systemen sinnvoll. Bringt auf dem PC gar nichts. Die Datentypen werden immer auf die 32 oder 64bit des OS erweitert.

Ist mir mal böse aufgestoßen, als ich eine Rechenroutine für einen Sensor auf dem PC "optimieren" wollte. Da funktionierte das mit int16 wunderbar, auf dem µC dann gar nicht. Ja, der Compiler hat auf dem PC die int16 einfach auf 64bit erweitert und da passten alle Werte locker rein.

Wie hast du dies hingekriegt ?
Hattest du die Integer in einem record ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: For-Schleife bricht unerwartet ab

Beitrag von Timm Thaler »

Warf hat geschrieben:Und auch da ist es wenigstens immer 16 bit, und nicht zwischen durch mal 32 oder 64 je nach dem wie der compiler lust und laune hat


Sicher?

Code: Alles auswählen

var
  utemp : uint16;
  bmp_ac5, bmp_ac6 : uint16;
  x1 : int16;
begin
  x1 := (utemp - bmp_ac6) * bmp_ac5 div 32768;


Funktioniert auf dem PC, weil der Compiler die Multiplikation uint16 x uint16 auf 32 oder 64 Bit erweitert. Funktioniert nicht auf dem µC, weil der Compiler da ohne weiteres Casting mit 16 Bit durchrechnet.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: For-Schleife bricht unerwartet ab

Beitrag von Mathias »

Jetzt weis ich was du meinst, wen es auf jedes Byte ankommt, wie auf einem AVR, ist dies sicher ärgerlich.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: For-Schleife bricht unerwartet ab

Beitrag von Warf »

Timm Thaler hat geschrieben:Sicher?

Code: Alles auswählen

var
  utemp : uint16;
  bmp_ac5, bmp_ac6 : uint16;
  x1 : int16;
begin
  x1 := (utemp - bmp_ac6) * bmp_ac5 div 32768;


Funktioniert auf dem PC, weil der Compiler die Multiplikation uint16 x uint16 auf 32 oder 64 Bit erweitert. Funktioniert nicht auf dem µC, weil der Compiler da ohne weiteres Casting mit 16 Bit durchrechnet.


Das sagt ja nichts über die Typgröße aus, sondern nur über die Größe des Ergebnisses einer Multiplikation. Und das ein 32 Bit Multiplikationswerk ein 32 Bit Ergebnis auspuckt ist an sich zu erwarten. Es geht mir darum das der Typ Integer immer 32 Bit groß ist und nicht wie in C mal 16, 32 oder 64 Byte groß ist. Es gibt auch Spaßcompiler für C die genau diese sachen aufs korn nehmen und diese wagen stellen aufs ärgste ausreizen

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: For-Schleife bricht unerwartet ab

Beitrag von Timm Thaler »

Warf hat geschrieben:Und das ein 32 Bit Multiplikationswerk ein 32 Bit Ergebnis auspuckt ist an sich zu erwarten.


Vorsicht. Hier gehen zwei 16-Bit-Werte in die Multiplikation, und es ist durchaus nicht selbstverständlich, dass der Compiler daraus eine 32-Bit-Multiplikation macht. Unter C macht er das nicht, und FPC auf dem µC macht es auch nicht. Das rechnet da mit 16 Bit durch, wenn man nicht explizit VORHER in 32 Bit wandelt.

Mathias hat geschrieben:Jetzt weis ich was du meinst, wen es auf jedes Byte ankommt, wie auf einem AVR, ist dies sicher ärgerlich.


Es geht weniger um die Speicherstellen, aber eine Longint-Multiplikation auf dem AVR dauert etwa 100mal länger als das Gleiche in 16 Bit. Bin ich gerade dran das mit dem Oszi auszumessen und zu optimieren.

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: For-Schleife bricht unerwartet ab

Beitrag von BeniBela »

Den Zähler kann man auch ganz weglassen, dann hat man keine Probleme damit:

Code: Alles auswählen

 
var line: string;
for line in Memo1.Lines do ...
 

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: For-Schleife bricht unerwartet ab

Beitrag von Socke »

Dann wird es aber schwierig auf die nächste bzw. vorherige Zeile zuzugreifen.
Im Quelltext wird das getan; da fehlt nur die Prüfung, ob die nächste Zeile tatsächlich existiert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: For-Schleife bricht unerwartet ab

Beitrag von mschnell »

siro hat geschrieben:Ich habe mir meine eigenen Datentypen gemacht, sicherlich nicht jedermanns Geschmack, aber ich kann meinen Code dadurch wesentlich besser lesen und dokumentieren.

Dann nimm doch wenigstens die Namnen, die im Linux source code verwendet werden:
uint8_t, uint16_t, uint32_t, uint64_t, int8_t, int16_t, int32_t, int64_t, ...
-Michael

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: For-Schleife bricht unerwartet ab

Beitrag von Mathias »

Dann nimm doch wenigstens die Namnen, die im Linux source code verwendet werden:
uint8_t, uint16_t, uint32_t, uint64_t, int8_t, int16_t, int32_t, int64_t, ...

Wieso so kompliziert, FPC hat dies schon fertig, wie oben schon beschrieben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Andrewi
Beiträge: 18
Registriert: Fr 8. Mär 2013, 16:07
OS, Lazarus, FPC: MINT 21, Laz: 2.2.0, FPC: 3.2.2
CPU-Target: x64
Wohnort: Hzgt. Lauenburg

Re: For-Schleife bricht unerwartet ab

Beitrag von Andrewi »

Hallo zusammen!

Vielen Dank für eure Hilfe.
Shortint in Integer geändert --> alls läuft!
Habe den Rest der Diskusion mit Interesse gelesen und hoffe, daß ich mal wieder etwas in diesem Forum gelernt habe.

André
Ein Mensch meint gläubig wie ein Kind, dass alle Menschen Menschen sind. (Eugen Roth)

Antworten