Sizeof() oder len() für structure?

Alle Themen rund um die Erstellung von Programmen
Antworten
satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Sizeof() oder len() für structure?

Beitrag von satmax »

Als erste Übung bin ich gerade dabei meinen codemeter (Dongle) Zugriff mit Windev umzusetzen. Im Prinzip funktioniert das auslesen des Dongles bereits.

Ich habe mir dazu mehrer Structures anlegen müssen:


Beispiel:

Code: Alles auswählen

STCMENTRYDATA is Structure
	mflCtrl is unsigned int  // ULONG
	mflDependency is unsigned int  // ULONG
	cMulReserve is int  // ULONG
	nMcbDataEXPRESS is 4-byte unsigned int 
	sMabData is ANSI string of 2*256-1   // gnCM_MAX_STRING_LEN  
END


PROCEDURE CodeMeterReadDataArray(nProductCode)
stCmAcc is STMY_ACCESS
stCmEntryInfo is STCMBOXENTRY2
nAnzahlLizenzen is int = 0
nItems  is int = 10
arrPBuffer is array of STCMENTRYDATA 
nHandleCm is int
nRet is int =0

stCmAcc:nMflCtrl        = CM_ACCESS_NOUSERLIMIT
stCmAcc:nmulProductCode = nProductCode  // Productcode
stCmAcc:nMulFirmCode    = 104711          // FirmCode 

FOR i = 1 TO nItems  // Puffer vorbelegen
	ArrayAdd(arrPBuffer)
END


nRet = API("WibuCM32.dll", "CmGetInfo", nHandleCm, CM_GEI_ENTRYDATA, &arrPBuffer, 527*nItems)   // WibuCM32.dll  sizeof(arrPBuffer)

FOR i = 1 TO nItems  // debug print license info to screen
	Info(arrPBuffer[i].sMabData)
END
	
2 Sachen:
1) wie kann ich die Größe einer structure ermittlen (lenght() funktioniert nicht), also etwas wie sizeof() in C

2) wie kann ich die 265 mit einer Konstante (gnCM_MAX_STRING_LEN ) ersetzen:
sMabData is ANSI string of 2*256-1 // gnCM_MAX_STRING_LEN

also:
gnCM_MAX_STRING_LEN is int=256
sMabData is ANSI string of 2*gnCM_MAX_STRING_LEN -1 // funkt aber nicht.


unter Xbase++ war das einfach ein #define

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Sizeof() oder len() für structure?

Beitrag von Herbert »

Du hast ja die Struktur in eine Arrayvariable geholt.
Da sollte ArrayCount() genügen
http://doc.windev.com/en-US/?3075006&na ... the_arrays

Abarbeiten kannst du das Array auch direkt mit

Code: Alles auswählen

FOR EACH PBuffer of arrPBuffer
...
END
http://doc.windev.com/en-US/?1510019&na ... tive_array

Wieso willst du in der Definition einer Struktur eine Stringlänge festlegen? Das ist meiner Meinung nach nicht möglich, da hier nur der Container festgelegt wird.

Code: Alles auswählen

sMabData is ANSI string
genügt dann
Erst bei Initialisierung kann der zu verwendenden Variablen (Array) zugewiesen werden:

Code: Alles auswählen

FOR i = 1 TO nItems  // Puffer vorbelegen
   ArrayAdd(arrPBuffer)
   arrPBuffer.sMabData=SPACE(gnCM_MAX_STRING_LEN)
END
sollte dann klappen

satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Re: Sizeof() oder len() für structure?

Beitrag von satmax »

Da sollte ArrayCount() genügen
Da erhalte ich aber nur die Anzahl der Elemente, ich brauche aber für die Windows API die exakte Größe der Struktur/eines Elementes.
Aber mit den Arrays muss ich mich noch etwas auseinandersetzen.
Wieso willst du in der Definition einer Struktur eine Stringlänge festlegen?
Weil die API-Funktionen dies so benötigen, würde ich hier eine Struktur mit einer falschen Länge übergeben würde der API Aufruf nicht funktionieren.

Nach meinen Test ändert das Befüllen des Strings mit (Leer)Zeichen gar nichts, egal ob ich da 1 oder 100000 Zeichen reinmache, es funktioniert immer:
arrPBuffer.sMabData=RepeatString("x",gnCM_MAX_STRING_LEN+100000)

IMHO wird bei einem API Aufruf also immer die Länge der Struktur laut Struktur Definition verwendet.

Folgender Code funktioniert auch einwandfrei, ändere ich aber irgendeinen Datentyp (Länge, Anzahl der Bytes) geht nichts mehr:

Code: Alles auswählen

ipAddr is Structure // 4 Byte
	nB0 is byte
	nB1 is byte
	nB2 is byte
	nB3 is byte
END 

STMY_ACCESS is Structure
	nMflCtrl 				is unsigned int
	nMulFirmCode  			is unsigned int
	nmulProductCode  		is unsigned int
	nmulFeatureCode  		is unsigned int
	nmulUsedRuntimeVersion  is unsigned int
	midProcess  			is unsigned int
	musProductItemReference is 2-byte unsigned int
	musSession  			is 2-byte unsigned int
	stMabIPv4Address  		is ipAddr
	MY_CMBOXINFO	 		is int
END

...
stCmAcc is STMY_ACCESS
...
stCmAcc:nMflCtrl        = CM_ACCESS_STATIONSHARE
stCmAcc:nmulProductCode = nProductCode  // Productcode
stCmAcc:nMulFirmCode    = 104711          // FirmCode 
...
nHandleCm = API("WibuCM32.dll", "CmAccess", CM_ACCESS_LOCAL_LAN, &stCmAcc)   // Lockt einen Benutzer am Dongle
...
Also ergibt sich die Größe der Struktur sehr wohl aus der Definition.
Übrigens, "stCmAcc " ist kein Arry, ich bräuchte aber auch hier die Größe (Länge) der Variable (Struktur)

satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

[GELÖST]Re: Sizeof() oder len() für structure?

Beitrag von satmax »

Das Leben kann so einfach sein, eben kam die Antwort von PC Soft:

The size of a structure is returned by the Dimension() command.

http://doc.windev.com/en-US/?3013022&na ... n_function

Also in meinem Fall:

Dimension(arrPBuffer[1])

oder gleich an der richtigen Codestelle:
API("WibuCM32.dll", "CmGetInfo", nHandleCm, CM_GEI_ENTRYDATA, &arrPBuffer, Dimension(arrPBuffer[1])*nItems)

und die Sache ist gelöst. Sollte jemand für Windev den Zugriff auf den Codemeter Stick benötigen einfach hier melden.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Sizeof() oder len() für structure?

Beitrag von Herbert »

Ah super, danke.

Antworten