Strukturgrößenvergleich C vs. PB

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Strukturgrößenvergleich C vs. PB

Beitrag von HeX0R »

Ich habe da ein Problem mit meiner IRDA include finde aber keinen Fehler.
Also dachte ich, ich vergleiche mal die Strukturgrößen zwischen einem C-Compiler und PB.

Folgendes steht in der af_irda.h:

Code: Alles auswählen

typedef struct _SOCKADDR_IRDA {
  u_short irdaAddressFamily;
  u_char irdaDeviceID[4];
  char irdaServiceName[25];
} SOCKADDR_IRDA,*PSOCKADDR_IRDA,*LPSOCKADDR_IRDA;

typedef struct _WINDOWS_IRDA_DEVICE_INFO {
  u_char irdaDeviceID[4];
  char irdaDeviceName[22];
  u_char irdaDeviceHints1;
  u_char irdaDeviceHints2;
  u_char irdaCharSet;
} WINDOWS_IRDA_DEVICE_INFO,*PWINDOWS_IRDA_DEVICE_INFO,*LPWINDOWS_IRDA_DEVICE_INFO;

typedef struct _WINDOWS_DEVICELIST {
  ULONG numDevice;
  WINDOWS_IRDA_DEVICE_INFO Device[1];
} WINDOWS_DEVICELIST,*PWINDOWS_DEVICELIST,*LPWINDOWS_DEVICELIST;
Ich habe das wie folgt in PB übersetzt:

Code: Alles auswählen

Structure SOCKADDR_IRDA
	irdaAddressFamily.w
	irdaDeviceID.l
	irdaServiceName.b[25]
EndStructure

Structure IRDA_DEVICE_INFO
	irdaDeviceID.l
	irdaDeviceName.b[22]
	irdaDeviceHints1.b
	irdaDeviceHints2.b
	irdaCharSet.b
EndStructure

Structure DEVICELIST
	numDevice.l
	Device.IRDA_DEVICE_INFO[0] ;<- o.k. ist klar, dass die Größe hier nicht stimmt, aber ich brauche ein unbestimmt großes Array
EndStructure
Dann habe ich mir die SizeOf() ausgeben lassen und merkwürdigerweise macht der C-Compiler da komische Dinge:
SOCKADDR_IRDA ;<-C: 32, PB: 31!!
IRDA_DEVICE_INFO ;<-C: 29, PB: 29, o.k.
DEVICELIST ;<-C: 36, PB: 4!!, klar, hätte ich Device[1] deklariert wären es aber auch nur 4 + 29 Bytes und keine 36!

Wenn der C-Compiler irgendwie die Bytes alignen (gibt bestimmt ein deutsches Wort dafür, sorry fällt mir gerade nicht ein) würde, würden bei IRDA_DEVICE_INFO aber niemals 29 Bytes rauskommen.
Kann mir jemand erklären, wie es zu diesen Größenunterschieden kommt?
Der Unterschied, der ins Auge sticht, ist, dass die beiden Strukturen, die sich unterscheiden in der af_irda.h mit Präfix _WINDOWS deklariert wurden, was genau bedeutet das denn?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Strukturgrößenvergleich C vs. PB

Beitrag von NicTheQuick »

Bin grade unterwegs, aber versuch mal AlignC hinter der Strukturdeklaration.
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Strukturgrößenvergleich C vs. PB

Beitrag von HeX0R »

NicTheQuick hat geschrieben:Bin grade unterwegs, aber versuch mal AlignC hinter der Strukturdeklaration.
Ich denke mal, Du meintest Align #PB_Structure_AlignC
Der Tipp war nicht schlecht, allerdings musste ich auch meine DeviceIDs auf 4 Bytes verteilen bis das gleich war, also so jetzt:

Code: Alles auswählen

Structure SOCKADDR_IRDA Align #PB_Structure_AlignC
	irdaAddressFamily.w
	irdaDeviceID.b[4]
	irdaServiceName.b[25]
EndStructure

Structure IRDA_DEVICE_INFO Align #PB_Structure_AlignC
	irdaDeviceID.b[4]
	irdaDeviceName.b[22]
	irdaDeviceHints1.b
	irdaDeviceHints2.b
	irdaCharSet.b
EndStructure

Structure DEVICELIST Align #PB_Structure_AlignC
	numDevice.l
	Device.IRDA_DEVICE_INFO[1]
EndStructure

Debug SizeOf(SOCKADDR_IRDA)
Debug SizeOf(IRDA_DEVICE_INFO)
Debug SizeOf(DEVICELIST)
Macht nur das Handling mit den IDs etwas aufwändiger, aber daran sollte es nicht scheitern.
Muss ich morgen mal ausprobieren, ob das für das merkwürdige Verhalten verantwortlich war.

Danke!
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Strukturgrößenvergleich C vs. PB

Beitrag von HeX0R »

Nur, um das hier abzuschliessen:
Ich habe den Fehler mittlerweile gefunden, es lag nicht an den Strukturen!

Hat man ein IrDA Device mit dem man sich verbinden möchte, muss man den irdaServiceName kennen, den das Device bei seinem bind() vergeben hat.
Gar nicht so einfach, wenn man das Gerät eigentlich gar nicht kennt, ich hatte mir den Source-Code einer funktionierenden DLL besorgt, um letztendlich dahinter zu kommen.
Wählt man einen falschen, so kann es passieren, dass ein connect() schief läuft, oder aber beim ersten send() die Verbindung abreisst.

Nicht, dass irgendjemand hier an IrDA interessiert wäre, aber es findet sich tatsächlich nirgends diese Info im Netz, daher wollte ich das einfach mal für die Nachwelt festhalten.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Strukturgrößenvergleich C vs. PB

Beitrag von uweb »

Hallo HeX0R,
danke!
Ich bin schon mal einer den das Thema interessiert.
Ich habe ein Note4 mit IR. Schon allein von daher hätte ich Ideen.
Das Note nutze ich u.a. als Universalfernbdienung. Das in Windows umzusetzen wäre auch spannend.
Allerdings gibt es nicht für alle meine Geräte Templates. Das Einlesen der Codes wäre als auch ein Thema.
Ich vermute mal ich bin der einzige den das Thema interessiert.
Allerdings gibt es eben wenig und die Hürde ist hoch.
Antworten