AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

BoolToStr wirft Access Violation

Ein Thema von hyype · begonnen am 26. Jun 2012 · letzter Beitrag vom 29. Jun 2012
Antwort Antwort
Seite 1 von 2  1 2      
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#1

BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 11:14
Delphi-Version: 5
Hallo Community,

ich bin mal wieder einem Mysterium auf der Spur:
die von mir schon mehrfach verwendete Methode BoolToStr produziert in meinem Projekt eine Zugriffsverletzung,
wenn der boolean-Wert true ist. Bei false nicht!
Ich habe ein neues Projekt erstellt um das zu testen und dort geht es, obwohl es die gleiche Methode ist, die gleiche Delphi-Version, eben alles gleich.
Ich benutze die Methode BoolToStr ohne den optionalen Parameter, packe also nur meinen boolean rein a la
Delphi-Quellcode:
TMyArray = record
  i : integer;
  b : boolean;
  s : String;
  function GetSelfAsString : string; //String-Darstellung des Objekts
end;

function TMyArray.GetSelfAsString: string;
begin
  result := 'i=' + inttostr(i) + delimiter2 +
            'b=' + booltostr(b) + delimiter2 +
            's=' + s;
end;
meine delphi-version ist übrigens xe2, nicht 5

Geändert von hyype (26. Jun 2012 um 11:19 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 11:17
Was für einen Wert hat b genau? Den True ist als nicht falsch also <> 0 definiert.
In Delphi hat True normalerweise den wert 1 in C (WinAPI) aber -1 ( Komplement von 0)
Markus Kinzler
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#3

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 11:26
als integer gecastet 108, interessant, 1 sollte es sein, wie kann denn sowas sein? ^^
(ich weiß, dass der boolean nur das rechteste bit des bytes interpretiert und wenn das 1 ist, ist es true, andernfalls false.
aber wie schaffe ich es, die anderen 7 bits zu befüllen?
indem ich bit-shifting betreibe (shl, shr) ???
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 11:27
Implementiere am Besten eine eigene Funktion dafür.

Wenn 0 dann False sonst True
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 11:34
als integer gecastet 108, interessant, 1 sollte es sein, wie kann denn sowas sein? ^^
Ein falscher Typ auf einem Pointer?
Ein Array über dessen Grenzen geschrieben wurde?
so als Beispiele.

aber wie schaffe ich es, die anderen 7 bits zu befüllen?
indem ich bit-shifting betreibe (shl, shr) ???
wie wäre es mit: integer(mybool):=12345; oder
Delphi-Quellcode:
type
  r1 = packed record
    w1:word;
    b1:boolean;
  end;

begin
  move(@irgendwo,@w1,6);
end;

Gruß
K-H
[/DELPHI]
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 11:57
ich weiß, dass der boolean nur das rechteste bit des bytes interpretiert und wenn das 1 ist, ist es true, andernfalls false.
Das ist nicht ganz richtig. 0 ist false, alles andere ist true. Daher auch immer die Anmerkung, dass man niemals if Bedingung = True then schreiben sollte, denn es kann passieren, dass die Bedingung zwar wahr aber nicht gleich True ist.

Beweis:
Delphi-Quellcode:
if Boolean(2) then
  ShowMessage('2 ist wahr');
if Boolean(2) <> True then
  ShowMessage('2 ist ungleich true');
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 12:26
Implementiere am Besten eine eigene Funktion dafür.
Oder die einfache Lösung:
BoolToStr(b <> False) und falls es verständlicher sein soll BoolToStr(b <> False, True) also einfach den Boolean "neu berechnen" lassen, bzw. einen neuen Boolean zu erstellen.

Aber am Besten du reparierst die Stelle, wo dieser Boolean befüllt wird, damit erst garnicht dieses böse "true" darin auftaucht.




PS: Seit einer Weile besitzen Objekte eine neue Methode:
function ToString: string; virtual; (man kann sie überschreiben und so für eigene Objekte diese Funktionalität implementieren)

Daher würde ich eher empfehlen das GetSelfAsString in ToString umzubenennen, damit du ein einheitliches System bekommst.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (26. Jun 2012 um 12:30 Uhr)
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#8

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 15:47
hallo und dankeschön an alle
ich befürchte fast, in meinem fall liegt es wohl an move...
ich habe dazu eine frage und würde sie hier einfach mal stellen und keinen neuen thread aufmachen:
gesetz dem fall, mein record beinhaltet einen string
(genauer gesagt ist es ein array of string, wobei weder die länge des arrays zur designzeit fest definiert ist, noch die der enthaltenen strings (ist nicht von mir))
und es gibt ein array of record von diesem record
und es wird ein move gemacht a la
Delphi-Quellcode:
  move(MyArrayOfMyRecord[i], MyArrayOfMyRecord[i-1], (length(MyArrayOfRecord)-i) * sizeof(MyRecord));
  setlength(MyArrayOfMyRecord, length(MyArrayOfMyRecord)-1);
was ist das Ergebnis? Kauderwelsch oder? ^^
Weil er kann ja die Größe meines Records nicht anhand des Typs bestimmen, weil weder Länge des Strings, noch Länge des StringArrays fest sind.
Er könnte höchstens die Größe eines ganz bestimmten Objektes dieses Typs ermitteln, was bedeuten würde, ich müsste die Summe an Bytes, die er moven soll, selbst bestimmen aus der Summe der Größe aller zu verschiebenden Elemente anstatt die Größe des Records mit der Anzahl zu multiplizieren, richtig?
Ließe sich dieses Problem umgehen, wenn man aus dem Record eine Klasse machen würde?

@kinzler: ToString kenn ich doch von Java, da hat Delphi wohl abgeguckt?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 15:55
Move mit Strings in Records gehen nicht.
Wenn Du so etwas brauchst dann in der Art:
mytext: array[0..20] of AnsiChar o.ä.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#10

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 15:57
ok, irgendwie "ringt das eine bell"
und wenn ich aus dem Record ne Klasse mache, würde es dann gehen?
Das Problem bleibt ja eigentlich das gleiche, die Größe des Strings (und damit auch der Klasse) hängt davon ab, was man reinschreibt (??)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:27 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