Bit Variable

Für allgemeine Fragen zur Programmierung mit PureBasic.
Chris_Bayern
Beiträge: 5
Registriert: 16.10.2005 16:09
Wohnort: Bayern

Bit Variable

Beitrag von Chris_Bayern »

Hallo Forum,

ich habe eine DLL zu schreiben, welche die zu verarbeitenden Daten als Zeiger auf eine Struktur übergeben bekommt.
Die Struktur sieht in abgespeckter Form etwa so aus:

Long Wert1
bool Wert2
Long Wert3
usw...

Leider kann ich die Struktur nicht direkt mit PB verarbeiten, da so weit mir bekannt ist, PB keine BOOL, als 1-Bit-Variablen kennt.

Habt Ihr eine Lösung für mein Problem?

Vielen Dank schon mal.

Gruß
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Es gibt keine 1-Bit Variablen!
Bool ist entweder Byte oder Long (je nach Sprache)
Variablentypen kleiner Long machen nur in Strukturen Sinn, da ansonsten
sowieso kein Speicher gespart wird, z.B. Procedure.b ist eigentlich blödsinn.
Eigentlich werden sie nur für API-Strukturen benötigt und zur
Kommunikation mit Schnittstellen wie z.B. RS232.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Bit Variable

Beitrag von Danilo »

Chris_Bayern hat geschrieben:Die Struktur sieht in abgespeckter Form etwa so aus:

Long Wert1
bool Wert2
Long Wert3
usw...
Welche Sprache denn?

Bei Gnu C++ ist das bool z.B. 1 Byte groß, wird aber in einer Struktur
oft auf 32bit o.ä. aufgefüllt, um die nachstenden Daten wieder an einer
entsprechenden Speichergrenze auszurichten (alignment).

Beispiel:

Code: Alles auswählen

#include <iostream>

struct xyz {
    int x;
    bool Wert2;
    int y;
};

int main (int argc, char *argv[]) {
    std::cout << sizeof(xyz) << std::endl;
    return(0);
}
Ergibt hier 12 Byte (je nach Platform unterschiedlich). Mache ich die 2 Integer
raus, ergibt es 1.

Bei WinAPI 'BOOL' dürfte es das Gleiche sein.

Aufpassen muß man dann halt wenn mehrere bool nacheinander
vorkommen:

Code: Alles auswählen

struct xyz {
    int  Wert1;
    bool Wert2;
    bool Wert3;
    bool Wert4;
    int  Wert5;
};
Ergibt immernoch 12.

Eine genaue Antwort gibt es also nicht, hängt alles von der kompletten
Struktur und der Platform (16/32/64bit) ab.
Wenn in einem Code direkt ein bool verwendet wird, dann kann das
ein Compiler intern auch auf 32/64bit optimieren, um den Zugriff evtl.
zu beschleunigen. Das kann jeder machen wie er will, wenns intern ist.
In Strukturen macht es halt Sinn das es alle gleich machen, um z.B. mit
WinAPI was auszutauschen.

Dein Beispiel könnte dann so in PB aussehen:

Code: Alles auswählen

Structure xyz
  Wert1.l
  Wert2.b
  __fill.b[3]
  Wert3.l
EndStructure
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Chris_Bayern
Beiträge: 5
Registriert: 16.10.2005 16:09
Wohnort: Bayern

Beitrag von Chris_Bayern »

Danke für den Schubs!
Evtl. hätte ich es einfach mal probieren sollen. Speicherplatz mit einem Bit gib es ja auch nicht.
Ich war etwas verwirrt, da es ja bei PB, anders als z.B. bei C kein BOOL gibt.

Herzlichen Dank noch mal

Gruß
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

ts-soft hat geschrieben:Es gibt keine 1-Bit Variablen!
In C/C++ gibt es aber ein Feature das man Bit-Feld nennt.

Code: Alles auswählen

struct xyz {
    unsigned Wert1: 1;  // 1 Bit
    unsigned Wert2: 2;  // 2 Bits
    unsigned Wert3: 1;  // 1 Bit
    unsigned Wert4: 12; // 12 Bits
};
Nur mal so zur Info, darum ging es aber hier gerade nicht... ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten