Variablentyp selber definieren

Schnelle objektorientierte, kompilierende Programmiersprache.
Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Variablentyp selber definieren

Beitrag von Empire » So Jun 06, 2010 9:31 am

Ist das bei diesen uin32_t auch so?

mfg
Empire

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Variablentyp selber definieren

Beitrag von Dirty Oerti » So Jun 06, 2010 10:38 am

Ja, das gilt für alle Integer-Datentypen.
In welcher Reihenfolge (von "vorne" oder von "hinten") die Zahlen aus den einzelnen Bytes zusammengesetzt sind hängt wie gesagt vom System ab.
Damit meine ich nicht das Betriebssystem, sondern das System in der Hardwaretechnischen Bedeutung.
Es hängt also davon ab, welchen Typ CPU du z.B. verwendest.

"PC"-Systeme verwenden in der Regel Little Endian, andere Architekturen wie z.B. PowerPC, MIPS, SPARC und soweit ich weiß auch viele Kleingeräte (wie Handys) verwenden hingegen Big Endian.

Die Network-Byte-Oder ist Big Endian.
Auf deinem "normalen" PC musst du also die Byte-Order konvertieren.
Und zwar auch bei int32_t ähnlichen Datentypen.
Denn diese Schreiben nur vor:
- ob der Datentyp ein Vorzeichen hat oder nicht
- dass der Datentyp eine ganze Zahl enthält
- dass der Datentyp aus 4 Bytes besteht
Damit ist aber eben nicht die Reihenfolge, in der diese 4 Bytes gelesen werden festgelegt.

Theoretisch könntest du dir solche Byte-Order-Konvertierungsfunktionen auch selbst schreiben.
Eine gute Übung wäre es ;)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Variablentyp selber definieren

Beitrag von Empire » Mo Jun 07, 2010 12:09 pm

Ich glaube mich zu erinnern irgend wo gelesen zu haben das es möglich ist variablen Bit weise zu schreiben, stimmt das?
Oder waren das Text Document?

mfg
Empire

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Variablentyp selber definieren

Beitrag von Dirty Oerti » Mo Jun 07, 2010 12:48 pm

Wie meinst du das, "Variablen bitweise schreiben" ?
Allgemein kannst du bei einem Computer immer nur auf ein Byte zugreifen, nicht auf eine kleinere Einheit.
Das Byte ist deshalb auch als die kleinste, adressierbare Informationseinheit festgelegt.
Du kannst natürlich von diesem einen Byte dann nur ein Bit betrachten und bearbeiten ;)

Ansonsten müsstest du genauer erklären, was du meinst.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Variablentyp selber definieren

Beitrag von Xin » Mo Jun 07, 2010 1:26 pm

Empire hat geschrieben:Ich glaube mich zu erinnern irgend wo gelesen zu haben das es möglich ist variablen Bit weise zu schreiben, stimmt das?
Oder waren das Text Document?
Du kannst ein Integer zu einer Bit-Struktur machen und dann auf die einzelnen Bits zugreifen:

Code: Alles auswählen

struct BitMuster
{
  unsigned int ZweiBitBreit : 2;
  unsigned int VierBitBreit : 4;
  unsigned int Bool1 : 1;
  unsigned int Bool2 : 1;
};
Das löst aber Dein Problem nicht wirklich... Du musst Byteweise von LittleEndianInt zu BigEndianInt gehen.
Wie beschrieben musst Du ein BigEndian 4321 in ein LittleEndian 1234 transformieren. Du nimmst also die linken 8 Bit und vertauschst sie mit den Rechten usw.

Code: Alles auswählen

unsigned int bigEndian = 0x04030201;
unsigned int littleEndian = ((unsigned char*)&bigEndian)[3] | ((unsigned char*)&bigEndian)[2] <<8 | ((unsigned char*)&bigEndian)[1] <<16 |((unsigned char*)&bigEndian)[0] << 24;
Sieht kompliziert ist aus, ist aber nur die Vertauschung von Bytes, die aus dem Int herausgepuhlt werden und dann einzeln wieder zusammengesetzt werden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Variablentyp selber definieren

