Variablentyp selber definieren
Variablentyp selber definieren
Tach alle zusammen,
Ich bin gerade dabei ein eigenes Chat Programm zu schreiben. Aber da man nie weis was einem am anderen erwartet dachte ich
es wäre das einfachste für das Programm 2 eigene Variablentyp zu definieren. Eine für Strings und eine für ganz Zahlen.
ABER geht das überhaupt und wenn ja wie?
mfg
Empire
Ich bin gerade dabei ein eigenes Chat Programm zu schreiben. Aber da man nie weis was einem am anderen erwartet dachte ich
es wäre das einfachste für das Programm 2 eigene Variablentyp zu definieren. Eine für Strings und eine für ganz Zahlen.
ABER geht das überhaupt und wenn ja wie?
mfg
Empire
- Bebu
- Beiträge: 562
- Registriert: Mi Okt 21, 2009 6:19 pm
- Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!
Re: Variablentyp selber definieren
Ich verstehe dein Problem nicht so ganz. Als erstes C oder C++? Ein bisschen Quellcode hilft manchmal das Problem zu verstehen und Tipps zu geben.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!
Re: Variablentyp selber definieren
C/C++.
gibt kein passenden Quellecode.
Also auf manchen Systemen hat int 4 auf manchen 8 Bit (muss jetzt nicht so stimmen aber nach dem prinzip halt).
Wenn man jetzt eine int Variable von System A (4Bit) nach System B (8Bit) schickt kann das ja nicht gut gehen.
Wenn ich jetzt selber eine Variable definiere hab ich das Problem nicht.
mfg
Empire
gibt kein passenden Quellecode.
Also auf manchen Systemen hat int 4 auf manchen 8 Bit (muss jetzt nicht so stimmen aber nach dem prinzip halt).
Wenn man jetzt eine int Variable von System A (4Bit) nach System B (8Bit) schickt kann das ja nicht gut gehen.
Wenn ich jetzt selber eine Variable definiere hab ich das Problem nicht.
mfg
Empire
- Bebu
- Beiträge: 562
- Registriert: Mi Okt 21, 2009 6:19 pm
- Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!
Re: Variablentyp selber definieren
Also ich denke die größe der Variablen int wird vom System definiert, darauf kannst du wohl keinen Einfluss nehmen. Du kannst aber selber Speicher reservieren. Also müsstest du die Größe des Ankommenden Pakets überprüfen und dann entsprechend Speicher reservieren.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!
Re: Variablentyp selber definieren
Ich will nicht int verändern, sondern selber eine Variable definieren und zwar vom Typ bsp oä.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Variablentyp selber definieren
Erstens ist in der Regel nur der Typ "int" Systemabhänig, entweder 2, 4 oder 8 Byte.Ich will nicht int verändern, sondern selber eine Variable definieren und zwar vom Typ bsp oä.
Das bedeutet, das die Typen "short (int)"(2 Byte), "long (int)"(4 Byte) und "long long (int)"(8 Byte), die auch alle Ganzahlige Werttypen darstellen bei fast allen System gleich sind, es gibt aber einige Minimale unterschiede. Zudem wirst du nur sehr selten Zahlen größer 2^31(signed long int) oder 2^32 (unsigned long int) versenden.
Und weil der User an sich keine Zahlen versenden kann, sondern nur Texte und du weist, welche Zahlen dein Chatprogramm versendet, kann es dir egal sein, ob 4Byte oder 8Byte ints, weil du bei Zahlen <= 2^32 keine Casting-Verluste hast, solange du das Untere Nibble der breiteren Variable verwendest.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: Variablentyp selber definieren
Thx
Trotzdem würde es mich noch Interesieren ob es jetzt geht oder nicht.
mfg
Empire
Trotzdem würde es mich noch Interesieren ob es jetzt geht oder nicht.
mfg
Empire
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Variablentyp selber definieren
Nope.cloidnerux hat geschrieben:Das bedeutet, das die Typen "short (int)"(2 Byte), "long (int)"(4 Byte) und "long long (int)"(8 Byte), die auch alle Ganzahlige Werttypen darstellen bei fast allen System gleich sind, es gibt aber einige Minimale unterschiede
Ich würde den Unterschied zwischen 4 und 8 Byte nicht unbedingt als "minimalen" Unterschied beschreiben:
Code: Alles auswählen
#include <stdio.h>
int main(int argc, char** argv)
{
printf("\nSize of INT: %lu", sizeof(int));
printf("\nSize of SHORT INT: %lu", sizeof(short int));
printf("\nSize of LONG INT: %lu", sizeof(long int));
printf("\nSize of LONG LONG INT: %lu", sizeof(long long int));
printf("\nSize of SHORT: %lu", sizeof(short));
printf("\nSize of LONG: %lu", sizeof(long));
printf("\nSize of LONG LONG: %lu", sizeof(long long));
printf("\nSize of FLOAT: %lu", sizeof(float));
printf("\nSize of DOUBLE: %lu", sizeof(double));
printf("\n");
return 0;
}
daniel@GosigMus:~/Desktop$ gcc test.c
daniel@GosigMus:~/Desktop$ ./a.out
Size of INT: 4
Size of SHORT INT: 2
Size of LONG INT: 8
Size of LONG LONG INT: 8
Size of SHORT: 2
Size of LONG: 8
Size of LONG LONG: 8
Size of FLOAT: 4
Size of DOUBLE: 8
Das ist - meiner Ansicht nach - keine Begründung dafür, dass man es lassen sollte.cloidnerux hat geschrieben:Zudem wirst du nur sehr selten Zahlen größer 2^31(signed long int) oder 2^32 (unsigned long int) versenden.
Ich bin mir SEHR sicher, dass es (auch bei einem simplen Chatprogramm) nicht unüblich sein kann, so "große" Datenpakete zu versenden.
float, double oder sowas ist auch noch abhängig vom System.cloidnerux hat geschrieben:Erstens ist in der Regel nur der Typ "int" Systemabhänig, entweder 2, 4 oder 8 Byte.
Außerdem gibt es auf unterschiedlichen Systemen noch unterschiedliche Byte-Orders:
Das heißt, wenn du ein 2 Byte Integer mit folgendem Inhalt hast (dargestellt, wie der Integer linear im Speicher liegt):
01000000 | 00000010
Dann wird das auf manchen Systemen (automatisch, ohne, dass du darauf Einfluss nehmen kannst) folgendermaßen zu einer Zahl zusammengesetzt:
0100000000000010 (binär) = 16386 (dezimal)
Auf anderen Systemen (mit einer anderen Byte-Order) kommt allerdings das dabei heraus:
0000001001000000 (binär) = 576 (dezimal)
Das Problem ist, denke ich, ersichtlich.
Um dies zu umgehen verwendet man in der Regel eine vordefinierte Byte-Order für Übertragungen über Netzwerke.
Dazu benötigt man Funktionen, die - abhängig vom verwendeten Hostsystem - Zahlen vor dem versenden über das Netzwerk in die Network Byte Order umwandeln und Zahlen direkt nach dem Empfangen über das Netzwerk in die Host Byte Order konvertieren.
Schön (viel) dazu steht hier:
http://de.wikipedia.org/wiki/Byte-Reihe ... von_Zahlen
Und hier:
http://www.gnu.org/s/libc/manual/html_n ... Order.html
Im letzten Link siehst du auch schon etwas, dass dir hilft, dein ursprüngliches Problem zu lösen:
Dabei handelt es sich um einen Integerdatentyp, der unsigned (also ohne Vorzeichen) und genau 32 Bit lang ist, und das auf allen Systemen, die diesen Typ unterstützen.uint32_t
Davon gibt es natürlich noch mehr, alle definiert durch die liebe Standardbibliothek.
http://en.wikipedia.org/wiki/Stdint.h
Code: Alles auswählen
#include <netinet/in.h>
void sende(uint32_t data)
{
uin32_t data_networkorder = htonl(data);
//senden
}
uint32_t empfange()
{
uint32_t data_networkorder = EMPFANGSFUNKTION();
return ntohl(data_networkorder);
}
--------------------------------------
Code: Alles auswählen
#include <stdio.h>
#include <stdint.h>
int main(int argc, char** argv)
{
printf("\nSize of INT64: %lu", sizeof(int64_t));
printf("\nSize of INT32: %lu", sizeof(int32_t));
printf("\nSize of INT16: %lu", sizeof(int16_t));
printf("\nSize of INT8: %lu", sizeof(int8_t));
printf("\n");
return 0;
}
Code: Alles auswählen
Size of INT64: 8
Size of INT32: 4
Size of INT16: 2
Size of INT8: 1
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.
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.
Re: Variablentyp selber definieren
So was nen ich Antwort.
Darf ich unser neues Lexikon presentieren:
Dirty Oerti! *applaudieren*
thx
mfg
Empire
Darf ich unser neues Lexikon presentieren:
Dirty Oerti! *applaudieren*
thx
mfg
Empire
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Variablentyp selber definieren
Das wird sogar - insbesondere für Zahlen - notwendig, da es Systeme gibt, die Zahlen in Big-Endian speichern und andere in Little Endian.Empire hat geschrieben:Tach alle zusammen,
Ich bin gerade dabei ein eigenes Chat Programm zu schreiben. Aber da man nie weis was einem am anderen erwartet dachte ich
es wäre das einfachste für das Programm 2 eigene Variablentyp zu definieren. Eine für Strings und eine für ganz Zahlen.
ABER geht das überhaupt und wenn ja wie?
Little Endian bedeutet, dass die niedrigeren Werte am Ende stehen: 1234 ist tausendzweihundertvierunddreißig.
Bei BigEndian stehen die höheren Werte aber hinten, der Computer speichert also die Zahl in anderer Reihenfolge: 4321 ist tausendzweihundertvierundzwanzig.
Wenn Du nun die Zahl 1234 übermittelst, musst Du die Zahl in einem klar definiertem Format speichern. Dafür schreibst Du Dir in C++ am besten eine Klasse, die eine Zahl speichert und sie in beiden Formaten ausgeben kann.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.