Unser neuestes Mitglied: huanbengel

139 Besucher derzeit online [ Zeigen ]

Startseite | Werbefreies Forum: Jetzt Mitglied werden! | Login | Team | Suchen
Statistik | Hilfe / FAQ | Regeln
Willkommen auf dem xpBulletin Board, Gast.
Du bist nicht registriert oder eingeloggt.
Dein Letzter Besuch war am: 18.07.2018, 16:50 Uhr.
[ Alles als gelesen markieren ]
xpBulletin Board » Programmierung » C und C++ - Forum » Variierender Datentyp
Benutzer im Forum aktiv: Keine

[ Neue Antwort ]


Autor
Thema: Variierender Datentyp

 

Seiten (2): « 1, [2]

Neuer Beitrag 13.01.2009, 08:59
 Re: Variierender Datentyp

#31 | Zitieren |

koril-k ist Offline koril-k
Ancient Hacker



Alter: 31
Geschlecht: Männlich
Jetzt hab ich's. Lieber spät als nie ^^. Denn tatsächlich findet diese Klasse jetzt Anwendung in einem Projekt, an dem ich mitarbeite und so war ich gezwungen, weiter daran zu arbeiten. Dort schlug ich vor:

Zitat:
1) Der Konstruktor der Variants hat einen statischen Zeiger (also für jeden Typ einen neuen). Dieser Zeiger zeigt auf eine Funktion, die einen Typ-Zähler hochzählt. Sofort wird der Zeiger auf NULL gesetzt, sodass folgende Konstruktoren desselben Typs nicht weiterzählen. Dadurch wird höchsteffizient eine Zuordnung von Datentypen<->Zahlen erreicht.

2) Eine statische aber vom Typ des Variants abhängige Variable speichert diesen Zahlenwert, sodass jeder Variant ohne Zusatzspeicherplatz seine Typ-ID ermitteln kann.

3) Jeder Varianttyp hat eine eigene statische Funktion zur Erzeugung eines neuen Variants dieses Typs. Nennen wir sie "Variant createMyType()".

4) Die schon erwähnte Zählfunktion trägt zu jedem gezählten Datentyp die Adresse der "createMyType"-Funktion dieses Typs in eine Liste/Array ein.

5) Wenn ein Variant in einen Datenstrom in Zeichenform eingespeist wird (z.B. mit <<), wird zuerst die Typ-ID gesendet. Beim Empfang (z.B. mit >>) wird diese ID gelesen und mit der entsprechenden zugehörigen createMyType()-Funktion, deren Adresse für diesen Typ gespeichert wurde, kann ein Variant zum Empfang des in Zeichen codierten Variants mit dem richtigen Typ vorbereitet werden.



Edit: Ich sehe gerade, dass das ganze in ähnlicher Variation schon von dir vorgeschlagen wurde. Naja es ist so lange her und selbst drauf kommen ist ja auch viel schöner *g*

Beitrag editiert von koril-k am 13.01.2009, 09:17
 Beiträge: 1.133 | Punkte: 1.996 | Wohnort: Greifswald | Registriert seit: 4516 Tagen (Mar 2006)
 
Neuer Beitrag 13.01.2009, 08:59
 Werbung

AdBot
Mister Ad

 
Neuer Beitrag 14.01.2009, 11:02
 Re: Variierender Datentyp

#32 | Zitieren |

bg ist Offline bg

Operator
Zen Master Foo


Alter: 36
Geschlecht: Männlich
War das jetzt mehr ein Status-Update oder eine Frage?
 Beiträge: 3.842 | Punkte: 4.429 | Wohnort: Wien | Registriert seit: 5454 Tagen (Aug 2003)
 
Neuer Beitrag 14.01.2009, 18:28
 Re: Variierender Datentyp

#33 | Zitieren |

koril-k ist Offline koril-k
Ancient Hacker



Alter: 31
Geschlecht: Männlich

Themenstarter
Ersteres. Die schönsten Probleme nehmen halt kein Ende
 Beiträge: 1.133 | Punkte: 1.996 | Wohnort: Greifswald | Registriert seit: 4516 Tagen (Mar 2006)
 
Neuer Beitrag 14.01.2009, 18:28
 Werbung

AdBot
Mister Ad

 
Neuer Beitrag 16.01.2009, 13:33
 Re: Variierender Datentyp

#34 | Zitieren |

koril-k ist Offline koril-k
Ancient Hacker



Alter: 31
Geschlecht: Männlich

Themenstarter
Ich habs geschafft ^^, allerdings mit einer (dafür einzigen) zentralen Liste der unterstützten Typen. Folgendes ist möglich:

Code:

int main()
{
    Variant a = 10;
    Variant b = true;
    Variant c = myClass();
    Variant d = string("Hallo");

    fstream file("Datei.txt",ios::out|ios::binary);
    a.writeTo(file);
    b.writeTo(file);
    c.writeTo(file);
    d.writeTo(file);
    file.close();

    fstream another_file("Datei.txt", ios::in|ios::binary );
    Variant a1 = Variant::createVariantByReading(another_file);
    b.updateFrom(another_file);
    Variant c1 = Variant::createVariantByReading(another_file);
    Variant d1 = Variant::createVariantByReading(another_file);
    another_file.close();

    cout << a1 << endl;
    cout << b << endl;
    cout << c1 << endl;
    cout << d1 << endl;
};



Ich möchte den Code nicht preisgeben, da ich nicht weiß, ob das Projekt, für das ich ihn weiterentwickle, das billigt. Aber das Schema läuft im Wesentlichen so wie oben beschrieben, nur dass die Zählfunktion nicht im Konstruktor sondern bei der Initialisierung der statischen typID-Variable aufgerufen wird. Durch eine Liste expliziter Templateinstanziierungen der Klasse elemType<T> wird diese Funktion für jeden zu unterstützenden Typ aufgerufen.
 Beiträge: 1.133 | Punkte: 1.996 | Wohnort: Greifswald | Registriert seit: 4516 Tagen (Mar 2006)
 
Neuer Beitrag 16.01.2009, 14:46
 Re: Variierender Datentyp

#35 | Zitieren |

bg ist Offline bg

Operator
Zen Master Foo


Alter: 36
Geschlecht: Männlich
Gut, ich mache dann gleich eine Anmerkung dazu :-)

Code:

#include <variant.h>

int main(int argc, char** argv) {
  fstream another_file("Datei.txt", ios::in|ios::binary );
  Variant a = Variant::createVariantByReading(another_file);
  another_file.close();
  return 0;
}



duerfte also nicht funktionieren, richtig?
 Beiträge: 3.842 | Punkte: 4.429 | Wohnort: Wien | Registriert seit: 5454 Tagen (Aug 2003)
 
Neuer Beitrag 16.01.2009, 22:01
 Re: Variierender Datentyp

#36 | Zitieren |

koril-k ist Offline koril-k
Ancient Hacker



Alter: 31
Geschlecht: Männlich

Themenstarter
Wenn die Datei zuvor korrekt beschrieben wurde... warum sollte es nicht gehen? Anfangs habe ich direkt vom cin-Stream geladen Der Gag ist ja, dass die expliziten Templateinstanziierungen direkt aufgelistet und somit fest vorbereitet werden. Wenn ich die Klasse korrekt ausgearbeitget hab, lass ich dir den Quelltext mal per PN zukommen; wenn du's nicht weitergibst, wird das keinen stören.
 Beiträge: 1.133 | Punkte: 1.996 | Wohnort: Greifswald | Registriert seit: 4516 Tagen (Mar 2006)
 
Neuer Beitrag 17.01.2009, 12:16
 Re: Variierender Datentyp

#37 | Zitieren |

bg ist Offline bg

Operator
Zen Master Foo


Alter: 36
Geschlecht: Männlich
Hm, gut, da bin ich mal gespannt. Ich kann mir noch nicht vorstellen, wie du ohne den Aufruf des Konstruktors Variant<Typ>() den Funktionszeiger zum Erstellen des Variants des entsprechenden Typs erhaeltst :-)
 Beiträge: 3.842 | Punkte: 4.429 | Wohnort: Wien | Registriert seit: 5454 Tagen (Aug 2003)
 
Neuer Beitrag 17.01.2009, 12:16
 Werbung

AdBot
Mister Ad

Seiten (2): « 1, [2]

  

xpBulletin Board » Programmierung » C und C++ - Forum » Variierender Datentyp

[ Neue Antwort ]


Heute ist der 18.07.2018, 16:50 Uhr

Sämtliche Beiträge geben die Meinung des jeweiligen Verfassers wieder.
Für den Inhalt der Beiträge sind ausschließlich die Autoren verantwortlich.


Powered by: xpBulletin Board Version 2.3.0
Generiert in 0.0396 Sekunden
« Übersicht | @Twitter | @Facebook | Sitemap | Impressum »