AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi komisches Verhalten mit OleVariant

komisches Verhalten mit OleVariant

Ein Thema von fisipjm · begonnen am 22. Jul 2022 · letzter Beitrag vom 23. Jul 2022
Antwort Antwort
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#1

komisches Verhalten mit OleVariant

  Alt 22. Jul 2022, 17:24
Hi,

kann mir jemand dieses komische Verhalten erklären welches ich mit einem kleinen Beispielcode nachgestellt habe.
Ich habe die Funktion auf eine VCL Form mit Button und Edit gelegt und lass mir nach Klick auf den Button das Result ins Edit schreiben.

Delphi-Quellcode:
function TForm1.GetInitIntegerOleVariant: String;
var
  I : Integer;
  Iole : Olevariant;
begin
  varclear(Iole);
  Iole := I;
  Result := iOle;
end;
Ich bin darauf gestoßen, weil mir das Verhalten nämlich in einem Projekt um die Ohren geknallt ist. Laut Definition ist jede Integer Variable nach ihrer Initialisierung 0. Wenn ich sie aber in ein Olevariant werfe und nich über vartostr gehe, sondern direkt in einen String caste, dann kommt beim ersten Aufruf irgendwas wildes raus. Beim 2. Aufruf kommt immer die 0.

Gruß
PJM
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
436 Beiträge
 
Delphi 12 Athens
 
#2

AW: komisches Verhalten mit OleVariant

  Alt 22. Jul 2022, 17:29
So etwas hatte ich auch schon mal. Bin mir aber nicht mehr sicher, ob das mit OLEVariant zu tun hatte. Die Integer waren aber auch nicht immer 0. Damals hatte ich mir angewöhnt, alle Integer:=0 zu setzen, wenn diese nicht direkt einen festen anderen Wert bekommen.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.167 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: komisches Verhalten mit OleVariant

  Alt 22. Jul 2022, 17:31
Laut Definition ist jede Integer Variable nach ihrer Initialisierung 0
Und wo wird I initialisiert? Du hast sie deklariert, aber nirgends initialisiert.
Es steht also erst einmal irgend etwas drin. Wenn du möchtest dass eine Null drinsteht kannst du sagen i := 0 oder i := Default(Integer) .
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#4

AW: komisches Verhalten mit OleVariant

  Alt 22. Jul 2022, 17:38
Laut Definition ist jede Integer Variable nach ihrer Initialisierung 0
Und wo wird I initialisiert? Du hast sie deklariert, aber nirgends initialisiert.
Es steht also erst einmal irgend etwas drin. Wenn du möchtest dass eine Null drinsteht kannst du sagen i := 0 oder i := Default(Integer) .
Das stimmt nicht. Bei anderen Programmiersprachen mag das stimmen. Bei Delphi sind Integer und Bool aber per default nach ihrer deklaration immer 0 bzw false. Ich finde gerade leider die Source dazu nicht mehr...
Wenn du eine Funktion schreibst in der du einfach nur I.tostr machst, wird immer 0 dabei heraus kommen.

edit: Hab grad gesehen das der Compiler mir die Info schmeist:
[dcc32 Warnung] Unit1.pas(47): W1036 Variable 'I' ist möglicherweise nicht initialisiert worden

Das macht er bei i.tostring nicht. Wieso?

Geändert von fisipjm (22. Jul 2022 um 17:41 Uhr)
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#5

AW: komisches Verhalten mit OleVariant

  Alt 22. Jul 2022, 17:43
So etwas hatte ich auch schon mal. Bin mir aber nicht mehr sicher, ob das mit OLEVariant zu tun hatte. Die Integer waren aber auch nicht immer 0. Damals hatte ich mir angewöhnt, alle Integer:=0 zu setzen, wenn diese nicht direkt einen festen anderen Wert bekommen.
Führt aber häufog dazu, dass der Compiler meckert und sagt, dass der Wert welcher zugewiesen wurde niemals verwendet wird. Denn in den seltensten Fällen beleibt der Wert unberührt.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.471 Beiträge
 
Delphi 12 Athens
 
#6

AW: komisches Verhalten mit OleVariant

  Alt 22. Jul 2022, 17:46
Bei Delphi sind Integer und Bool aber per default nach ihrer deklaration immer 0 bzw false.
Das gilt nur für globale Variablen und Felder einer Klasse. Einfache lokale Variablen (also keine string, interface oder so) werden nicht initialisiert.

Variables (Delphi)

Zitat:
If you do not explicitly initialize a global variable, the compiler initializes it to 0. Object instance data (fields) are also initialized to 0. The contents of a local variable are undefined until a value is assigned to them.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#7

AW: komisches Verhalten mit OleVariant

  Alt 22. Jul 2022, 17:50
Bei Delphi sind Integer und Bool aber per default nach ihrer deklaration immer 0 bzw false.
Das gilt nur für globale Variablen und Felder einer Klasse. Einfache lokale Variablen (also keine string, interface oder so) werden nicht initialisiert.

Variables (Delphi)

Zitat:
If you do not explicitly initialize a global variable, the compiler initializes it to 0. Object instance data (fields) are also initialized to 0. The contents of a local variable are undefined until a value is assigned to them.
Aha, das war das Problem. Danke. Seltsam das da ein Unterschied zwischen global und local gemacht wird....
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: komisches Verhalten mit OleVariant

  Alt 23. Jul 2022, 00:03
Das ist/war eine Optimierung. gesparte Zeit, wenn nicht ständig im Speicher rumgeschrieben wird (Initialisierung bei Funktionsstart).

Aber mal ganz im Ernst, warum hörst du nicht auf deinen Compiler, welcher dir gesagt haben sollte, dass diese Variable nicht initialisiert ist?



PS: Result wird auch nicht initialisiert.
Hier hast du sogar einen bösen sonderfall, weil es ein String (gemangter Typ) ist.
Nur mit dem Problem, dass das Result (dieser String) nicht dort initialisiert wird, wo du vielleicht denkst.
Hier nicht beim Aufruf der Funktion, sondern beim Aufrufer der Funktion, wo der Speicher für "dieses" Result her kommt. (bei gemagten Typen)



Globale Variablen liegen auf dem Heap, in einem Speicherbereich, welche von Windows bereitgestellt wird, wenn das Modul (EXE oder DLL) geladen wird.
Ebenso sieht es mit Thread-Variablen aus, wo der Speicherbereich beim erstellen des Threads bereitgestellt wird.

Speicher von Windows, ebenso wie aus VirtualAlloc, wird immer mit 0 initalisiert.



Lokale Variablen liegen aber auf dem Stack, welcher zwar zu Beginn (Program/Thread) zwar auch 0 ist, aber dort wird nie gelöscht
und bei Funktionseintritt auch nicht von Delphi neu geleert.
Außnahme sind gemanagte Typen, wie Variant, Interface, String, dynamische Arrays und neuerdings (bedingt) auch Managed Custom Records.
Grund ist die automatische Speicherverwaltung, welche nur funktionieren kann, wenn es einen definierten Zustand gibt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (23. Jul 2022 um 00:08 Uhr)
  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 04:19 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