Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

OT4XB Structure als Array

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 780
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

OT4XB Structure als Array

Beitrag von 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
AUGE_OHR
Marvin
Marvin
Beiträge: 10657
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: OT4XB Structure als Array

Beitrag von 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
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 780
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Re: OT4XB Structure als Array

Beitrag von 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
AUGE_OHR
Marvin
Marvin
Beiträge: 10657
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: OT4XB Structure als Array

Beitrag von 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
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 780
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Re: OT4XB Structure als Array

Beitrag von 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
AUGE_OHR
Marvin
Marvin
Beiträge: 10657
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: OT4XB Structure als Array

Beitrag von 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
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 780
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Re: OT4XB Structure als Array

Beitrag von 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

Antworten