AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [Variants] 0 = Unassigned, wieso das denn?
Thema durchsuchen
Ansicht
Themen-Optionen

[Variants] 0 = Unassigned, wieso das denn?

Ein Thema von alzaimar · begonnen am 8. Jul 2008 · letzter Beitrag vom 9. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
alzaimar
(Moderator)

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

[Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 14:13
Hi,

ich arbeite mal wieder mit Variants und dabei kriege ich wegen folgendem Bug ne Krise:

Delphi-Quellcode:
Var
  v : Variant;

begin
  v := 0;
  if v = Unassigned then ShowMessage('Delphi ist (Del)phies');
end;
Was glaubt Ihr, zeigt mein Delphi? Genau! angeblich ist "0 = Unassigned". Kann mir mal einer den Müll erklären?

Klappt mit D6E und BDS2006, ich könnte
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: [Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 14:54
Moin alzaimar,

das halte ich mal für einen Bug. Immerhin ist auch NULL <> unassigned
Wenn Du mit NULL vergleichst klappt es.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von iKilledKenny
iKilledKenny

Registriert seit: 25. Apr 2007
Ort: Bergstrasse
49 Beiträge
 
Delphi 5 Professional
 
#3

Re: [Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 14:58
Ich prüfe das immer so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var v : Variant;
    i : Integer;
begin
  i := 0;
  v := i;
  if VarIsNull (v) or VarIsEmpty (v) then
    ShowMessage ('Unassigned');
  v := Unassigned;
end;
Alexander Stork
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: [Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 15:44
Ahoj,

so sehe ich das auch, nur ist der Bug schon seit 317 Jahren im System. Der Fehler liegt in der schlampigen Programmierung der VarCompareSimple: Dort wird aus Unassigned einfach der korrespondierende 0-Wert des zweiten Variants. Hier müsste man vorher prüfen, ob entweder die linke oder die rechte Seite 'UnAssigned' ist und dann sofort False liefern, denn ein Vergleich mit unassigned liefert immer False (außer mit Unassigned selbst). Na ja, Schlampen halt

iKilledKenny: Danke für den Workaround, nur ist nicht 100% korrekt, den Null != Unassigned, Du machst aber keinen Unterschied (ich denke aber, das Dir das egal ist).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von iKilledKenny
iKilledKenny

Registriert seit: 25. Apr 2007
Ort: Bergstrasse
49 Beiträge
 
Delphi 5 Professional
 
#5

Re: [Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 15:52
Der Workaround klappt sehr wohl.

VarIsEmpty == (v = Unassigned)
VarIsNull == (v = NULL)
Alexander Stork
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

Re: [Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 16:02
Hatten wir nicht neulich schon mal was ähnliches? Mit Delphi 6 Update Pack 2 tritt das Problem interessanterweise nicht auf (zumindest unter Win98).

Gruß Gammatester
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: [Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 16:13
Moin Alzaimar,

Zitat von alzaimar:
nur ist der Bug schon seit 317 Jahren im System.
vielleicht hat ihn ja bislang noch niemand gemeldet...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: [Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 18:48
Zitat von gammatester:
Hatten wir nicht neulich schon mal was ähnliches? Mit Delphi 6 Update Pack 2 tritt das Problem interessanterweise nicht auf (zumindest unter Win98).
Äh, ich habe UP2 bei mir drauf, dachte ich zumindest ... Ach egal, der Workaround von iKilledKenny funktioniert.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: [Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 20:33
Hallo alzaimar, ich verstehe dein Problem nicht wirklich.

Zitat von alzaimar:
ich arbeite mal wieder mit Variants und dabei kriege ich wegen folgendem Bug ne Krise:
Wie kommst du darauf, dass das ein Bug ist?

Zitat von alzaimar:
Hi,
Delphi-Quellcode:
Var
  v : Variant;

begin
  v := 0;
  if v = Unassigned then ShowMessage('Delphi ist (Del)phies');
end;
Was ist denn deine Absicht? Willst du prüfen, ob die Variant v leer ist (sprich kein Wert zugewiesen wurde)?

Nach meinem Verständnis geht das mit Unassigned nicht. Unassigned ist lediglich dazu da, um eine Variant auf leer zu setzen, nicht um zu prüfen. Was würde man denn da auch prüfen? Leer = Leer? Nicht leer = Leer? Sein oder nicht sein?

Auszug aus der MSDN:

Eine Varianten-Variable kann leer sein, d.h., dass noch kein Wert zugewiesen wurde. Die Funktion Unassigned gibt eine leere Variante zurück, die einer Varianten-Variable zugewiesen werden kann, um den Anfangsstatus der Variable wiederherzustellen.

Verwenden Sie die Funktion VarIsEmpty , um zu prüfen, ob eine Variante leer ist. Bei einer leeren Variante gibt die Standardfunktion VarType den Wert varEmpty zurück.


Zur Verdeutlichung:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Var
  g: Variant;
  v: Variant;
begin
  if g = v then ShowMessage('Leere Variant = Leere Variant ???');

  if VarIsNull(v) then ShowMessage('VarIsNull vorher');
  if VarIsEmpty(v) then ShowMessage('VarIsEmpty vorher');

  v := 0; // Wert wird zugewiesen, Variant ist also nicht mehr leer,
          // könnte aber mit Unassigned wieder leer gesetzt werden.

// if v = Unassigned then ShowMessage('Delphi ist (Del)phies');
  if VarIsNull(v) then ShowMessage('VarIsNull mittendrin');
  if VarIsEmpty(v) then ShowMessage('VarIsEmpty mittendrin');

  v := Null;

  if VarIsNull(v) then ShowMessage('VarIsNull nachher');
  if VarIsEmpty(v) then ShowMessage('VarIsEmpty nachher');
end;
Sieh dir mal die Ergebnisse an. Soweit ich das verstehe ist leer != 0 und 0 != Null (und für den Fall der Fälle Null != nil)

Ich hoffe, ich hab das nicht falsch verstanden.

Guido.
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: [Variants] 0 = Unassigned, wieso das denn?

  Alt 8. Jul 2008, 20:40
.
Hier noch schnell die Deklarationen nachgeschoben. Vielleicht hilfts!

Delphi-Quellcode:
function Unassigned: Variant;
begin
  _VarClear(TVarData(Result));
end;

procedure _VarClear(var V: TVarData);
begin
  // byrefs and those inline data types are easy
  if (V.VType and varDeepData) = 0 then
    V.VType := varEmpty
  else
    VarClearDeep(V);
end;

--------------------------------------------

function Null: Variant;
begin
  _VarNull(TVarData(Result));
end;

procedure _VarNull(var V: TVarData);
begin
  _VarClear(V);
  V.VType := varNull;
end;
Guido.
  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 13:28 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