Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

1

10.12.2012, 19:04

Programmierung eines ganz speziellen Datentyps

Hallo zusammen.

Ich beschäftige mich gerade mit dem Feld der GUI-Programmierung, also Fenster, Unterfenster usw. im Eigenbau und Vollbildmodus sozusagen.
Bei meiner Datenstruktur zum Beschreiben eines Fensters in meiner Klasse fehlt mir noch ein ganz wichtiger Schritt:

Wie entwickle ich eine typ-neutrale Datenstruktur zum Speichern der Daten (Tabellenwerte beispielsweise, also Integer und Long und/oder wchar_t*.. und/oder...) in einem Datentyp?

Mir kam folgender Gedanke:

C-/C++-Quelltext

1
map<wchar_t*, void*> m_Data;


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <Windows.h>
#include <iostream>
#include <map>
using namespace std;

int main(void) {

// Möglichst Datentyp-neutrale Map
map<wchar_t*, void*> m_Data;

// Speichern wir mal eine RECT Struktur in der Map (?)
RECT rect = {100,200,500,600};

// Los gehts - RECT "abspeichern"
m_Data[L"rechteck"] = reinterpret_cast<void*>(&rect );

// Nun wieder eine RECT-Struktur aus der Map machen
RECT ausDerMap = *( reinterpret_cast<RECT*>(m_Data[L"rechteck"]));

// fertig
cin.get();
return 0;
}



Das Blöde: Ich speichere die Werte ja nicht direkt in der Map, denn ich merke mir hiermit nur die Adressen.
Wer kennt eine typ-Neutralen Standard-Datenstruktur zum Speichern solcher Werte. Auf die Werte sollen mithilfe von wchar_t* oder int zugegriffen werden (wie bei einer Map).


Vielen Dank für jegliche Hilfe
Johannes Schneider
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

2

10.12.2012, 20:29

Nochmal: Ich möchte nicht alles in Form von wchar_t* speichern und dann beim Rendern casten müssen (?)
Hat jemand eine Idee :D?
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

3

10.12.2012, 21:15

Löse es doch so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
struct {
  union {
    int64_t ival;
    double fval;
    void* pval;
  }; // union
  void* tt;
}; // struct

Mit dem Flag tt stellst du fest, was du aus dem union extrahieren musst. Du könntest natürlich auch ein uint8_t oder enum oder so für tt verwenden. Und schon haste eine Art, Daten mit Typ vermerkt abzulegen.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

4

10.12.2012, 21:28

Ok danke :D

Aber bei Unionen wird ja immer der Speicher vom größten darin enthaltenen Element benutzt.
Ok ich denk ich geh doch lieber den weg über wchar_t* strings die ich dann caste.



Danke trotzdem !
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

5

10.12.2012, 21:45

Wir leben in Zeiten mit 4GiB RAM als Laptop-Standard ôO Da sind die höchstens verballerten 4Bytes lächerlich winzig. Perf über Kompaktheit, würd' ich bei sowas sagen.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

10.12.2012, 21:50

Wieso geht er überhaupt über den Umweg in der Map? Cast und fertig. Das kompiliert ohnehin in nichts weg, so ein reinterpret_cast.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

7

10.12.2012, 21:55

Gut, wenn er darauf vertrauen will, dass er keinen Mist zu Blödsinn und Quark castet, geht das natürlich auch mit nur einem Pointer.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

8

10.12.2012, 21:58

BlueCobold: Ich wollte die einzelnen Datenstrukturen, die in der map gespeichert würden, mit einem wchar_t* Bezeichner ansprechen.
Aber jetzt wo dus sagst....
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

9

11.12.2012, 08:28

Ok danke :D

Aber bei Unionen wird ja immer der Speicher vom größten darin enthaltenen Element benutzt.
Ok ich denk ich geh doch lieber den weg über wchar_t* strings die ich dann caste.



Danke trotzdem !

Du könntest eine union aus Pointern auf die richtigen Typen machen. Aber das wäre äußerst typunsicher.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

11.12.2012, 08:34

Erklär uns doch bitte mal, was genau die Idee dieser "typ-neutralen Datenstruktur zum Speichern der Daten" ist und warum genau du meinst, so etwas zu brauchen... ;)

Werbeanzeige