AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi "Cardinal-String" zurück in Cardinal: Exception

"Cardinal-String" zurück in Cardinal: Exception

Ein Thema von ChrisE · begonnen am 12. Mai 2006 · letzter Beitrag vom 12. Mai 2006
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

Re: "Cardinal-String" zurück in Cardinal: Exceptio

  Alt 12. Mai 2006, 16:13
Zitat von Muetze1:
Gleiches Problem hatte ich auch und warum ist ja nun schon gut erklärt worden. Andere Lösung dazu, welche ich damals gefunden habe:

Str() und Val() sind typspezifisch und arbeiten richtig. Grundlegendes Problem hast du nämlich, wenn du eine Zahl die als String vorliegt und > High(Integer) (MaxInt) ist aber auch gleichzeitig < High(Cardinal) ist - diese wird mit StrToInt nicht ordentlich konvertiert und IntToStr64() löst u.U. unerklärlicherweise trotzdem eine ERangeCheck Exception aus (obwohl es eigentlich ohne Problem klappen sollte) (bei eingeschalteter Bereichsprüfung). Die Val() Funktion arbeitet hingegen fehlerfrei und wandelt auch die Zahlen in dem o.g. Bereich sauber in vorzeichenlose 32 Bit Ganzzahlen um. Str() ist auch das passende Gegenstück, welches richtige Zahlen aus Cardinaltypen ohne Vorzeichen mit der richtigen Grösse erstellt.
Danke dir auch. Die Bereichsüberprüfung war bei mir an. Auch Deine Variante Funktioniert auch soweit ich das sehen kann. Das Problem ist, dass ich diese Variationen immer erst auf Maschine A (WinXP / neu / toll / super) erstellen muss und sie dann auf Maschine B (Win98SE / alt / langsam/ sch... ) per USB-Stick rüber "tragen" muss. Hängt aus diversen Gründen nicht am Netz. Delphi darf nicht installiert werden --> Debugging wird suuuuuuuuuuuuuuper. Und da dieser Cardinal ursprünglich ein DWord-Ergebnis von einer Windows-API-Funktion ist (GetWindowThreadProcessId(...)) wird's nochmal besser. Die ProcessID's sind unter XP unterhalb von MaxInt (zumindest bei mir, weil das System nie so lange läuft). Unter W98SE sind die immer > MaxInt. Der Fehler tritt also nur dort auf. Und das ohne Debugging


Zitat von himitsu:
Die Erklärung, warum es "super" klappt ist eigentlich ganz einfach.

Cardinal liegt ja irgendwo im Speicher rum und ist 4 Byte (32 Bit, bei den "aktuellen" 32-Bit-Compilern) groß.
Nun ist es dem Speicher aber vollkommen egal was er ist ... das Was kommt erst zu stande, wenn er intepretiert wird, also wenn irgendwas festlegt was welches Bit zu bedeuten hat und wie diese zusammenarbeiten.

Nun ist allerdings ein Integer auch 4 Byte groß demnach kann man ganz locker diese 4 Byte auch mal als Integer interpretieren, oder auch mal als Single (ist ja auch nur ein 4-Byte-Real-Wert), oder wie wäre es mal als Array[0..3] ob Byte? ... alles was gleich groß ist, kann man direkt umwandeln.
Dieses Integer(C), oder Cardinal(i) macht also nichts anders, als den Inhalt der Veriable umzuwandeln, oder besser gesagt anders zu interpretieren.

Das praktische am Integer und Cardinal ist ja auch noch der Umstand, daß deren Formate eigentlich fast gleich sind ... beim Cardinal wird jedem Bit eine Wertigkeit zugeordnet und diese dann addiert, was beim Integer eigentlich genauso ist, nur daß halt da das höchste Bit nicht als Wert, sondern als das Vorzeichen verwendet wird ... somit macht man alao nur mit Integer(C) das höchste Bit, welches im Cardinal den Bereich über MaxInt darstellt das Vorzeichen, also den Bereich unter MinCardinal.

PS:
öffne einfach mal deinen Windowstaschenrechner, stell den auf Wissenschaftlich um
und gib den Wert für MinInt ein (kannst'e aus der OH kopieren),
dann stell den Taschenrechner auf Hexadezimal um und wieder zurück auf Dezimal ...
und schwupps steht da der Wert für MaxInt + 1,
da dieser Taschenrechner mit 64 Bit rechnet und somit die unteren 4 Bytes sozusagen
als Cardinal gelesen werden, wenn sie aus dem Hexadezimalen kommen.
Danke nochmals für die erklährung. Aber genau diese Tatsache - also die eigentliche gleichwertigkeit von Integer und Cardinal - brachte mich völlig aus dem Konzept bei dem Exception. Ich wollte eben, dass er mir den Inhalt der Wandlung einfach in die Variable schiebt. Doch das lößte immer diesen Exception aus. Naja, jetzt klappt es ja mit dem Typcast.

THX @ all.

und ich meine nicht "Regeln"
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: "Cardinal-String" zurück in Cardinal: Exceptio

  Alt 12. Mai 2006, 16:23
Zitat:
Und da dieser Cardinal ursprünglich ein DWord-Ergebnis von einer Windows-API-Funktion ist (GetWindowThreadProcessId(...)) wird's nochmal besser. Die ProcessID's sind unter XP unterhalb von MaxInt (zumindest bei mir, weil das System nie so lange läuft). Unter W98SE sind die immer > MaxInt. Der Fehler tritt also nur dort auf. Und das ohne Debugging
Also im Grunde hättest du dir auch theortisch die Funktion GetWindowThreadProcessId selbst definieren/einbinden können und statt DWORD einfach LongInt verwenden können ... da wäre dann der TypeCast dann direkt eingebaut ^^

PS: danke für die Info mit den ProcessID's ... hatte micht vor ein paar Tagen auch schonmal gefragt, ob die immer zwischen 0 und MaxInt liegen ... bei mir kommen die ja och nie darüber.
(ich frag mich halt, ob man bei bestimmten Werten ein/zwei Bits einschmugeln kann ... halt nur wenn diese normaler Weise nicht verwendet werde )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:15 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