AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Was macht: "foo := ord(s[t] >= s[t+1]);" ?
Thema durchsuchen
Ansicht
Themen-Optionen

Was macht: "foo := ord(s[t] >= s[t+1]);" ?

Ein Thema von paule32.jk · begonnen am 19. Mär 2024 · letzter Beitrag vom 20. Mär 2024
Antwort Antwort
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#1

Was macht: "foo := ord(s[t] >= s[t+1]);" ?

  Alt 19. Mär 2024, 18:51
Hallo,
- wie der Betreff schon andeutet: was macht foo := ord(s[t] >= s[t+1]); ?
- wie sieht die IF-Klausel ausgeschrieben aus - falls es eine IF-Klausel ist ?
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
682 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Was macht: "foo := ord(s[t] >= s[t+1]);" ?

  Alt 19. Mär 2024, 19:00
Bei dem Schnipsel geht es weniger darum was er macht. Es mehr darum das der Code kryptisch wirkt und Leser zum Grübeln bringt, wie dich jetzt
Und nein, das hat nicht wirklich was mit IF zu tuen.
In Delphi kommt da 0 oder 1 raus. Je nachdem was in s[t] und s[t+1] steht.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.084 Beiträge
 
Delphi 12 Athens
 
#3

AW: Was macht: "foo := ord(s[t] >= s[t+1]);" ?

  Alt 19. Mär 2024, 19:06
Es vergleicht einfach zwei aufeinanderfolgende Items eines Strings/Arrays auf >=
und die Rückgabe ist eigentlich ein Boolean, der aber als Integer gespeichert ist, also 0 oder 1.

Delphi-Quellcode:
if s[t] >= s[t+1] then
  foo := 1 // Ord(True)
else
  foo := 0; // Ord(False)
Achtung, je nach Boolean-Typ kann True auch -1 sein.
Im C++ ist die True-Konstante = -1 (alle Bits gesetzt) und im Delphi +1 (nur das kleinste Bit gesetzt)
Boolean versus BOOL/ByteBool/WordBool/LongBool
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Was macht: "foo := ord(s[t] >= s[t+1]);" ?

  Alt 19. Mär 2024, 20:01
Danke für die Antwort.
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet

Geändert von paule32.jk (19. Mär 2024 um 21:04 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#5

AW: Was macht: "foo := ord(s[t] >= s[t+1]);" ?

  Alt 20. Mär 2024, 13:40
Bei dem Schnipsel geht es weniger darum was er macht. Es mehr darum das der Code kryptisch wirkt und Leser zum Grübeln bringt, wie dich jetzt
Und nein, das hat nicht wirklich was mit IF zu tuen.
In Delphi kommt da 0 oder 1 raus. Je nachdem was in s[t] und s[t+1] steht.
Ich denke mal es ging dem Programmierer dabei um Branchless-code um zeitintensive Fehler bei der Branchprediction im Prozessor zu vermeiden . Leider ist der Vergleich eigentlich ach wieder ein branching...
den müsste man noch weg rechnen.

Delphi-Quellcode:
Function GE(const x:integer; const y:integer):integer; Inline;
Begin
  // geklaut hier https://codegolf.stackexchange.com/questions/226238/programming-less-than-greater-than-and-equal-to-functions-using-restricted-
  Result := (x - y + 1) div (abs(x - y) + 1);
end;
foo := GE(s[t],s[t+1]);
Delphi-Quellcode:
// BRANCHLESS COMPARE FUNCTIONS
Function BL_GE(const x,y:Integer):Integer;Inline;
Begin
  Result := (x - y + 1) div (abs(x - y) + 1);
End;
Function BL_LE(const x,y:Integer):Integer;Inline;
Begin
  Result := BL_GE(y,x);
End;
Function BL_E(const x,y:Integer):Integer;Inline;
Begin
  Result := BL_GE(x, y) * BL_LE(x, y);
End;
Function BL_L(const x,y:Integer):Integer;Inline;
Begin
  Result := 1 - BL_GE(x, y); // ODER BL_LE(x, y) - BL_E(x, y)
End;
Function BL_G(const x,y:Integer):Integer;Inline;
Begin
  Result := 1 - BL_LE(x, y); // ODER BL_GE(x, y) - BL_E(x, y)
End;
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (20. Mär 2024 um 14:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz