AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Integer erkennen der nicht initalisiert wurde
Thema durchsuchen
Ansicht
Themen-Optionen

Integer erkennen der nicht initalisiert wurde

Ein Thema von Andreas L. · begonnen am 23. Mai 2007 · letzter Beitrag vom 25. Mai 2007
Antwort Antwort
Seite 2 von 3     12 3      
Andreas L.
(Gast)

n/a Beiträge
 
#11

Re: Integer erkennen der nicht initalisiert wurde

  Alt 23. Mai 2007, 22:14
Wie verwende ich Variants? Was muss ich beim Umbau meines records zum Variant beachten?
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#12

Re: Integer erkennen der nicht initalisiert wurde

  Alt 23. Mai 2007, 22:45
Hallo,
Zitat von 3_of_8:
...oder einfach mit ZeroMemory den ganzen Record mit 0en überschreiben.
Aber bitte nicht bei Records mit dynamischen Daten (z.B. AnsiStrings), das führt unter Umständen zu hässlichen Speicherlecks.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#13

Re: Integer erkennen der nicht initalisiert wurde

  Alt 23. Mai 2007, 23:29
Ich halte mich bei solchen Problemen gern an die Intel-Konventionen, die u.a. bei Integer-Typen einen Indefinite-Wert vorsehen.
Ein Indefinite ist ein Integerwert, bei dem nur das höchste Bit = 1 und alle anderen Bits = 0 sind.
Wer das für unsinnig hält der versuche mal einen solchen Wert mit Abs(x) oder mit x:=-x in einen positiven Wert umzuwandeln.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Integer erkennen der nicht initalisiert wurde

  Alt 24. Mai 2007, 06:01
Du kannst deinen Anwendern auch eine Funktion zur verfügung stellen, mit sovielen Parametern wie dein Record Felder enthält. Dann müssen dein Anwender alle Felder angeben und die nicht benötigten eben 0 übergeben.

Natürlich wirst du dadurch nicht verhindern können, dass trotzdem einer direkt auf den Record zugreift, und gewisse Felder nicht initialisiert. Um das zu vermeiden, mach aus deinem Record eine Klasse, deklarier die vorhandenen Felder in den Private Teil, stelle read-only public Eigenschaften zur Verfügung zum Auslesen der Werte. So kann keiner schreibend auf die Felde zugreifen. Wenn du dann wieder die besagte Mehtode in der Klasse implementierst, zum Setzen der Felder, so kann nichts mehr schief gehen, da immer alle Werte auf einen Ruck gesetzt werden... Ich kürz hier mal das Beispiel ab:

Delphi-Quellcode:
type
  TTrack = class
  private
    FTitle : string ;
    FTrackNum : integer ;
  public
    property Title : string read FTitle ;
    property TrackNum : integer read FTrackNum ;
    
    procedure SetValues (Title : string ; TrackNum : integer) ;
  end ;

implementation

procedure TTrack.SetValues (Title : string ; TrackNum : integer) ;
begin
     Self.FTitle := Title ;
     Self.FTrackNum := TrackNum ;
end ;
[edit=Admin] Mfg, Daniel[/edit]
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: Integer erkennen der nicht initalisiert wurde

  Alt 24. Mai 2007, 06:05
Zitat von Andreas L.:
Wie verwende ich Variants? Was muss ich beim Umbau meines records zum Variant beachten?
1. Die Unit 'Variants' einbinden
2. Alle betreffenden Record-Felder als 'Variant' deklarieren.
3. Alle betreffenden Felder mit 'UnAssigned' initialisieren.
4. Fertig

Schau Dir mal die Delphi-Hilfe bezüglich 'Variants' an.

[edit=Admin] Mfg, Daniel[/edit]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#16

Re: Integer erkennen der nicht initalisiert wurde

  Alt 24. Mai 2007, 08:54
Über Variants gibt meine Delphi-Hilfe nicht viel her. Hab es jetzt so ähnlich wie von Jelly vorgeschlagen gemacht:

Delphi-Quellcode:
type
 TTrack = class(TComponent)
   public
   Location: String; //filename (also relative) or url, see TOptions
   Identifier: String; //file hash, etc...
   Title: String;
   Creator: String; //artist
   Annotation: String; //comment
   Info: String; //homepage for more informations
   Image: String; //e. g. a cover. URL or filename required
   Album: String;
   TrackNum: Integer; //track number/position in the playlist or on the cd
   Duration: Integer; //length in miliseconds
   Link: String; //link to some rdf code... see specs.
   published
   constructor Create(AOwner: TComponent); override;
 end;

...
...

constructor TTrack.Create(AOwner: TComponent);
begin

 inherited Create(AOwner);
 Duration := 0; //initalisieren
 TrackNum := 0; //" " "

end;

...
//Aufruf:
procedure TForm1.Button1Click(Sender: TObject);
var
 tr: TTrack;
begin

 tr := TTrack.Create(Self);
 tr.Location := 'sdfsdfdff';
 tr.Creator := 'sdfgdsfds';
 XSPF1.Tracks.Add(tr);

end;
Denkt ihr das ist eine gute Lösung? Funktionieren tuts
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#17

Re: Integer erkennen der nicht initalisiert wurde

  Alt 24. Mai 2007, 09:21
Delphi-Quellcode:
Uses Variants;

Type
  TTrack = record
    Location: Variant; //filename (also relative) or url, see TOptions
    Identifier: Variant; //file hash, etc...
    Title: Variant;
    Creator: Variant; //artist
    Annotation: Variant; //comment
    Info: Variant; //homepage for more informations
    Image: Variant; //e. g. a cover. URL or filename required
    Album: Variant;
    TrackNum: Variant; //track number/position in the playlist or on the cd
    Duration: Variant; //length in miliseconds
    Link: Variant; //link to some rdf code... see specs.
    Procedure InitializeData;
  end;

Procedure TTrack.InitializeData;
Begin
  Location := UnAssigned;
  Identifier := UnAssigned;
  Title := UnAssigned;
  Creator := UnAssigned;
  Annotation := UnAssigned;
  Info := UnAssigned;
  Image := UnAssigned;
  Album := UnAssigned;
  TrackNum := UnAssigned;
  Duration := UnAssigned;
  Link := UnAssigned;
End;

...
Var
  myTrack : TTrack;

Begin
  myTRack.InitializeData;
...
  If myTrack.Location = UnAssigned Then
    Showmessage('Dem Feld <Location> wurde noch nie etwas zugewiesen');
Zitat von Andreas L.:
Über Variants gibt meine Delphi-Hilfe nicht viel her....
Oh ja, das stimmt. Haufenweise Müll...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#18

Re: Integer erkennen der nicht initalisiert wurde

  Alt 24. Mai 2007, 17:22
Zitat von Amateurprofi:
Ich halte mich bei solchen Problemen gern an die Intel-Konventionen, die u.a. bei Integer-Typen einen Indefinite-Wert vorsehen.
Ein Indefinite ist ein Integerwert, bei dem nur das höchste Bit = 1 und alle anderen Bits = 0 sind.
Wer das für unsinnig hält der versuche mal einen solchen Wert mit Abs(x) oder mit x:=-x in einen positiven Wert umzuwandeln.
Das IST Unsinn. Z.B. 16bit-Integer ist definiert als -32768 ... 32767 (mit Vorzeichen) oder 0 ... 65535 (ohne), bei Integern sind alle möglichen Bitmuster gültig. Nach deiner Definition hätte ein 16bit unsigned int mitten im Zahlenraum ein Loch bei 32768!!!

Steht so in allen Lehrbüchern und in der Delphihilfe, und alle Compiler arbeiten auch so, in jeder Programmiersprache, die je erfunden wurde.

Wahrscheinlich hast du das mit einer Real-Darstellung verwechselt, da gibt es tatsächlich NaNs (Not a Number).

Gruss Reinhard
  Mit Zitat antworten Zitat
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#19

Re: Integer erkennen der nicht initalisiert wurde

  Alt 24. Mai 2007, 17:29
Hallo!

Wollte nur kurz daraufhinweisen, daß in Klassen alle Felder bereits mit 0 bwz '' initialisiert sind. Da fällt das Initialisieren also meist flach...

Cu,
Udontknow
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#20

Re: Integer erkennen der nicht initalisiert wurde

  Alt 25. Mai 2007, 16:04
nur so eine Idee - kann man mit überladen von Operatoren da nichts machen. Eine Zuweisung, Addition etc. kann man ja damit regeln. Gibt es da eventuell auch Initialisation?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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:24 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