AGB  ·  Datenschutz  ·  Impressum  







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

Größe bei dyn. Arrays automatisch?

Ein Thema von jensen82 · begonnen am 27. Mai 2013 · letzter Beitrag vom 29. Mai 2013
Antwort Antwort
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#1

AW: Größe bei dyn. Arrays automatisch?

  Alt 27. Mai 2013, 15:22
Gürks, OLE-Geschlumpfe. Okay, da habe ich etwas zu oberflächlich gelesen. Was aber von meiner Aussage oben bleibt ist, dass sie zutrifft, wenn man ohne "magische" Resourcen hantiert.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Größe bei dyn. Arrays automatisch?

  Alt 27. Mai 2013, 15:28
Gürks, OLE-Geschlumpfe. Okay, da habe ich etwas zu oberflächlich gelesen. Was aber von meiner Aussage oben bleibt ist, dass sie zutrifft, wenn man ohne "magische" Resourcen hantiert.
Ein Variant ist magisch?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Größe bei dyn. Arrays automatisch?

  Alt 27. Mai 2013, 15:34
Gürks, OLE-Geschlumpfe. Okay, da habe ich etwas zu oberflächlich gelesen. Was aber von meiner Aussage oben bleibt ist, dass sie zutrifft, wenn man ohne "magische" Resourcen hantiert.
Das hat gar nichts mit OLE zu tun, sondern damit wie Delphi mit Variants umgeht. Der folgende Code ist also durchaus korrekt und ungefährlich:

Delphi-Quellcode:
var
  A: array of Integer;
  V: Variant;
  I: Integer;
begin
  V := VarArrayCreate([0,9], varInteger);
  for I := 0 to 9 do
    V[I] := I;
  A := V;
  for I := 0 to 9 do
    Assert(V[I] = I);

  VarClear(V);
  V := A;
  for I := 0 to 9 do
    Assert(V[I] = I);

end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Größe bei dyn. Arrays automatisch?

  Alt 27. Mai 2013, 16:19
Aus pascalscher Sicht sind Variants durchaus "magisch", da mit vergleichsweise viel Compiler Magic ausgestattet, und (u.a.) die Typstrenge aufweichend. Und gerade variante Arrays (für die es ohne OLE imho anfangs wenig Bedarf in Delphi gegeben hätte) bringen einfach viele Automatismen mit, die die dynamischen Arrays, über die man sich normalerweise in Delphi unterhält, einfach nicht haben. Ich hoffe man versteht mich jetzt richtiger.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
jensen82

Registriert seit: 4. Mai 2013
4 Beiträge
 
#5

AW: Größe bei dyn. Arrays automatisch?

  Alt 27. Mai 2013, 18:10
Hey!

Also ist das in Ordnung... ? Aber warum in aller Welt muss ich die Länge des Arrays nicht angeben?
Wäre es generisch, z.B. List oder vector aus C++ wäre ja mit .Add(meinVar) alles fein. Kann mir das jemand erklären?

Hier nochmal ein wenig Code:

Delphi-Quellcode:
function GetAllDisks(sHostName: String; sUserName: String;
  sPassword: String): TDiskInfoList;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator: OLEVariant;
  FWMIService: OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject: OLEVariant;
  oEnum: IEnumvariant;
  iValue: LongWord;
  disk: TDiskInfo;
  diskList: TDiskInfoList;
begin
  try
    CoInitialize(nil);
    try
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService := FSWbemLocator.ConnectServer(sHostName, 'root\CIMV2',
        sUserName, sPassword);
      FWbemObjectSet := FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive',
        'WQL', wbemFlagForwardOnly);
      oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumvariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        //if not VarIsNull(FWbemObject.Availability) then
          disk.Availability := FWbemObject.Availability;

        if not VarIsNull(FWbemObject.BytesPerSector) then
          disk.BytesPerSector := FWbemObject.BytesPerSector;

        if not VarIsNull(FWbemObject.Capabilities) then
          disk.Capabilities := FWbemObject.Capabilities;
Letztendlich gibt die Funktion eine List zurück.

Ich danke euch vielmals.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Größe bei dyn. Arrays automatisch?

  Alt 27. Mai 2013, 19:02
Aber warum in aller Welt muss ich die Länge des Arrays nicht angeben?
Weil die Länge im Variant bereits enthalten ist. Es gibt eine Funktion DynArrayFromVariant, die aus einem Variant ein dynamisches Array macht. Der Delphi-Compiler ist so clever, diese Funktion bei der Zuweisung aufzurufen.


Wäre es generisch, z.B. List oder vector aus C++ wäre ja mit .Add(meinVar) alles fein. Kann mir das jemand erklären?
Dazu müsste ich erst verstehen, was du hier meinst.


Hier nochmal ein wenig Code:
Die Deklaration von TDiskInfo und TDiskInfoList wäre sicher hilfeich. Abgesehen davon ist die Methode irgendwie unvollständig.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
jensen82

Registriert seit: 4. Mai 2013
4 Beiträge
 
#7

AW: Größe bei dyn. Arrays automatisch?

  Alt 29. Mai 2013, 08:12
Zitat:
Weil die Länge im Variant bereits enthalten ist. Es gibt eine Funktion DynArrayFromVariant, die aus einem Variant ein dynamisches Array macht. Der Delphi-Compiler ist so clever, diese Funktion bei der Zuweisung aufzurufen.
Das ist mal eine aussagekräftige Antwort die vollkommen ausreicht. Fakten!

Ich danke euch für die tolle Unterstützung.

Danke!!!
  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 17:26 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