Seite 1 von 1

OT4XB Structure als Array

Verfasst: Do, 04. Dez 2014 9:39
von satmax
Ich sollte eine Structur als 3 Dimensionales Array übergeben.

Prinzipiell funktioniert dieser Code, aber ich bekomme eben nur das erste Element brauche aber das 3. und dazu muss ich die Struktur als drei-dimensionale Array übergeben:

Code: Alles auswählen

BEGIN STRUCTURE CMENTRYDATA 
  MEMBER ULONG mflCtrl
  MEMBER ULONG mflDependency
  MEMBER ULONG mulReserve
  MEMBER U_INT16 mcbData
  MEMBER BYTE test
  MEMBER BYTE test1
  MEMBER SZSTR mabData SIZE CM_MAX_STRING_LEN *2
END STRUCTURE

...

FUNCTION CodeMeterReadData(nProductCode)
LOCAL cmEntryData:=CMENTRYDATA():new()    // Hier sollte ein 3 Dimensionales Array angelegt werden
LOCAL nEntryDataNum := 3

nHandleCm:=@WibuCM32:CmAccess(CM_ACCESS_LOCAL_LAN, @cmAcc)
res = @WibuCM32:CmGetInfo(nHandleCm, CM_GEI_ENTRYDATA, @cmEntryData, cmEntryData:_sizeof_()* nEntryDataNum)     // Hier sollte das 3 Dimensionales Array verwendet werden
...

In C sieht das das so:

Code: Alles auswählen

const int num = 3;
CMENTRYDATA cmEntryData[3];
int res;
memset(&cmEntryData, 0, sizeof(CMENTRYDATA) * num);
res = CmGetInfo(hcmse, CM_GEI_ENTRYDATA, &cmEntryData, sizeof(CMENTRYDATA) * num);

Re: OT4XB Structure als Array

Verfasst: Do, 04. Dez 2014 19:51
von AUGE_OHR
hi,

Fragen zu ot4xb solltest du direkt bei Pablo in seiner Newsgroup stellen. (http://www.xbwin.com -> Newsgroup)
Pablo Botella <pb_AT_xbwin_com@no_spam.no_spam>
4. Juli 2009
ot4xb.public
Re: Howto pass an pointer to an array of structure objects

/* original strukturdefinition in c++
typedef struct __CMENTRYDATA {
CMULONG mflCtrl;
CMULONG mflDependency;
CMULONG mulReserve;
CMUINT mcbData;
CMBYTE mabData[2 * CM_MAX_STRING_LEN];
} CMENTRYDATA;
*/

Code: Alles auswählen

* my Xbasedefinition
BEGIN STRUCTURE _CMENTRYDATA
  MEMBER ULONG mflCtrl
  MEMBER ULONG mflDependency
  MEMBER ULONG mulReserve
  MEMBER U_INT32 mcbData
  MEMBER BINSTR mabData SIZE 512
END STRUCTURE

Code: Alles auswählen

/* original function deklaration in C++
   int CMAPIENTRY CmGetInfo(HCMSysEntry hcmse, CMULONG flCtrl, void *pvDest
, CMUINT cbDest)
*/
DLL "WibuCm32.DLL" IMPORT CmGetInfo AS INT ;
                                    PARAM hcmse   AS POINTER32 , ;  // or maybe you can treat it as a opaque HANDLE if not a struct or a string
                                    PARAM flCtrl  AS ULONG     , ;
                                    PARAM pvDest  AS POINTER32 , ;
                                    PARAM cbDest  AS UINT
If you have only 1 item you can pass directly the object

Code: Alles auswählen

local oStruct := _CMENTRYDATA():New()

CmGetInfo( hcmse , flCtrl , oStruct , oStruct:_sizeof_() )
if you need to pass 2 or more items

Code: Alles auswählen

local oStruct := _CMENTRYDATA():New()
local nItems := number of struct items
local pBuffer  := _xgrab( nItems * oStruct:_sizeof_() )  // alloc memory to hold the array
local n

CmGetInfo( hcmse , flCtrl , pBuffer , nItems * oStruct:_sizeof_() )

for n := 1 to nItems
   oStruct:_link_( pBuffer + ( n * oStruct:_sizeof_() ) , .F.)
   ? oStruct:hcmse   // access or change the members
next

_xfree( pBuffer ) // and finally release the buffer when not needed
Regards,
Pablo

Re: OT4XB Structure als Array

Verfasst: Fr, 05. Dez 2014 12:10
von satmax
Danke Jimmy, irgendwie komme ich nicht ganz klar (einzeln geht, Array nicht). Werde zum Wochenende versuchen das in der Newsgroup zu posten.

Re: OT4XB Structure als Array

Verfasst: Mo, 08. Dez 2014 0:16
von AUGE_OHR
satmax hat geschrieben:Danke Jimmy, irgendwie komme ich nicht ganz klar (einzeln geht, Array nicht).
sorry, getestet hab ich den Code von Pablo nicht.
... "könnte" es sein das der Index mit 0 ( statt 1) anfängt ?
satmax hat geschrieben:Werde zum Wochenende versuchen das in der Newsgroup zu posten.
habs gesehen ;)

Re: OT4XB Structure als Array

Verfasst: Mo, 08. Dez 2014 14:12
von satmax
.. "könnte" es sein das der Index mit 0 ( statt 1) anfängt ?
Ja, hast recht, beginnt bei 0. Jetzt bin ich wieder einen kleinen Schritt weiter...

Re: OT4XB Structure als Array

Verfasst: Mo, 08. Dez 2014 18:11
von AUGE_OHR
satmax hat geschrieben:Ja, hast recht, beginnt bei 0.
;) ... bei API Function starte der Index meisten bei 0 ( Zero-based )

Re: OT4XB Structure als Array

Verfasst: Mo, 08. Dez 2014 18:20
von satmax
bei API Function starte der Index meisten bei 0 ( Zero-based )
ist eigentlich logisch. :wink: Ist bei allen Strukturen in C so.