Seite 1 von 1

Bit Variable

Verfasst: 17.07.2008 08:25
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ß

Verfasst: 17.07.2008 08:51
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

Re: Bit Variable

Verfasst: 17.07.2008 09:08
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

Verfasst: 17.07.2008 09:12
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ß

Verfasst: 17.07.2008 09:19
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... ;)