Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi array [0..0] ? (https://www.delphipraxis.net/98740-array-%5B0-0%5D.html)

nitschchedu 31. Aug 2007 15:28


array [0..0] ?
 
Also aus meiner WlanAPI habe ich aus der Übersetztung ein Array das so ist:

Delphi-Quellcode:
Network: array[0..0] of Tndu_WLAN_AVAILABLE_NETWORK;
Jetzt ist aber immer nur ein Feld drin :(

Ich habe mal Test weiße das so gemacht

Delphi-Quellcode:
Network: array[0..2] of Tndu_WLAN_AVAILABLE_NETWORK;
Und da waren nun 3 Feld ausgfühlt.

Wie bekomme ich das hin das das mit dem array[0..0] richtig klapt ?

mkinzler 31. Aug 2007 15:30

Re: array [0..0] ?
 
Was willst du den erreichen 0..0 heißt nunmal nur 1 Element

angos 31. Aug 2007 15:31

Re: array [0..0] ?
 
Hi,

was ist genau dein Problem? wenn du
Delphi-Quellcode:
myArray = array[0..0]
deklarierst, hast du nur ein feld, und zwar
Delphi-Quellcode:
myArray[0]
deklarierst du hingegen
Delphi-Quellcode:
myArray = array[0..2]
hast du drei felder
Delphi-Quellcode:
myArray[0] myArray[1] myArray[2]
Gruß

[edit=schöner machen /]

nitschchedu 31. Aug 2007 15:34

Re: array [0..0] ?
 
Also in C++ sa es so aus:

Code:
typedef struct _WLAN_INTERFACE_INFO_LIST {
    DWORD dwNumberOfItems;
    DWORD dwIndex;

#ifdef __midl
    [unique, size_is(dwNumberOfItems)] WLAN_INTERFACE_INFO InterfaceInfo[*];
#else
    WLAN_INTERFACE_INFO InterfaceInfo[1];
#endif
Man gab mir den hniweiß ich solle es so übersetzten:

Delphi-Quellcode:
Network: array[0..0] of Tndu_WLAN_AVAILABLE_NETWORK;
Ich war in der Annahme das da mehr als nur ein Feld kommt !?

angos 31. Aug 2007 15:39

Re: array [0..0] ?
 
jetzt glaube ich ein bisschen zu wissen, worauf du hinaus willst... kenne mich in c halt gar nicht aus ;)

mit mehr Felder meinst du dwNumberOfItems und dwIndex?

dann brauchst du aber eigentlich kein array, irgendwas ist da falsch glaub ich... :gruebel:

versuch doch mal
Delphi-Quellcode:
var
  Network: Tndu_WLAN_AVAILABLE_NETWORK;
begin
  tu was mit Network.dwNumberOfItems;
  tu was mit Network.dwIndex;
end;

mkinzler 31. Aug 2007 15:43

Re: array [0..0] ?
 
Es handelt sich um eine dynamische Struktur
Delphi-Quellcode:
type
    WLAN_INTERFACE_INFO_LIST = Record
        dwNumberOfItems: Cardinal;
        dwIndex: Array of Cardinal
    end;
...
Network: WLAN_INTERFACE_INFO_LIST;
 
setLength( network.dwindex, network.dwNumberOfItems);

nitschchedu 31. Aug 2007 15:49

Re: array [0..0] ?
 
Und wie würde das hier aussehen ?


Delphi-Quellcode:

// Deklaration
Pndu_WLAN_PROFILE_INFO_LIST = ^Tndu_WLAN_PROFILE_INFO_LIST;
  PPndu_WLAN_PROFILE_INFO_LIST = ^Pndu_WLAN_PROFILE_INFO_LIST;
  Tndu_WLAN_PROFILE_INFO_LIST = record
     dwNumberOfItems: DWORD;
    dwIndex: DWORD;
    ProfileInfo: array[0..0] of Tndu_WLAN_PROFILE_INFO;
  end;

function WlanGetAvailableNetworkList(hClientHandle: Handle;
     const pInterfaceGuid: PGUID; dwFlags: DWORD; pReserved: PVOID;
    var pAvailableNetworkList: Pndu_WLAN_AVAILABLE_NETWORK_LIST): DWORD; stdcall;


...

// Aufruf
var
  netzworklist: Pndu_WLAN_AVAILABLE_NETWORK_LIST;
....
begin
   back := WlanGetAvailableNetworkList(hClient,
     @pInterface.InterfaceInfo[0].InterfaceGuid,
    NDU_WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES,
    nil, netzworklist);
end;

sirius 31. Aug 2007 15:51

Re: array [0..0] ?
 
Diese Deklaration kann so richtig sein. Es ist der prinzipielle Hinweis, dass es sich um ein statisches Array handelt, von dem man allerdings die Länge nicht kennt. Meistens steht die Länge an einer anderen Stelle (wie man an deinem C-Code auch sieht).

du kannst jetzt auf verschiedene Art an den Feldinhalt kommen:
1. Du definierst dir ein statisches Array, was groß genug ist, und benutzt eben nur die ersten NumberOfItems Elemente.
2. Du nimmst einen Pointer von WLAN_INTERFACE_INFO und gehst damit durch die Liste.


2. ist meistens schöner und könnte so aussehen:
Delphi-Quellcode:
type PINTERFACE_INFO=^INTERFACE_INFO
     INTERFACE_INF0=packed record
      //...was auch immer
end;
type WLAN_INTERFACE_INFO_LIST=packed record
      dwNumberOfItems:DWORD;
      dwIndex:DWORD;
      WLAN_INTERFACE_INFO:array[0..0] of INTERFACE_INFO;
end;

//...

var i:integer;
    PInfo:PInterface_Info;
begin
  PInfo:=@InfoList.WLAN_Interface_Info;
  for i:=1 to InfoList.numberofitems do
  begin
    PInfo^.xyz
    //zugriff auf das Feld
     
    inc(PInfo); //aufs nächste Feld schieben
  end;
end;
Je nach Gegebenheit gibt es auch noch andere Lösungen...

nitschchedu 31. Aug 2007 16:03

Re: array [0..0] ?
 
Diese Zuweißung geht nicht wirklich
Delphi-Quellcode:
PInfo:=@InfoList.WLAN_Interface_Info;
Mein Code:
Delphi-Quellcode:
 Pndu_WLAN_AVAILABLE_NETWORK_LIST = ^Tndu_WLAN_AVAILABLE_NETWORK_LIST;
  PPndu_WLAN_AVAILABLE_NETWORK_LIST = ^Pndu_WLAN_AVAILABLE_NETWORK_LIST;
  Tndu_WLAN_AVAILABLE_NETWORK_LIST = record
     dwNumberOfItems: DWORD;
    dwIndex: DWORD;
    Network: array[0..0] of Tndu_WLAN_AVAILABLE_NETWORK;
  end;



var
 netzworklist: Pndu_WLAN_AVAILABLE_NETWORK_LIST;
 Netzwork: Tndu_WLAN_AVAILABLE_NETWORK;
begin
....
  netzworklist := WlanAllocateMemory(SizeOf(Tndu_WLAN_AVAILABLE_NETWORK_LIST));

  back := WlanGetAvailableNetworkList(hClient,
     @pInterface.InterfaceInfo[0].InterfaceGuid,
    //NDU_WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES,
    0,
    nil, netzworklist);


  Netzwork := @netzworklist^.Network; <---

  for i := 0 to netzworklist^.dwNumberOfItems - 1 do
  begin
     Memo1.Lines.Add(Netzwork.strProfileName);
    inc(Netzwork);
  end;
Fehler beim "<---" = Inkompatiple Typen

sirius 31. Aug 2007 16:08

Re: array [0..0] ?
 
:oops: da fehlt anscheinend noch ein [0] dahinter und evtl noch ein pointer(...) drumrum


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 Uhr.
Seite 1 von 3  1 23   

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