Mehrere Instanzen einer Klasse abspeichern



  • Wieso ist mir das noch nicht aufgefallen?

    Einerseits können chars und ints unterschiedlich gross sein

    Nein, die Größe von char, signed char und unsigned char ist vom Standard deutlich festgelegt: Genau ein Byte.



  • Sone schrieb:

    Wieso ist mir das noch nicht aufgefallen?

    Einerseits können chars und ints unterschiedlich gross sein

    Nein, die Größe von char, signed char und unsigned char ist vom Standard deutlich festgelegt: Genau ein Byte.

    Quizfrage:

    Programm A speichert 60 Bytes in eine Datei.
    Programm B liest die gesamte Datei, findet aber nur 40 Bytes vor.
    Kann das sein?



  • reinterpreter schrieb:

    Sone schrieb:

    Wieso ist mir das noch nicht aufgefallen?

    Einerseits können chars und ints unterschiedlich gross sein

    Nein, die Größe von char, signed char und unsigned char ist vom Standard deutlich festgelegt: Genau ein Byte.

    Quizfrage:

    Programm A speichert 60 Bytes in eine Datei.
    Programm B liest die gesamte Datei, findet aber nur 40 Bytes vor.
    Kann das sein?

    Nein. Wenn Programm A 60 chars in die Datei schreibt, dann findet Programm B auch 60 vor.



  • Sone schrieb:

    reinterpreter schrieb:

    Sone schrieb:

    Wieso ist mir das noch nicht aufgefallen?

    Einerseits können chars und ints unterschiedlich gross sein

    Nein, die Größe von char, signed char und unsigned char ist vom Standard deutlich festgelegt: Genau ein Byte.

    Quizfrage:

    Programm A speichert 60 Bytes in eine Datei.
    Programm B liest die gesamte Datei, findet aber nur 40 Bytes vor.
    Kann das sein?

    Nein. Wenn Programm A 60 chars in die Datei schreibt, dann findet Programm B auch 60 vor.

    Doch. Da nicht festgelegt ist, aus wie vielen Bits ein Byte besteht. Bei Programm A sind es 8 Bits, bei Programm B 12 Bits.

    C++11-Standard § 1.7/1 schrieb:

    The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain
    any member of the basic execution character set (2.3) and the eight-bit code units of the Unicode UTF-8
    encoding form and is composed of a contiguous sequence of bits, the number of which is implementation-
    defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order
    bit. The memory available to a C++ program consists of one or more sequences of contiguous bytes. Every
    byte has a unique address.

    Wobei anzumerken ist, dass es höchst ungewöhnlich ist, dass an dieser Stelle ein Fehler passiert, aber es ist durchaus denkbar.



  • Ein 12-Bit-Byte Programm kann nicht auf einem 8-Bit-Byte File zugreifen. Weil ein 8-Bit-Byte File nur auf einer 8-Bit-Byte Plattform existieren, bzw. genutzt werden kann. Und diese kann keine 12-Bit-Byte Programme ausführen. (Denk mal darüber nach, wie grundlegend das eigentlich ist, worüber wir gerade schreiben)

    Edit: Ach, der Standard kennt ja keine Dateisysteme. Dann muss ich es direkter Formulieren. (Für alle, die den Text gelesen haben bevor er editiert wurde)


  • Mod

    Sone, es ist einfach falsch.

    (Aber realistisch ist die Annahme von 8-Bit chars natürlich schon. Man muss ganz schön suchen, um ein Gegenbeispiel zu finden)



  • SeppJ schrieb:

    Sone, es ist einfach falsch.

    Aber war dann mein Argument jetzt nicht richtig oder wie darf ich mir das merken..?


  • Mod

    Sone schrieb:

    SeppJ schrieb:

    Sone, es ist einfach falsch.

    Aber war dann mein Argument jetzt nicht richtig oder wie darf ich mir das merken..?

    Welches Argument genau meinst du? Ich möchte jetzt nicht den ganzen Thread durchlesen. Die Größe von char ist nicht festgelegt, das Padding ist nicht festgelegt, die Byteorder ist nicht festgelegt, usw. Eigentlich alles was ich Kellerautomat schon erklärt habe, warum ein direkt geschriebenes Binärformat so unportabel ist.



  • Sone schrieb:

    SeppJ schrieb:

    Sone, es ist einfach falsch.

    Aber war dann mein Argument jetzt nicht richtig oder wie darf ich mir das merken..?

    Wenn du deine letzte Auslassung meinst:

    Sone schrieb:

    Ein 12-Bit-Byte Programm kann nicht auf einem 8-Bit-Byte File zugreifen. Weil ein 8-Bit-Byte File nur auf einer 8-Bit-Byte Plattform existieren, bzw. genutzt werden kann.

    Quatsch.

    Sone schrieb:

    Und diese kann keine 12-Bit-Byte Programme ausführen.

    Irrelevant.

    Sone schrieb:

    (Denk mal darüber nach, [...]

    daß ein 12-bittiger char auf Platform A super in einen 16/32-bittigen int auf Platform B passt.

    Sone schrieb:

    Ach, der Standard kennt ja keine Dateisysteme.

    Jo. Wurscht.

    Sone schrieb:

    Dann muss ich es direkter Formulieren. (Für alle, die den Text gelesen haben bevor er editiert wurde)

    Vorher noch mehr Mist?



  • Wovon redest du?

    @Sone:
    Ok, Back to The Roots

    Nehmen wir mal ohne Beschränkung der Allgemeinheit an, wir möchten ein Struct serialisieren. Und wir machen es noch schlimmer: wir serialisieren nur C like Structs.

    typedef struct
    {
      char Name[20];
      char Nachname[30];
      int Alter;  
    } tPerson_V01;
    

    Wie sieht der entsprechende Serialisierungsbytecode aus ?

    0x0A|0x0A|0x0B|...		// Hier steht Name. Format: Byte 1: Anzahl der Bytes, Rest ASCII Daten 
    0x02|0x0A|0x0B			// Hier steht Nachname. Format: Byte 1: Anzahl der Bytes, Rest ASCII Daten 
    0x04|0x00|0x00			// Hier steht Alter. Format: Byte 1: Anzahl der Bytes, Rest Daten in Little Endian
    

    Das Programm speichert so die Daten ab und wird an den Kunden herausgeschickt. Nun will man aber das Struct erweitern.

    typedef struct
    {
      wchar_t Name[20];
      wchar_t Nachname[30];
      wchar_t Wohnorte[1024];
      int Alter;  
    } tPerson_V02;
    

    Und Peng. Wie soll nun das Format aussehen, damit du Dateien in denen tPerson_V01 steht als auch Dateien in denen tPerson_V02 einlesen kannst ? Etwas so ???

    0x00|0x0A|0x0A|0x0B|...		// Hier steht Name. Format: Byte 1-2: Anzahl der Bytes | Unicode Daten 
    0x00|0x02|0x0A|0x0B			// Hier steht Spitzname. Format: Byte 1-2: Anzahl der Bytes | ASCII Daten 
    0x02|0x00|0x00				// Hier steht Alter
    

    Ist aber leider völlig inkompatibel zu Format 1. Geschweige denn das in dem jetzigen Binärformat noch viele notwendigen Daten fehlen (Kodierung, Little Endian, Big Endian,...).

    Aber was tun, wenn beide Formate eingelesen werden sollen ? Ein Konvertierungstool schreiben ? Neues Struct, neues Tool ? Ala Autocad DXF, alle Jahre wieder ein neues Format ???

    Die Sünden der Vergangenheit, rächen sich bis in alle Ewigkeit.

    Du siehst, man braucht erstens ein Format zur Speicherung von Daten. Und zweitens muss man höllig auf Inkompatibilität aufpasssen. Und XML greift da einem schon unter die Arme, solche Fehler zu vermeiden.



  • Ist ja nicht so, als koennte man eben auf Versionierung achten... Und wenn man ein Protokoll von Anfang an ordentlich designt und Extensions gleich einplant, ist das alles kein Problem.



  • Ist ja nicht so, als koennte man eben auf Versionierung achten... Und wenn man ein Protokoll von Anfang an ordentlich designt und Extensions gleich einplant, ist das alles kein Problem.

    Sorry,

    aber wir haben 5 Seiten benötigt bis wir auf die Wörter "Versionierung", "Protokoll", "Design" gekommen sind. Da darf man schon ein wenig motzen... :p


Anmelden zum Antworten