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
Benutzerbild von himitsu
himitsu

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

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.
Ein Therapeut entspricht 1024 Gigapeut.

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
 
#2

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
 
#3

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
 
#4

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
Benutzerbild von himitsu
himitsu

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

AW: BoolToStr wirft Access Violation

  Alt 26. Jun 2012, 16:19
Move mit Strings in Records gehen nicht.
Genauer bei "Long-Strings" und WideString.
ShortString und statische Char-Arrays gehn.

Genauso wie es bei Interfaces, Variants und dynamischen Arrays auch nicht geht, bzw. nicht ohne Beachteung gewisser Dinge, bei deren automatischen Speicherwerwaltung.


In der Unit System gibt es eine Abteilung "Compiler helper for initializing/finalizing variable" mit netten Funktionen.
New
Dispose
Initialize
InitializeArray
InitializeRecord
Finalize
FinalizeArray
FinalizeRecord
CopyArray
CopyRecord

Welche Delphi intern verwendet und die man notfalls selber verwenden könnte, aber dennoch sollte man ein bissl Ahnung davon haben, wie z.B. die Speicherverwaldung und Referenzzählung arbeiten.

Ansonsten: Finger weg, von direkten Speichermanipulationen. (Pointer, Move und Co.)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.491 Beiträge
 
Delphi 12 Athens
 
#6

AW: BoolToStr wirft Access Violation

  Alt 27. Jun 2012, 11:35
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?
Die Grösse der Strings spielt keine Rolle, im Record sind nur Zeiger auf die Strings abgelegt.
Zeiger belegen immer 4 Byte, deshalb sind alle Elemente des Arrays gleich groß.
Das Element[i] wird mit Move überschrieben, ohne das die Speicherverwaltung der dort referenzierten Strings etwas mitbekommt. Diese Strings werden nie mehr freigegeben.
Kann man so umgehen:
Delphi-Quellcode:
Finalize(MyArrayOfMyRecord[i]);
move(MyArrayOfMyRecord[i], MyArrayOfMyRecord[i - 1], (Length(MyArrayOfRecord) - i) * Sizeof(MyRecord));
Nach dem Move verweist das letzte und das vorletzte Element auf die selben Strings, diese wissen aber nichts von der zusätzlichen Referenz. Das anschließende SetLength löscht das letzte Element und verringert den Referenzzähler der Strings. Dadurch werden diese freigegeben obwohl ja noch ein Element darauf verweist.
Kann man so umgehen:
Delphi-Quellcode:
FillChar(MyArrayOfMyRecord[Length(MyArrayOfRecord) - 1], Sizeof(MyRecord), #0);
SetLength(MyArrayOfMyRecord, Length(MyArrayOfRecord) - 1);
  Mit Zitat antworten Zitat
hyype

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

AW: BoolToStr wirft Access Violation

  Alt 29. Jun 2012, 13:04
Zusammenfassend lässt sich also sagen:

Delphi-Quellcode:
move(MyArrayOfMyRecord[i], MyArrayOfMyRecord[i-1], (length(MyArrayOfRecord)-i) * sizeof(MyRecord));
setlength(MyArrayOfMyRecord, length(MyArrayOfMyRecord)-1);
wird zu

Delphi-Quellcode:
Finalize(MyArrayOfMyRecord[i]);
move(MyArrayOfMyRecord[i], MyArrayOfMyRecord[i-1], (length(MyArrayOfRecord)-i) * sizeof(MyRecord));
FillChar(MyArrayOfMyRecord[Length(MyArrayOfRecord) - 1], Sizeof(MyRecord), #0);
setlength(MyArrayOfMyRecord, length(MyArrayOfMyRecord)-1);
  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 15:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz