OT4XB Structure als Array

Moderator: Moderatoren

OT4XB Structure als Array

Beitragvon satmax » Do, 04. Dez 2014 9:39

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);
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 776
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: OT4XB Structure als Array

Beitragvon AUGE_OHR » Do, 04. Dez 2014 19:51

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
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10206
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: OT4XB Structure als Array

Beitragvon satmax » Fr, 05. Dez 2014 12:10

Danke Jimmy, irgendwie komme ich nicht ganz klar (einzeln geht, Array nicht). Werde zum Wochenende versuchen das in der Newsgroup zu posten.
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 776
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: OT4XB Structure als Array

Beitragvon AUGE_OHR » Mo, 08. Dez 2014 0:16

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 ;)
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10206
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: OT4XB Structure als Array

Beitragvon satmax » Mo, 08. Dez 2014 14:12

.. "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...
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 776
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: OT4XB Structure als Array

Beitragvon AUGE_OHR » Mo, 08. Dez 2014 18:11

satmax hat geschrieben:Ja, hast recht, beginnt bei 0.
;) ... bei API Function starte der Index meisten bei 0 ( Zero-based )
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10206
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: OT4XB Structure als Array

Beitragvon satmax » Mo, 08. Dez 2014 18:20

bei API Function starte der Index meisten bei 0 ( Zero-based )


ist eigentlich logisch. :wink: Ist bei allen Strukturen in C so.
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 776
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich


Zurück zu Andere 3rd-Party-Tools

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast