[beendet]DWord,Byte(unsignet)umwandeln in PBsinged-Variablen

Anfängerfragen zum Programmieren mit PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

[beendet]DWord,Byte(unsignet)umwandeln in PBsinged-Variablen

Beitrag von Toshy »

Hallo.

Code: Alles auswählen

;© 2005 by hardfalcon, many thx to dige and Laurin!
SPS.SYSTEM_POWER_STATUS
GetSystemPowerStatus_(SPS.SYSTEM_POWER_STATUS)
Debug SPS.SYSTEM_POWER_STATUS\ACLineStatus & 255 ;korrigiert
Debug SPS.SYSTEM_POWER_STATUS\BatteryFlag & 255 ;korrigiert
Debug SPS.SYSTEM_POWER_STATUS\BatteryLifePercent & 255 ;korrigiert
Debug SPS.SYSTEM_POWER_STATUS\Reserved1 & 255 ;korrigiert
Debug SPS.SYSTEM_POWER_STATUS\BatteryLifeTime
Debug SPS.SYSTEM_POWER_STATUS\BatteryFullLifeTime
Um es gleich klar zu stellen, mir geht es hier nicht direkt imdie System_Power_Status Struktur oder Funktion dazu, mich interessiert das "&255". Ich verstehe irgendwie nicht, warum das gemacht wird und wie das mit anderen Variablen Typen macht und noch viel wichtiger, WANN man es machen muß.
Also ich weiß, das die ersten vier Elemente Bytes sind (vermutlich unsigned) und das &255 dies halt umwandelt. Aber "&" ist doch ein bitweises AND und bei 255 sind doch ALLE Bits gesetzt, dann würde doch IMMER 255 rauskommen, also wie soll das funktionene.
Das Element "BatteryLifeTime" ist ein DWORD, weshalb muß man hier nichts umwandeln?
Bei API-Funktionen werden entweder Variablen(werte) übergeben variable.l oder manchmal deren Adresse/Pointer übergeben (zum hineinschreiben). Sehe ich es richtig, das man nichts machen (Umwandeln) muß, wenn man die Variable, also den Wert übergibt, sondern immer dann wenn man die Adresse übergibt (entweder wenn daraus ein wert ausgelesen wird oder wenn durch diese Adresse ein Wert an die Variable übergeben wird). Aber wie sieht das aus, wenn ich die Adresse einer Struktur übergeben, muß in den Werten die da drinn stehen, dann nicht auch alles geändert werden?
Das ist ja recht kompliziert und nervig, kein wunder das ich beim einarbeiten in die Powerfunktionen nichts hinbekomme.

ich bin momentan mal wieder recht verwirrt.

Als Problembeispiel nehme ich mal die API-Funktion
SetupDiGetDeviceInterfaceDetail()
BOOL SetupDiGetDeviceInterfaceDetail(
HDEVINFO DeviceInfoSet,
PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData,
DWORD DeviceInterfaceDetailDataSize,
PDWORD RequiredSize,
PSP_DEVINFO_DATA DeviceInfoData
);
Diese muß man nacheinander zwei Mal aufrufen, beim ersten mal erhält man die benötige Größe für den Buffer, diese wird in eine Variable geschrieben (über die Adresse),

Code: Alles auswählen

SetupDiGetDeviceInterfaceDetail(hdev,@ll_did(),0,0,@cbRequired,0)
mein zweiten mal wird dann nicht die Adresse, sonder die Variable, also der Wert übergeben

Code: Alles auswählen

SetupDiGetDeviceInterfaceDetail(hdev,@ll_did(),*pdidd,cbRequired,@cbRequired,0)
Muß ich hier nun was umwandeln oder nicht und wenn nicht, liegt das nur daran das es "zufällig" ein DWORD ist? was aber mache ich, wenn ich nicht einfach nur den durch den ersten Aufruf eingetragenen Wert übergeben will, sondern diesen Veränder (z.B. erhöhen).

Ein weiteres Beispiel

Code: Alles auswählen

          bi.BATTERY_INFORMATION ; BATTERY_INFORMATION bi = {0};
                bqi\InformationLevel = #BatteryInformation;
                 ReturnDeviceIoControl2 = DeviceIoControl_(hBattery, #IOCTL_BATTERY_QUERY_INFORMATION, @bqi, SizeOf(bqi), @bi, SizeOf(bi), @dwOut, #Null)
Wie sieht da hier aus? Ich übergebe die Adresse einer Struktur und dessen Größe. Ich habe das Element InformationsLevel normal zugewiesen, also handelt es sich um eine signed Variable. Die Konstante ist ein "positiver Wert". Muß ich da vorher was umwandeln oder nicht, hängt das dann auch vom jeweiligen Variablentyp der in der "Windowssturktur" ab(also z.B. Byte müßte man Umwandeln, DWORD nicht).

Gruß
Toshy
Zuletzt geändert von Toshy am 10.02.2007 16:15, insgesamt 1-mal geändert.
1. Win10
PB6.1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: DWord, Byte(unsignet) umwandeln in PBsinged-Variablen

Beitrag von NicTheQuick »

Toshy hat geschrieben:Hallo.
Hi.
Toshy hat geschrieben:
Um es gleich klar zu stellen, mir geht es hier nicht direkt imdie System_Power_Status Struktur oder Funktion dazu, mich interessiert das "&255". Ich verstehe irgendwie nicht, warum das gemacht wird und wie das mit anderen Variablen Typen macht und noch viel wichtiger, WANN man es machen muß.
Jetzt gehts erstmal ums können. Du kannst eine Variable nicht von signed in unsigned umwandelt, weil bei PB alle Variablen signed sind. Du kannst allerdings eine Variable einem "höheren" Variablentyp zuweisen und sie dabei unsigned machen.
Es geht praktisch von Byte(signed) in Word,Long,Quad(unsigned), von Word(signed) in Long,Quad(unsigned) und von Long(signed) in Quad(unsigned)
Toshy hat geschrieben: Also ich weiß, das die ersten vier Elemente Bytes sind (vermutlich unsigned)...
Da es PB ist, auf jeden Fall unsigned!
Toshy hat geschrieben: ...und das &255 dies halt umwandelt. Aber "&" ist doch ein bitweises AND und bei 255 sind doch ALLE Bits gesetzt, dann würde doch IMMER 255 rauskommen, also wie soll das funktionene.
Du verwechselst & mit | (bitweises Oder).
Toshy hat geschrieben: Das Element "BatteryLifeTime" ist ein DWORD, weshalb muß man hier nichts umwandeln?
Es muss in der API-Dokumentation erklärt sein, ob eine Variable signed oder unsigned ist.
Toshy hat geschrieben:
Bei API-Funktionen werden entweder Variablen(werte) übergeben variable.l oder manchmal deren Adresse/Pointer übergeben (zum hineinschreiben). Sehe ich es richtig, das man nichts machen (Umwandeln) muß, wenn man die Variable, also den Wert übergibt, sondern immer dann wenn man die Adresse übergibt (entweder wenn daraus ein wert ausgelesen wird oder wenn durch diese Adresse ein Wert an die Variable übergeben wird). Aber wie sieht das aus, wenn ich die Adresse einer Struktur übergeben, muß in den Werten die da drinn stehen, dann nicht auch alles geändert werden?
Nein, du musst nichts ändern. Die Variablen kannst du sowieso nicht signed machen, aber die API-Funktion benutzt sie dann so, wie sie sie braucht, also signed oder unsigned.
Toshy hat geschrieben: Das ist ja recht kompliziert und nervig, kein wunder das ich beim einarbeiten in die Powerfunktionen nichts hinbekomme.

ich bin momentan mal wieder recht verwirrt.
Ich hoffe ich habe dich da jetzt mal ein bisschen aufgeklärt.
Toshy hat geschrieben:
Als Problembeispiel nehme ich mal die API-Funktion
SetupDiGetDeviceInterfaceDetail()
BOOL SetupDiGetDeviceInterfaceDetail(
HDEVINFO DeviceInfoSet,
PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData,
DWORD DeviceInterfaceDetailDataSize,
PDWORD RequiredSize,
PSP_DEVINFO_DATA DeviceInfoData
);
Diese muß man nacheinander zwei Mal aufrufen, beim ersten mal erhält man die benötige Größe für den Buffer, diese wird in eine Variable geschrieben (über die Adresse),

Code: Alles auswählen

SetupDiGetDeviceInterfaceDetail(hdev,@ll_did(),0,0,@cbRequired,0)
mein zweiten mal wird dann nicht die Adresse, sonder die Variable, also der Wert übergeben

Code: Alles auswählen

SetupDiGetDeviceInterfaceDetail(hdev,@ll_did(),*pdidd,cbRequired,@cbRequired,0)
Muß ich hier nun was umwandeln oder nicht und wenn nicht, liegt das nur daran das es "zufällig" ein DWORD ist? was aber mache ich, wenn ich nicht einfach nur den durch den ersten Aufruf eingetragenen Wert übergeben will, sondern diesen Veränder (z.B. erhöhen).
Veränder ihn und es wird funktionieren.
Toshy hat geschrieben:
Ein weiteres Beispiel

Code: Alles auswählen

          bi.BATTERY_INFORMATION ; BATTERY_INFORMATION bi = {0};
                bqi\InformationLevel = #BatteryInformation;
                 ReturnDeviceIoControl2 = DeviceIoControl_(hBattery, #IOCTL_BATTERY_QUERY_INFORMATION, @bqi, SizeOf(bqi), @bi, SizeOf(bi), @dwOut, #Null)
Wie sieht da hier aus? Ich übergebe die Adresse einer Struktur und dessen Größe. Ich habe das Element InformationsLevel normal zugewiesen, also handelt es sich um eine signed Variable. Die Konstante ist ein "positiver Wert". Muß ich da vorher was umwandeln oder nicht, hängt das dann auch vom jeweiligen Variablentyp der in der "Windowssturktur" ab(also z.B. Byte müßte man Umwandeln, DWORD nicht).
Denk dran: Es gibt kein Flag, dass angibt, ob eine Variable signed oder unsigned ist. Unsigned und Signed haben beide die selbe Größe, und zwar 1, 2, 4 oder 8 Bytes, je nach Typ. Man kann also nicht bestimmen, ob eine Variable jetzt signed oder unsigned ist, man kann sie nur entweder als signed oder als unsigned behandeln. Ich hab mal noch ein kleines Beispiel dazu für dich:

Code: Alles auswählen

Byte1.b = 127
Byte2.b = 255

Debug "(1)"
Debug Byte1
Debug Byte2

Long1.l = Byte1 ;weist die Werte signed zu
Long2.l = Byte2

Debug "(2)"
Debug Long1
Debug Long2

Long1 = Byte1 & 255 ;weist die Werte unsigned zu
Long2 = Byte2 & 255

Debug "(3)"
Debug Long1
Debug Long2

Byte1 = Byte1 & 255 ;Byte bleibt immer noch signed
Byte2 = Byte2 & 255

Debug "(4)"
Debug Byte1
Debug Byte2

Debug  "(5)"
Debug StrU(Byte1, #Byte) ;Byte kann mit StrU() unsigned in String umgewandelt werden
Debug StrU(Byte2, #Byte)
Toshy hat geschrieben:Gruß
Toshy
Gruß zurück.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Wie man es nutzen muß weiß ich nun teilweise, auch wenn ich noch nicht alles verstanden habe bzw. für mich noch nicht alles hunterprozentig geklärt ist. Aber erstmal reicht es. Wiedermals Danke.
Gruß
Toshy
1. Win10
PB6.1
Antworten