Beitrag von Empire » Mo Jun 07, 2010 1:49 pm

Ich weis das war noch ein anderer Geistesblitz(den ich inzwischen nicht mal mehr nachvollziehen kann)

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Variablentyp selber definieren

Beitrag von Empire » Mo Jun 07, 2010 3:06 pm

Da fällt mir auf:
Es ist sehr praktisch zu wissen wie ich die umwandel aber woher weis ich wie rum das System die Variable braucht??
Muss ich das den User testen lassen?

mfg
Empire

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Variablentyp selber definieren

Beitrag von Xin » Mo Jun 07, 2010 3:14 pm

Empire hat geschrieben:Da fällt mir auf:
Es ist sehr praktisch zu wissen wie ich die umwandel aber woher weis ich wie rum das System die Variable braucht??
Muss ich das den User testen lassen?
Nun, zum einen kannst Du das beim kompilieren festlegen - schließlich ändert sich das ja nicht mehr, wenn es erstmal kompiliert ist.
Und Du kannst es herausfinden:

Code: Alles auswählen

int integer = 1;

bool littleEndian = ( (unsigned int*)&integer )[0] ) != 0;  // Intel speichert die kleinsten Werte am vorderen "Ende"
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Variablentyp selber definieren

Beitrag von Empire » Mo Jun 07, 2010 3:28 pm

char ist davon aber nicht betroffen oder?
Nein ich will int nicht in char stecken zum verschicken aber bei einem Chat brauch ich halt char.

mfg
Empire

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Variablentyp selber definieren

Beitrag von Dirty Oerti » Mo Jun 07, 2010 3:42 pm

Also es wird definitiv beim kompilieren festgelegt.
Nur einen wirklichen DEFINE-SWITCH dafür scheint es nicht zu geben.
Sprich du musst es testen:

Code: Alles auswählen

#include <stdio.h>

const char ENDIANNESS_BIG = 1;
const char ENDIANNESS_LITTLE = 2;
const char ENDIANNESS_MID_BIG = 4;
const char ENDIANNESS_MID_LITTLE = 8;
char ENDIANNESS = 0;


void test_endianness()
{
	const int __testcaseint = 0xAABBCCDD;
	unsigned char* __testcasearray = (char*)&__testcaseint;
	if (__testcasearray[3] == 0xAA) ENDIANNESS = ENDIANNESS_LITTLE;
	else if (__testcasearray[0] == 0xAA) ENDIANNESS = ENDIANNESS_BIG;
	else if (__testcasearray[1] == 0xAA) ENDIANNESS = ENDIANNESS_MID_LITTLE;
	else if (__testcasearray[2] == 0xAA) ENDIANNESS = ENDIANNESS_MID_BIG;
	else ENDIANNESS = 0;
}



int main(int argc, char** argv)
{
	test_endianness();
	printf("The endianness of the compile system is %d (",ENDIANNESS);
	if (ENDIANNESS == ENDIANNESS_BIG) printf("Big Endian, 0xAABBCCDD");
	else if (ENDIANNESS == ENDIANNESS_LITTLE) printf("Little Endian, 0xDDCCBBAA");
	else if (ENDIANNESS == ENDIANNESS_MID_LITTLE) printf("Mid Endian/Little like, 0xBBAADDCC");
	else if (ENDIANNESS == ENDIANNESS_MID_BIG) printf("Mid Endian/Big like, 0xCCDDAABB");
	else printf("unknown or untested");
	printf(")\n");
	return 0;
}

Die zwei unterschiedlichen Mid Endian Varianten kann man eigentlich vernachlässigen, sind hier aber nur der Vollständigkeit halber aufgeführt. Die Bezeichnungen der beiden hab ich mal so gewählt.


Ein char besteht nur aus einem Byte. Das kannst du folglich nicht anders anwenden ;)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten