<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Typlose Zeiger in C++]]></title><description><![CDATA[<p>Ich bin gerade mal wieder an die Grenzen von C++ gestoßen. Das hat sich ziemlich schnell wenn man Assembler gewohnt ist.<br />
Meine Aufgabe:<br />
Eine Klasse zu schreiben die den Zugriff auf eine Datenbank (Datei) ermöglicht.<br />
Ich möchte die Länge eines Datensatzes und den dazugehörigen Zeiger übergeben.<br />
Ich möchte auf ein und den selben Datensatz (mem) mit unterschiedlichen Formatierungen (Typen)<br />
zugreifen. (Nicht zu umgehen, sonst ist sehr viel Schreibarbeit und sind einige 20 Klassen erforderlich; die Umformatierung würde natürlich erheblich Zeit sparen und die Sache extrem vereinfachen; wärend der Laufzeit ist die Umformatierung natürlich auch ein Punkt der Zeitersparnis, da der Zugriff dieser Datensätze in einer Simulation im nano-Sekundenbereich abläuft)<br />
Problem:<br />
Kann man nun void *zeiger dazu benützen nacheinander mit dem gleichen Zeiger unterschiedliche formatierungen anzusprechen, die die gleiche Länge haben?<br />
Oder andersrum, kann man den void *zeiger in einem read( void *zeiger, int laenge ) Member benutzen zur übergabe der Startadresse auf typedevs unterschiedlicher Länge, oder ist nach dem ersten Aufruf der sozusagenden Typzuweisung und damit Definition des Zeigers schluß?</p>
<p>- LINUX<br />
- GCC-4.3.1</p>
<p>Das hier hilft mir herauszufinden ob es sich Loht diese Aufgabe weiterhin mit c++ zu verfolgen oder ob ein Unterprojekt mit NASM und einem Makefile die schnellere Lösung darstellt. Weiterhin benötige ich voraussichtlich sowieso NASM um die Schnelligkeit der Simulation zu gewährleisten.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/232991/typlose-zeiger-in-c</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 20:24:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/232991.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 29 Jan 2009 19:41:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Thu, 29 Jan 2009 19:41:00 GMT]]></title><description><![CDATA[<p>Ich bin gerade mal wieder an die Grenzen von C++ gestoßen. Das hat sich ziemlich schnell wenn man Assembler gewohnt ist.<br />
Meine Aufgabe:<br />
Eine Klasse zu schreiben die den Zugriff auf eine Datenbank (Datei) ermöglicht.<br />
Ich möchte die Länge eines Datensatzes und den dazugehörigen Zeiger übergeben.<br />
Ich möchte auf ein und den selben Datensatz (mem) mit unterschiedlichen Formatierungen (Typen)<br />
zugreifen. (Nicht zu umgehen, sonst ist sehr viel Schreibarbeit und sind einige 20 Klassen erforderlich; die Umformatierung würde natürlich erheblich Zeit sparen und die Sache extrem vereinfachen; wärend der Laufzeit ist die Umformatierung natürlich auch ein Punkt der Zeitersparnis, da der Zugriff dieser Datensätze in einer Simulation im nano-Sekundenbereich abläuft)<br />
Problem:<br />
Kann man nun void *zeiger dazu benützen nacheinander mit dem gleichen Zeiger unterschiedliche formatierungen anzusprechen, die die gleiche Länge haben?<br />
Oder andersrum, kann man den void *zeiger in einem read( void *zeiger, int laenge ) Member benutzen zur übergabe der Startadresse auf typedevs unterschiedlicher Länge, oder ist nach dem ersten Aufruf der sozusagenden Typzuweisung und damit Definition des Zeigers schluß?</p>
<p>- LINUX<br />
- GCC-4.3.1</p>
<p>Das hier hilft mir herauszufinden ob es sich Loht diese Aufgabe weiterhin mit c++ zu verfolgen oder ob ein Unterprojekt mit NASM und einem Makefile die schnellere Lösung darstellt. Weiterhin benötige ich voraussichtlich sowieso NASM um die Schnelligkeit der Simulation zu gewährleisten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654608</guid><dc:creator><![CDATA[Der gewünschte Benutzerna]]></dc:creator><pubDate>Thu, 29 Jan 2009 19:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Thu, 29 Jan 2009 20:03:20 GMT]]></title><description><![CDATA[<p>Der gewünschte Benutzerna schrieb:</p>
<blockquote>
<p>Kann man nun void *zeiger dazu benützen nacheinander mit dem gleichen Zeiger unterschiedliche formatierungen anzusprechen, die die gleiche Länge haben?</p>
</blockquote>
<p>Ja, du musst den Zeiger entsprechend umwandeln (mit <code>static_cast</code> ), bevor du den Speicherbereich dahinter interpretierst. Und du musst natürlich dafür sorgen, dass du den richtigen Typ ansprichst.</p>
<p>Der gewünschte Benutzerna schrieb:</p>
<blockquote>
<p>Oder andersrum, kann man den void *zeiger in einem read( void *zeiger, int laenge ) Member benutzen zur übergabe der Startadresse auf typedevs unterschiedlicher Länge, oder ist nach dem ersten Aufruf der sozusagenden Typzuweisung und damit Definition des Zeigers schluß?</p>
</blockquote>
<p>Hier bin ich mir nicht ganz sicher, was du meinst. Du willst also eine Funktion bereitstellen, die die Adresse für einen beliebigen Typen ausliest? Und die Typen sind erst zur Laufzeit bekannt?</p>
<p>Irgendwie wirst du ja schon zur Compilezeit wissen, wie sich die einzelnen Typen verhalten, um sie auch spezifisch zu behandeln. Eventuell wären daher Templates angebracht. Aber um was für Typen geht es denn? Klassen? Oder nur PODs?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654620</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 29 Jan 2009 20:03:20 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Thu, 29 Jan 2009 20:21:07 GMT]]></title><description><![CDATA[<p>Der gewünschte Benutzerna schrieb:</p>
<blockquote>
<p>Ich bin gerade mal wieder an die Grenzen von C++ gestoßen. Das hat sich ziemlich schnell wenn man Assembler gewohnt ist.</p>
</blockquote>
<p>Was du sagen willst ist, dass du sehr schnell an deine Wissensgrenzen stoesst...</p>
<blockquote>
<p>Kann man nun void *zeiger dazu benützen nacheinander mit dem gleichen Zeiger unterschiedliche formatierungen anzusprechen, die die gleiche Länge haben?</p>
</blockquote>
<p>Klar.<br />
Aber aufs padding aufpassen.</p>
<p>Generell klingt das etwas komisch was du machen willst. magst du vielleicht erklaeren was du genau vor hast - uU gibt es sinnvollere ansaetze.</p>
<blockquote>
<p>Oder andersrum, kann man den void *zeiger in einem read( void *zeiger, int laenge ) Member benutzen zur übergabe der Startadresse auf typedevs unterschiedlicher Länge, oder ist nach dem ersten Aufruf der sozusagenden Typzuweisung und damit Definition des Zeigers schluß?</p>
</blockquote>
<p>Aeh... ein Zeiger besteht nur aus einer adresse und einem typen - mehr nicht. es koennen unendlich viele zeiger mit unendlich vielen typen auf die selbe speicherzelle zeigen...</p>
<blockquote>
<p>Das hier hilft mir herauszufinden ob es sich Loht diese Aufgabe weiterhin mit c++ zu verfolgen oder ob ein Unterprojekt mit NASM und einem Makefile die schnellere Lösung darstellt. Weiterhin benötige ich voraussichtlich sowieso NASM um die Schnelligkeit der Simulation zu gewährleisten.</p>
</blockquote>
<p>erklaer mal lieber was du genau machen willst.<br />
in der regel sind assembler implementierungen langsamer als die selbe implementierung in einer hochsprache...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654632</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 29 Jan 2009 20:21:07 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Thu, 29 Jan 2009 22:13:34 GMT]]></title><description><![CDATA[<p>Ich merke schon, das Tema wird nicht leicht, da wird man schon beleidigt.<br />
Hast ja recht &quot;Shade Of Mine&quot;; programmiere erst seit 3 Jahren in C++ und 19 Jahre in Assembler. Doch was mir bei C++ aufällt ist, daß sobald man an IO Operationen ran muss und damit auf Systemkomponenten zugreift, wird C++ sehr umständlich und langsam - dafür hat man natürlich eine ausgesprochene Kompatibilität. Und damit gleichmal zur Schnellchkeit, wo ich dich berichtigen muss und ich wohl jede Menge Rückendeckung habe: Assembler ist natürlich viel schneller und mit keiner Hochsprache zu vergleichen; dafür bleibt natürlich die Portabilität auf der Strecke.Das ist auch der Hauptgrung warum ich hier bin und dieses Problem gerne mit C++ bewältigen will. Dabei muss ich aber die Typüberprüfung (&quot;vom gleichen Typ&quot;) umgehen und muß definieren:<br />
&quot;von der gleichen Länge mit der selben Startadresse&quot; im prinzip C++ etwas Verantwortung abnehmen.</p>
<p>Alle Typen die ich so behandle sind Datensätze (z.B. 78byte lang manche auch unbestimmt und werden im zweiten Teil mit new erweitert) aus Dateien.<br />
Der Datensatz ist definiert als typedev struct, also eine Klasse.<br />
Der Datensatztyp enthält auch andere Typedev struct, hat also andere Klassenelemente.<br />
Dürfte bis dahin kein Problem sein, solange, sobald die Länge sizeof() verfügbar ist und einen zusammenhängenden bereich im Speicher einnehmen. Also die Datensätze mit new kann ich im ganzen vergessen, da muss ich zwei Teile draus machen; einen der eingelesen werden kann (der enthält auch die Anzahl für die mit new zu erstellenden Datensätze, die mit new erzeugten Datensätze haben dann wiederum einen zusammenhängend Bereich (new type[n]))</p>
<p>static_cast, da muss ich mich mal schlau machen ... dürfte aber kein Problem sein, da die Typen alle global definiert sind....</p>
<p>type-casting ...<br />
dynamic_cast &lt;new_type&gt; (expression)<br />
reinterpret_cast &lt;new_type&gt; (expression)<br />
static_cast &lt;new_type&gt; (expression)<br />
const_cast &lt;new_type&gt; (expression)</p>
<p>Ich denke mal das funktioniert mit dynamic_cast dann auch für meine Typen mit klassenelementen und Funktionen</p>
<p>Also, ich will alle Member meiner Datenbankklasse mit der Typlänge und der dazugehörigen Basisadresse füttern. Bleiben wir bei diesem Problem dann habe ich genügend Übung für das andere.</p>
<p>Lese mir dann erst noch Artikel zur Awendung dieser Funktionen durch - also ich bin dann mal am studieren. (dann kann ich auch mitreden)</p>
<p>Bin mal kurz schlafen, bis gleich</p>
<p>bastl</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654681</guid><dc:creator><![CDATA[bastl]]></dc:creator><pubDate>Thu, 29 Jan 2009 22:13:34 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Thu, 29 Jan 2009 22:41:29 GMT]]></title><description><![CDATA[<p>bastl schrieb:</p>
<blockquote>
<p>Ich merke schon, das Tema wird nicht leicht, da wird man schon beleidigt.</p>
</blockquote>
<p>Davon sehe ich hier nichts, falls du das mit den Wissensgrenzen meinst, so scheint dies zumindestens bezüglich C++ tatsächlich zu stimmen - dies ist aber keine Beleidigung, sondern das was man aus deinen Beschreibungen ablesen kann. Dies kann unter anderem an deiner langen Assemblerlaufbahn liegen, da man C++ eigentlich auf eine gänzlich andere Art benutzt als Assembler (Andere Ansätze, andere Paradigmen).</p>
<p>bastl schrieb:</p>
<blockquote>
<p>Doch was mir bei C++ aufällt ist, daß sobald man an IO Operationen ran muss und damit auf Systemkomponenten zugreift, wird C++ sehr umständlich und langsam - dafür hat man natürlich eine ausgesprochene Kompatibilität.</p>
</blockquote>
<p>Ich habe persönlich nur wenig Assemblererfahrungen, aber wenn die IO-Umsetzung der Standardbibliothek nicht gepuffert ist etc. kann diese auch langsam sein (z.B. sind die Streams unter Microsoft Visual C++ tendenziell langsam, wenn man ihnen keinen Buffer zuweist).</p>
<p>Zudem ist alles was ich inzwischen gehört habe, das C++ sich nicht wirklich hinter Assembler verstecken muss, und spätestens bei großen Anwendungen ist mit Sicherheit die Entwicklungszeit noch ein sehr wichtiges Argument. Je nach dem wie man C++ einsetzt kann es sehr langsam sein, aber ebenso kann man sehr schnelle Programme schreiben.</p>
<p>bastl schrieb:</p>
<blockquote>
<p>...Der Datensatz ist definiert als typedev struct, also eine Klasse... new type[n]... alle global definiert...</p>
</blockquote>
<p>Dies sind Dinge die schon darauf hinweisen, das du eher C als C++ entwickelst (unter C++ ist die schreibweise &quot;typedef struct&quot; mehr als unüblich, dies ist eher ein typisches C-Relikt; C-Arrays sind - wie der Name schon sagt auch eher in C als in C++ zu finden). Auch deine Typbeschreibung deutet eher von einer Assemblersichtweise hin. Dies mag auch dazu führen das du dein Problem in einer weise schilderst die für mich aus der C++ Sicht eher schwer verständlich ist.</p>
<p>Vielleicht löst du dich etwas von deiner stark technischen Beschreibung, und erklärst deine Problematik mal ohne Nennung von irgendwelchen Implementationsdetails (Außer vielleicht bezogen auf die Eingangsgrößen und Ausgangsgrößen).</p>
<p>dynamic_cast ist übrigens für polymorphe Objekte (Umwandlung von einen Zeiger einer Basisklasse in einen Zeiger einer abgeleiteten, polymorphen [Thema virtuelle Funktionen] Klasse), nicht für normale Typumwandlungen.</p>
<p>Zudem, mag sein das ich das auch aus deinem Text falsch ablese, solltest du dir bezüglich new/new[] nochmal Gedanken machen. Mit new erzeugte Einzelobjekte und ein mit new Erzeuges Array sind unterschiedliche Dinge...</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654714</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 29 Jan 2009 22:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Fri, 30 Jan 2009 11:35:19 GMT]]></title><description><![CDATA[<p>bastl schrieb:</p>
<blockquote>
<p>Doch was mir bei C++ aufällt ist, daß sobald man an IO Operationen ran muss und damit auf Systemkomponenten zugreift, wird C++ sehr umständlich und langsam - dafür hat man natürlich eine ausgesprochene Kompatibilität.</p>
</blockquote>
<p>Wenn du mit IO die IOStreams meinst - die sind für komfort optimiert, du kannst jederzeit aber ein CreateFile/WriteFile machen wie du es in Assembler auch machen würdest...</p>
<blockquote>
<p>Und damit gleichmal zur Schnellchkeit, wo ich dich berichtigen muss und ich wohl jede Menge Rückendeckung habe: Assembler ist natürlich viel schneller und mit keiner Hochsprache zu vergleichen;</p>
</blockquote>
<p>Ich wage es zu bezweifeln dass man komplexe programme in assembler effizienter programmieren kann als in einer hochsprache wie C++. Kleine Stellen in Algorithmen ja, aber generell nein.</p>
<blockquote>
<p>Ich denke mal das funktioniert mit dynamic_cast dann auch für meine Typen mit klassenelementen und Funktionen</p>
</blockquote>
<p>Äh... Nein.<br />
Erkläre bitte was du machen willst - nicht welche C++ Mittel du einsetzen willst.</p>
<p>Willst du rohen Speicher als Objekte unterschiedlicher Typen betrachten?<br />
Warum?</p>
<p>Oder willst du einfach ein abstraktes Typsystem haben, im Sinne von: die Funktion foo() liefert einen Wert den man als integer, double, string oder sonstwas interpretieren kann? Ähnlich wie einer ScriptSprache mit DuckTyping?</p>
<p>Oder willst du soetwas wie bei einer Datenbank API üblich: du machst &quot;select foo from bar&quot; und je nachdem welchen Typ foo hat soll dementsprechend ein passendes objekt zurück gegeben werden? uU kann man foo als integer und als string betrachten und das willst du im client dann durchweselbar machen?</p>
<p>uU suchst du auch einfach nur &quot;union&quot; oder variant/any.</p>
<p>deshalb: erkläre _was_ du machen willst und _warum_ und nicht _wie_. Denn das _wie_ sagen wir dir dann...</p>
<p>PS:<br />
und beleidigen will ich dich sicher nicht, aber dein C++ Wissen scheint mir nunmal nicht wirklich umfassend zu sein. Ist ja keine Beleidigung, einfach nur eine feststellung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654913</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 30 Jan 2009 11:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Fri, 30 Jan 2009 11:50:17 GMT]]></title><description><![CDATA[<p>So wie ich das verstanden habe, hat er Typen, welche u.a. Zeiger auf andere Typen enthalten. Den Zeigern kann dann bei Bedarf allokierter Speicher (auf die anderen Typen) zugeordnet werden. Nun meint er, dass dabei die Speichebereiche nicht zusammenhängend sein können.<br />
Das können sie aber. Das geht mit <code>placement new</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654928</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Jan 2009 11:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Fri, 30 Jan 2009 11:56:38 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>So wie ich das verstanden habe, hat er Typen, welche u.a. Zeiger auf andere Typen enthalten. Den Zeigern kann dann bei Bedarf allokierter Speicher (auf die anderen Typen) zugeordnet werden. Nun meint er, dass dabei die Speichebereiche nicht zusammenhängend sein können.<br />
Das können sie aber. Das geht mit <code>placement new</code> .</p>
</blockquote>
<p>O_o</p>
<p>das habe ich nichtmal annäherend herausgelesen. ich denke eher dass er richtung ducktyping will... aber ok - da muss er wohl näher erklären was er will...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654935</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 30 Jan 2009 11:56:38 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Fri, 30 Jan 2009 12:02:16 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>das habe ich nichtmal annäherend herausgelesen. ich denke eher dass er richtung ducktyping will... aber ok - da muss er wohl näher erklären was er will...</p>
</blockquote>
<p>Okay, wenn's das wirklich sein sollte, dann wäre Assembler so ziemlich das Letzte, womit ich das implementieren wollte. Ich wäre da nichtmal auf die Idee gekommen, das im gleichen Atemzug zu erwähnen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Wenn ich mir den Eröffnungspost nochmal durchlese, hast Du vermutlich sogar recht. Ich habe mir meine Vermutung irgendwie aus der Antwort auf Deinen Vorschlag zusammengereimt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654937</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Jan 2009 12:02:16 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Fri, 30 Jan 2009 12:03:42 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Wenn ich mir den Eröffnungspost nochmal durchlese, hast Du vermutlich sogar recht. Ich habe mir meine Vermutung irgendwie aus der Antwort auf Deinen Vorschlag zusammengereimt.</p>
</blockquote>
<p>Ja das mit dem new hab ich nichtmal ansatzweise kapiert was er will <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654940</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 30 Jan 2009 12:03:42 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Fri, 30 Jan 2009 20:08:26 GMT]]></title><description><![CDATA[<p>Der gewünschte Benutzerna schrieb:</p>
<blockquote>
<p>Kann man nun void *zeiger dazu benützen nacheinander mit dem gleichen Zeiger unterschiedliche formatierungen anzusprechen, die die gleiche Länge haben?</p>
</blockquote>
<p>Ohje, das ist totaler Nonsense. Man kann das technisch zwar machen, aber das ganze ist nicht mehr portabel, da hier solche Dinge wie Padding, Aligment, Byte Order etc. zum Tragen kommen. Wenn man Assembler programmiert, kann man das so machen, da der Code ohnehin nicht portabel ist, sobald man aber mit C++ anfängt muß man davon die Finger lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655207</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Fri, 30 Jan 2009 20:08:26 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Fri, 30 Jan 2009 20:23:49 GMT]]></title><description><![CDATA[<p>Mich würde mal interessieren, was überhaupt mit dem Wort &quot;Formatierung&quot; in diesem Zusammenhang gemeint ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655216</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 30 Jan 2009 20:23:49 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Fri, 30 Jan 2009 22:55:54 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>Ohje, das ist totaler Nonsense. Man kann das technisch zwar machen, aber das ganze ist nicht mehr portabel, da hier solche Dinge wie Padding, Aligment, Byte Order etc. zum Tragen kommen. Wenn man Assembler programmiert, kann man das so machen, da der Code ohnehin nicht portabel ist, sobald man aber mit C++ anfängt muß man davon die Finger lassen.</p>
</blockquote>
<p>Das ist ebenfalls Nonsense. Nicht jedes C++ Programm ist dafür gedacht, portabel zu sein. Manchmal will man auch einfach nur schnell zu einer effizienten, günstigen Lösung kommen. Portabel sind C++-Programme schon dann nicht mehr, wenn sie plattformspezifische Bibliotheken benutzen, und das machen eine Menge Programme...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655264</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Jan 2009 22:55:54 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 00:44:26 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Dies sind Dinge die schon darauf hinweisen, das du eher C als C++ entwickelst (unter C++ ist die schreibweise &quot;typedef struct&quot; mehr als unüblich, dies ist eher ein typisches C-Relikt; C-Arrays sind - wie der Name schon sagt auch eher in C als in C++ zu finden). Auch deine Typbeschreibung deutet eher von einer Assemblersichtweise hin.</p>
</blockquote>
<p>Also asc Ich hätte dann auch schon gerne, daß du die C Thematik dann auch für C++ angibst (wie man es in C++ richtig macht).<br />
Ich benötige einen Typnamen (z.B. für new), jedoch keinen Klassennamen außer für meine dynamische Typen. Wenn gcc es halt nicht anders akzeptiert musst du mir einen Vorschlag machen - ich probiere das gerne aus.</p>
<p>-----<br />
Zu dir Shade Of Mine, das unterschiedliche formatieren eines Speicherbereiches lassen wir mal beiseite, wird sonst zu kompliziert hier auf zwei Probleme einzugehen. Das eigentliche Problem ist also die Datenbankklasse mit den normalen Members, die man so braucht, read, write, und und das einstreamen unterschiedlicher Typen (Längen von 10 Byte bis 10 MB pro Typ).<br />
Ich kann jetzt für jede Datenbank eine eigene Klasse schreiben (ca. 50 Stück) oder eine Klasse für alle Datenbanken. Daraus ergibt sich die Problematik der unterschiedlichen Typen. Das hat dazu gefhürt die Möglichkeit hier zu erörtern, ob dies ohne gröpßeren Aufwand möglich ist. Eine und für mich die plausibelste Mölichkeit ist, den Basiszeiger eines zusammenhängenden Speicherbereiches zu übergeben und die dazugehöige Länge, ist ja oben schon beschrieben. Manche Typen müssen mehrfach in Stücken eingelesen werden, da diese Datenbanken aus dynamischen Datensätzen bestehen.Wir können hier nur abstrakt erörtern, das muss ich auch beim programieren so machen.</p>
<p>Und ich muss hier auch sagen, daß man C++ nicht programieren kann ohne zu wissen wie der Kompiler funktioniert. Man muss genau wissen wie werden Daten im Speicher abgelegt, was macht new und wie verhält sich was wenn man es so programmiert; da kommt mir meine Assembler Erfahrung teilweise schon zugute.</p>
<p>Und was Assembler angeht muss ich hier auch noch was loßwerden, Ich programiere mit Assembler jetzt schon seit ca 15 Jahren Opjekt Orientiert und solche Sachen wie X11 oder QT sind nichts besonderes in Assembler und durchaus einfacher zu programieren als mit C++. Sowas wie X11 und QT in Einem habe ich schon in Assembler programmiert - das waren noch Zeiten unter DOS ...<br />
------</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>So wie ich das verstanden habe, hat er Typen, welche u.a. Zeiger auf andere Typen enthalten. Den Zeigern kann dann bei Bedarf allokierter Speicher (auf die anderen Typen) zugeordnet werden.</p>
</blockquote>
<p>Keine Zeiger, aber der Datensatz ermöglicht es mit seiner enthaltenen Info ihn zu vervollständigen (man kann mit dem ersten Teil den noch fehlenden Teil ausrechnen). Jetzt ist es so, daß mich zwei nicht zusammenhängende Blöcke aber nicht stören, da diese Typen sowieso dynamisch sind und auf zweimal eingelesen werden müssen. Was placement angeht - ja, deshalp wird ein ARRAY von Typen mit new erzeugt - dann ist es automatisch zusammenhägnend.(mit new erzeugte arrays und strings sind immer zusammenhängend)</p>
<p>2.) Mit Assembler kann ich halt den kompletten dynamischen Datensatz auf einmal einlesen und c++ die nötige Info dazu liefern (Laufzeitimplementierung).</p>
<p>ducktyping betrift die Umformatierung was ich vorerst hier mal weglassen will.<br />
------</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Ja das mit dem new hab ich nichtmal ansatzweise kapiert was er will <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
</blockquote>
<p>Was braucht ihr da für Info? - Wenn es in diesem Block nicht stehen sollte.</p>
<p>Wie sieht es nun mit void *zeiger aus? Ist der Geltungsbereich dann nur innerhalb der Funktion, in der ich diesen void *zeiger benutze? Oder überträgt sich das auf die nächsten Aufrufe? Jeder Aufruf der Funktion ist ja mit einem Zeiger auf einen Typ, der eine Länge hat, die sich von der des vorherigen Aufrufs unterscheidet. Ich vermute mal, daß der Geltungspereich die Funktion ist und somit void *auf_gleiche_laenge nur innerhalb der Funktion gilt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655274</guid><dc:creator><![CDATA[bastl]]></dc:creator><pubDate>Sat, 31 Jan 2009 00:44:26 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 01:10:40 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Mich würde mal interessieren, was überhaupt mit dem Wort &quot;Formatierung&quot; in diesem Zusammenhang gemeint ist.</p>
</blockquote>
<p>Ich denke schon, daß dies ein kompakter Ausdruck ist, der angemessen ist.<br />
- Wenn 2 Typen gleicher Länge (z.B Typ1 mit 8 chars und Typ2 mit 2 ints) die gleiche Basisadresse haben. Der Seicherbereich ab Basisadresse hat somit 2 unterschiedliche ansprechbare Formate oder anders ausgedrückt: ein Typ formatiert lediglich einen Abschnit im Speicher ab Basisadresse. Speicher ist Speicher und besteht aus Bits erst eine Formatierung sagt mir wie ich einen Speicherbereich benützen soll, muss, darf - so will es C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655278</guid><dc:creator><![CDATA[bastl]]></dc:creator><pubDate>Sat, 31 Jan 2009 01:10:40 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 02:27:27 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>Ohje, das ist totaler Nonsense. Man kann das technisch zwar machen, aber das ganze ist nicht mehr portabel, da hier solche Dinge wie Padding, Aligment, Byte Order etc. zum Tragen kommen. Wenn man Assembler programmiert, kann man das so machen, da der Code ohnehin nicht portabel ist, sobald man aber mit C++ anfängt muß man davon die Finger lassen.</p>
</blockquote>
<p>Da hast du absolut Recht, jetzt muss ich abwegen ....</p>
<p>IA64 - O.K. davon gehe ich aus.<br />
Apple hat jetzt IA86 - O.K.<br />
Sparc - Nein, das ist nicht gut<br />
S390 - Nein, garnicht gut</p>
<p>In 2 Jahren hab ich vielleicht die erste Version dann gibt es vieleicht schon einen IA64 64 core dann läuft das Programm auch ordentlich.<br />
O.K. ich verzichte auf Portabilität.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655287</guid><dc:creator><![CDATA[bastl]]></dc:creator><pubDate>Sat, 31 Jan 2009 02:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 07:27:21 GMT]]></title><description><![CDATA[<p>bastl schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>Dies sind Dinge die schon darauf hinweisen, das du eher C als C++ entwickelst (unter C++ ist die schreibweise &quot;typedef struct&quot; mehr als unüblich, dies ist eher ein typisches C-Relikt; C-Arrays sind - wie der Name schon sagt auch eher in C als in C++ zu finden). Auch deine Typbeschreibung deutet eher von einer Assemblersichtweise hin.</p>
</blockquote>
<p>Also asc Ich hätte dann auch schon gerne, daß du die C Thematik dann auch für C++ angibst (wie man es in C++ richtig macht).</p>
</blockquote>
<p>1. typedef struct ist redundant. Jede struct, class, enum, union ist bereits eine Typdefinition. Das typedef lässt man daher weg. Nachfolgender Code definiert einen Typ xtyp:</p>
<pre><code class="language-cpp">struct xtyp { int x; };
</code></pre>
<p>bastl schrieb:</p>
<blockquote>
<p>Ich benötige einen Typnamen (z.B. für new), jedoch keinen Klassennamen außer für meine dynamische Typen</p>
</blockquote>
<p>Keine Ahnung was du damit meinst (Ein Klassenname IST ein Typenname).</p>
<p>2. Unter C++ verwendet man C-Array eher selten, da es weder sinnvoll Kopiert etc. Statt dessen sind eigentlich die Containerklassen der Standardbibliothek in Verwendung (std::vector, std::list, std::map, std::tr1::array...).</p>
<p>3. void* ist nicht für delete geeignet. delete benötigt Typinformationen, die erhält es durch ein void* nicht. Wenn du unbedingt mit rohen Speicher hantieren willst, würde ich eher ein char* oder std::vector&lt;char&gt; nehmen, dann kannst du es wenigstens byteweise interpretieren.</p>
<p>Ebenso kann man void* nur benutzen wenn man weiß wie man die Daten zu interpretieren hat.</p>
<p>C++ arbeitet nun einmal mit einem statischen Typsystem.</p>
<p>bastl schrieb:</p>
<blockquote>
<p>Und ich muss hier auch sagen, daß man C++ nicht programieren kann ohne zu wissen wie der Kompiler funktioniert. Man muss genau wissen wie werden Daten im Speicher abgelegt, was macht new und wie verhält sich was wenn man es so programmiert</p>
</blockquote>
<p>Das ist absoluter Nonsense, es sei vielleicht, man will alles auf binärer Ebene bearbeiten, was eigentlich in C++ nicht üblich ist - Dann sollte man gleich in Assembler weiterarbeiten.</p>
<p>Eine Programmiersprache ist ein Werkzeug um eine Aufgabe zu erledigen. Das man ungefähre Vorstellung hat, wie etwas realisiert werden könnte kann manchmal hilfreich, nicht selten aber auch die sprichwörtlichen Scheuklappen sein. Um ein Ziel zu erreichen sollte es - zumindestens in einer Hochsprache - vollkommen egal sein was der Compiler im Hintergrund daraus macht.</p>
<p>bastl schrieb:</p>
<blockquote>
<p>Was placement angeht - ja, deshalp wird ein ARRAY von Typen mit new erzeugt - dann ist es automatisch zusammenhägnend.(mit new erzeugte arrays und strings sind immer zusammenhängend)</p>
</blockquote>
<p>Das ist auch beim std::vector oder std::tr1::array definiert.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655304</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sat, 31 Jan 2009 07:27:21 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 09:00:38 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Das ist ebenfalls Nonsense. Nicht jedes C++ Programm ist dafür gedacht, portabel zu sein. Manchmal will man auch einfach nur schnell zu einer effizienten, günstigen Lösung kommen. Portabel sind C++-Programme schon dann nicht mehr, wenn sie plattformspezifische Bibliotheken benutzen, und das machen eine Menge Programme...</p>
</blockquote>
<p>Das ist totaler Quatsch! (Wohl bisher nur unter Windows gearbeitet?) UNIX Programme verwenden seit Jahrzehnten spezielle UNIX Libraries und laufen trotzdem auf sehr vielen verschiedenen Prozessorachitekturen.</p>
<p>Wenn man unter UNIX, Linux oder Windows entwickelt, dann gibt es mehr als eine Prozessorarchitektur! Bei Windows gibt es IA32, IA32-64, IA64 bei den anderen Plattformen kommen noch Power, HP-PA, SPARC, ARM, MIPS etc. dazu. Wenn man da ohne Not von einer spezifischen Anordnung der Daten ausgeht, baut man einfach nur Mist. Zum Beispiel sollen Daten ja auch unabhängig vom 32Bit oder 64Bit Modus eingelesen werden können, und es gibt Betriebssysteme die laufen nicht nur auf einer Hardwarearchitektur. Wenn man nicht gerade an Computerspielen oder ähnlich zeitkritischen Programmen arbeitet sollte man die Finger von Mikrooptimierungen lassen, denn in der Regel lebt der Code länger als einem beim Entwerfen bewußt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655322</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sat, 31 Jan 2009 09:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 09:24:40 GMT]]></title><description><![CDATA[<p>bastl schrieb:</p>
<blockquote>
<p>IA64 - O.K. davon gehe ich aus.<br />
Apple hat jetzt IA86 - O.K.<br />
Sparc - Nein, das ist nicht gut<br />
S390 - Nein, garnicht gut</p>
<p>In 2 Jahren hab ich vielleicht die erste Version dann gibt es vieleicht schon einen IA64 64 core dann läuft das Programm auch ordentlich.<br />
O.K. ich verzichte auf Portabilität.</p>
</blockquote>
<p>1. Du meinst IA32-64. IA64 wäre der Itanium! Windows läuft auf IA64.<br />
2. Es ist auch über verschiedene Compilerversionen nicht portabel!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655336</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sat, 31 Jan 2009 09:24:40 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 09:25:14 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>Das ist totaler Quatsch! (Wohl bisher nur unter Windows gearbeitet?) UNIX Programme verwenden seit Jahrzehnten spezielle UNIX Libraries und laufen trotzdem auf sehr vielen verschiedenen Prozessorachitekturen.</p>
</blockquote>
<p>Es gibt Ausnahmen, die Regel (zumindestens in der Anwendungsentwicklung in kommerziell orientierten Projekten), ist es möglichst schnell eine Lösung zu präsentieren. Und dazu greifen viele Firmen auf OS-Spezifische Bibliotheken zu.</p>
<p>Man kann C++ auch sehr portabel schreiben (das es unter vielen Betriebssystemen wieder gelinkt werden kann), aber das erlebe ich eigentlich eher selten. Auch wenn ich selbst ein Fan davon bin in Anwendungen zumindestens die Schichten zwischen UI auf der einen, und Datenzugriff auf der anderen Seite weitgehend portabel zu halten.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655337</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sat, 31 Jan 2009 09:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 09:32:03 GMT]]></title><description><![CDATA[<p>bastl schrieb:</p>
<blockquote>
<p>Ich benötige einen Typnamen (z.B. für new), jedoch keinen Klassennamen außer für meine dynamische Typen.</p>
</blockquote>
<p>&quot;struct&quot; und &quot;class&quot; sind in C++ fast dasselbe. Es sind auch Typen, aber es gibt weitere Arten von Typen.</p>
<p>bastl schrieb:</p>
<blockquote>
<p>Zu dir Shade Of Mine, das unterschiedliche formatieren eines Speicherbereiches lassen wir mal beiseite, wird sonst zu kompliziert hier auf zwei Probleme einzugehen. Das eigentliche Problem ist also die Datenbankklasse mit den normalen Members, die man so braucht, read, write, und und das einstreamen unterschiedlicher Typen (Längen von 10 Byte bis 10 MB pro Typ).</p>
</blockquote>
<p><strong>Was</strong> willst Du machen? Objektgraphen (de)serialisieren oder RDBMS Abfragen auf ein RDBMS loslassen? Davon hängt maßgeblich ab, wie man es umsetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655339</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sat, 31 Jan 2009 09:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 13:06:53 GMT]]></title><description><![CDATA[<p>bastl schrieb:</p>
<blockquote>
<p>Ich benötige einen Typnamen (z.B. für new), jedoch keinen Klassennamen außer für meine dynamische Typen. Wenn gcc es halt nicht anders akzeptiert musst du mir einen Vorschlag machen - ich probiere das gerne aus.</p>
</blockquote>
<p>Ich glaube ich habe verstanden was du machen willst.<br />
Aber eine schoene Erklaerung waere nicht schlecht - da muss man nicht soviel raten.</p>
<p>Du kannst rohen Speicher besorgen:</p>
<pre><code class="language-cpp">void* p = ::operator new(100);
</code></pre>
<p>das besorgt die 100 byte Speicher.</p>
<p>Nun kannst du wenn du zB eine struct Foo oder Bar hast:</p>
<pre><code class="language-cpp">struct Foo { int i[5]; }
struct Bar { double d[5]; }
</code></pre>
<p>Theoretisch ein:</p>
<pre><code class="language-cpp">Foo* f = static_cast&lt;Foo*&gt;(p);
Bar* b = static_cast&lt;Bar*&gt;(p);
</code></pre>
<p>machen - oder aber mit einer Union arbeiten.</p>
<p>Aber das ist mit sehr grosser Wahrscheinlichkeit genau das falsche vorgehen...</p>
<blockquote>
<p>Das eigentliche Problem ist also die Datenbankklasse mit den normalen Members, die man so braucht, read, write, und und das einstreamen unterschiedlicher Typen (Längen von 10 Byte bis 10 MB pro Typ).<br />
Ich kann jetzt für jede Datenbank eine eigene Klasse schreiben (ca. 50 Stück) oder eine Klasse für alle Datenbanken.</p>
</blockquote>
<p>Meinst du wirklich 50 unterschiedliche Datenbanken? Oder meinst du 50 unterschiedliche typen?</p>
<p>Jedenfalls:<br />
Wenn du Datenbanken meinst - da verwendet man ein vereinheitlichtes interface (zB ODBC, ADO,...) um auf sie zuzugreifen und muss nur gegebenenfalls leicht adaptieren.<br />
Wenn du Typen meinst: ja, dann musst du 50+ Klassen schreiben, wobei die meisten klassen sehr sehr sehr klein sein werden.</p>
<blockquote>
<p>Daraus ergibt sich die Problematik der unterschiedlichen Typen. Das hat dazu gefhürt die Möglichkeit hier zu erörtern, ob dies ohne gröpßeren Aufwand möglich ist. Eine und für mich die plausibelste Mölichkeit ist, den Basiszeiger eines zusammenhängenden Speicherbereiches zu übergeben und die dazugehöige Länge, ist ja oben schon beschrieben. Manche Typen müssen mehrfach in Stücken eingelesen werden, da diese Datenbanken aus dynamischen Datensätzen bestehen.Wir können hier nur abstrakt erörtern, das muss ich auch beim programieren so machen.</p>
</blockquote>
<p>Nein - nicht sagen wie du es machen willst. Einfach erklaeren _was_ du machen willst. Und zwar mit der richtigen terminologie.</p>
<blockquote>
<p>Und was Assembler angeht muss ich hier auch noch was loßwerden, Ich programiere mit Assembler jetzt schon seit ca 15 Jahren Opjekt Orientiert und solche Sachen wie X11 oder QT sind nichts besonderes in Assembler und durchaus einfacher zu programieren als mit C++. Sowas wie X11 und QT in Einem habe ich schon in Assembler programmiert - das waren noch Zeiten unter DOS ...</p>
</blockquote>
<p>Und dennoch bist du unfaehig ein Problem zu _beschreiben_?</p>
<blockquote>
<p>2.) Mit Assembler kann ich halt den kompletten dynamischen Datensatz auf einmal einlesen und c++ die nötige Info dazu liefern (Laufzeitimplementierung).</p>
</blockquote>
<p>Du kannst in C++ sehr wohl nur rohe daten anfassen...</p>
<blockquote>
<p>Was braucht ihr da für Info? - Wenn es in diesem Block nicht stehen sollte.</p>
</blockquote>
<p>Eine korrekte terminologie brauche ich und keine erklaerung was du mit basisklassenzeiger machen willst oder sonstwas. ein _was_ du machen willst brauche ich, kein _wie_.</p>
<p>Erklaer die Aufgabenstellung einfach mal so, wie du sie einem Schueler stellen wuerdest. zB:</p>
<p><em>Wir haben ein Datenbank System entwickelt. Nun brauchen wir eine Moeglichkeit Daten unterschiedlicher Typen hinein zuschreiben und wieder auszulesen. Das Problem dabei ist nun, dass der Client Code nicht weiss welchen Typ ein Datensatz hat. Wir brauchen daher ein vereinheitlichtes system um auf 50 verschiedene typen ueber das selbe interface zugreifen zu koennen.</em></p>
<p>So in der Art bitte.</p>
<blockquote>
<p>Wie sieht es nun mit void *zeiger aus? Ist der Geltungsbereich dann nur innerhalb der Funktion, in der ich diesen void *zeiger benutze?</p>
</blockquote>
<p>Aeh... Das sind eigentlich Grundlagen - programmierst du wirklich schon 3 jahre lang in C++?<br />
Naja, jedenfalls: eine variable (ein zeiger ist auch nur eine variable) ist in ihrer gueltigkeit durch ihren <a href="http://tutorial.schornboeck.net/scope.htm" rel="nofollow">Scope</a> beschraenkt. Der Speicher auf den ein Zeiger zeigt unterliegt ebenfalls einem Scope: speicher am Stack wird geloescht wenn die stack-variable out of scope geht. Speicher der am Free Store liegt, bleibt solange bestehen bis er explizit geloescht wird (delete).</p>
<blockquote>
<p>Oder überträgt sich das auf die nächsten Aufrufe? Jeder Aufruf der Funktion ist ja mit einem Zeiger auf einen Typ, der eine Länge hat, die sich von der des vorherigen Aufrufs unterscheidet. Ich vermute mal, daß der Geltungspereich die Funktion ist und somit void *auf_gleiche_laenge nur innerhalb der Funktion gilt.</p>
</blockquote>
<p>Das ergibt fuer mich keinen Sinn.<br />
sizeof(void*) und sizeof(T*) sind uebrigens gleich gross...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655470</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sat, 31 Jan 2009 13:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 15:18:24 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>...sabber...</p>
</blockquote>
<p>Es gibt noch andere Dinge als Unix und Windows. DSPs z.B., oder Mikrocontroller. Oder die gute alten VAX und deren Nachfolger. Irgendwie habe ich da so meine Probleme die der Portabilität, wenn ich Unix-Libraries benutze. Keine Ahnung, woher das kommt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Und Mist baut man nicht, wenn man von einer spezifischen Anordnung der Daten ausgeht (dann ist man sich nämlich der Probelematik bewusst), sondern wenn man sie außer Acht lässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655557</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 31 Jan 2009 15:18:24 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sat, 31 Jan 2009 23:23:12 GMT]]></title><description><![CDATA[<p>Ich kann dier ja mal meine Projektseite geben, dannn muss ich hier nicht so viel erklären und du hast vielleicht auch eine bessere Vorstellung der Problematik. Also es geht um die Datenbanken und es sind ca.50 unterschiedliche Typen nötig um diese Datensätze zu verarbeiten (geschätzt), die Datenbankenstructur wurde gerade komplet überarbeitet - also die veröffentlichte Struktur (Download .pdf) ist veralted! Aber das Prinzip ist ziemlich gleich geblieben.</p>
<p><a href="http://keda.berlios.de/" rel="nofollow">http://keda.berlios.de/</a></p>
<p>Wie du siehst können keine vorgefertigten Datenbanken eingesetzt werden. Ich muss diese Datenbankklasse von Grund auf selbst schreiben!</p>
<p>Wie kann ich das mit viod* noch genauer erkären ... O.K. 3. Anlauf</p>
<pre><code class="language-cpp">void PartBase::read( void *unterschiedlich_lange_typen , int laenge )
   {
   Einlesen von laenge Bytes, bei Bedarf mehrmals(- warscheinlich eher nicht) auf die Basisadresse *unterschiedlich_lange_typen. 
   }
</code></pre>
<p>Jetzt müsste doch klar sein um awas es geht?<br />
Funktioniert das? Nach meiner Rechersche - Ja.<br />
Ich will halt nicht Tausende Zeilen schreiben und dann beim Probelauf auf eine Datenbank feststellen, daß das irgendwo nicht funktioniert.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p><em>Wir haben ein Datenbank System entwickelt. Nun brauchen wir eine Moeglichkeit Daten unterschiedlicher Typen hinein zuschreiben und wieder auszulesen. Das Problem dabei ist nun, dass der Client Code nicht weiss welchen Typ ein Datensatz hat. Wir brauchen daher ein vereinheitlichtes system um auf 50 verschiedene typen ueber das selbe interface zugreifen zu koennen.</em></p>
</blockquote>
<p>Irgendwie ist dann doch die Problematik sehr gut durchgedrungen.<br />
Ich kann dein Beisbiel voll und ganz so stehen lassen! Daß jedoch niemand auf die Idee kommt einfache Datensätze anzunehmen wo standard Datenbanken Anwendung fänden, müsste man noch auf die dynamischen Datensätze hinweisen.</p>
<p>asc schrieb:</p>
<blockquote>
<p>1. typedef struct ist redundant. Jede struct, class, enum, union ist bereits eine Typdefinition. Das typedef lässt man daher weg. Nachfolgender Code definiert einen Typ xtyp:</p>
<pre><code class="language-cpp">struct xtyp { int x; };
</code></pre>
</blockquote>
<p>Dank dir! Jetzt fällt es mir auch auf, daß es Unsinn ist das typedef anzugeben. Und alles passt wieder perfekt zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655748</guid><dc:creator><![CDATA[bastl]]></dc:creator><pubDate>Sat, 31 Jan 2009 23:23:12 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sun, 01 Feb 2009 09:25:48 GMT]]></title><description><![CDATA[<p>bastl schrieb:</p>
<blockquote>
<p>Und was Assembler angeht muss ich hier auch noch was loßwerden, Ich programiere mit Assembler jetzt schon seit ca 15 Jahren Opjekt Orientiert und solche Sachen wie X11 oder QT sind nichts besonderes in Assembler und durchaus einfacher zu programieren als mit C++. Sowas wie X11 und QT in Einem habe ich schon in Assembler programmiert - das waren noch Zeiten unter DOS.</p>
</blockquote>
<p>Hmm, naja, ich wollte das zwar eigentlich nicht bewerten, aber die Aussage ist so haarsträubend, dass ich jetzt doch mal mache:<br />
Also Qt z.B. ist eine Sache bei der alleine die Grundentwicklung schon 7 Jahre gedauert hat. In einem Team mit vielen Leuten in C++. Jede Zeile C++-Code produziert dabei eine ganze Menge Zeilen in Assembler.<br />
Nun sagst Du, dass Du noch zu DOS-Zeiten so was in Assembler gemacht hast. Du machst das seit 15 Jahren. 1994 hast Du also damit angefangen und konntest das ganze vermutlich noch nicht auf einem ausreichend hohen Niveau um so was wie X11 oder Qt umzusetzen.<br />
Sagen wir also, Du hast zwei Jahre benötigt, um einen MPP-Assembler (z.B. x86 oder PPC) ausreichend perfekt zu lernen, um hochdynamische, komplexe Programme und Bibliotheken wie X11 und Qt damit zu entwickeln (wobei 2 Jahre schon <em>extrem</em> optimistisch sind).<br />
Danach hast Du dann also noch zu DOS-Zeiten was Vergleichbares entwickelt. 1998 war DOS schon so ziemlich in den letzten Zuckungen (eher früher), und Du hast in zwei Jahren alleine (klingt zumindest so) was hochgezogen, wozu andere in einer Hochsprache im Team alleine 7 benötigt haben, um eine releasefähige Version zu produzieren?<br />
Alle Achtung. Du bist der Batman der Informatik... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655794</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sun, 01 Feb 2009 09:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Typlose Zeiger in C++ on Sun, 01 Feb 2009 11:41:16 GMT]]></title><description><![CDATA[<p>bastl schrieb:</p>
<blockquote>
<p>Ich kann dier ja mal meine Projektseite geben, dannn muss ich hier nicht so viel erklären und du hast vielleicht auch eine bessere Vorstellung der Problematik. Also es geht um die Datenbanken und es sind ca.50 unterschiedliche Typen nötig um diese Datensätze zu verarbeiten (geschätzt), die Datenbankenstructur wurde gerade komplet überarbeitet - also die veröffentlichte Struktur (Download .pdf) ist veralted! Aber das Prinzip ist ziemlich gleich geblieben.</p>
<p><a href="http://keda.berlios.de/" rel="nofollow">http://keda.berlios.de/</a></p>
<p>Wie du siehst können keine vorgefertigten Datenbanken eingesetzt werden. Ich muss diese Datenbankklasse von Grund auf selbst schreiben!</p>
</blockquote>
<p>Ich habe dich ja schonmal gefragt ob du ein Typsystem brauchst wo ein Query eben unterschiedliche Typen liefern kann und der Client Code den typ vorher nicht kennt.</p>
<p>Ist eine triviale Sache. Wie das geht habe ich sogar schon erklaert.<br />
Du hast eine Basisklasse &quot;Typ&quot; oder so aehnlich und davon erben alle anderen Typen. Die meisten Typen-Klassen sind dabei sehr klein und nur sehr wenige haben wirklich komplexitaet drinnen. Uber laufzeit polymorphie kannst du dann den echten Typen bestimmen.</p>
<p>Oder aber du gehst den Weg den die meisten Datenbanken gehen und bietest mehrere Methoden an um an die Daten zu kommen. Wenn du ein select foo from bar machst, dann machst du nachher zB ein result.get&lt;int&gt;(&quot;foo&quot;) bzw. result.get&lt;string&gt;(&quot;foo&quot;). Dann hast du keine laufzeit polymorphie und sparst dir vermutlich 70% der klassen...</p>
<blockquote>
<p>Wie kann ich das mit viod* noch genauer erkären ... O.K. 3. Anlauf</p>
</blockquote>
<p>Und ich habe dir in jedem von meinen Postings gesagt, dass uns das nichts bringt weil du nicht weisst _wie_ du es loesen willst. also sag mir nicht _wie_ du es machen willst, weil das ist falsch falsch falsch und tut weh.</p>
<blockquote>
<pre><code class="language-cpp">void PartBase::read( void *unterschiedlich_lange_typen , int laenge )
   {
   Einlesen von laenge Bytes, bei Bedarf mehrmals(- warscheinlich eher nicht) auf die Basisadresse *unterschiedlich_lange_typen. 
   }
</code></pre>
<p>Jetzt müsste doch klar sein um awas es geht?<br />
Funktioniert das? Nach meiner Rechersche - Ja.</p>
</blockquote>
<p>Habe ich bereits erklaert.<br />
du kannst entweder mit ::operator new oder mit new char[] laenge Bytes reservieren.</p>
<p>Mehrmals speicher an der selben adresse reservieren macht dagegen keinen Sinn. Was meinst du damit?<br />
Du kannst natuerlich speicher an der adresse X reserviern, ihn wieder freigeben und neu speicher reservieren.</p>
<p>aber new gibt dir halt idR immer eine andere adresse zurueck.</p>
<p>und in deiner funktion muss der void* natuerlich by reference uebergeben werden...</p>
<blockquote>
<p>Ich will halt nicht Tausende Zeilen schreiben und dann beim Probelauf auf eine Datenbank feststellen, daß das irgendwo nicht funktioniert.</p>
</blockquote>
<p>komplett falscher ansatz.<br />
und tausende zeilen? wofuer? fuer ein paar typen klassen?<br />
brauchst du denn 150 mio Typen fuer eine erste test version? reichen da nicht 1-3 typen?</p>
<blockquote>
<p>Irgendwie ist dann doch die Problematik sehr gut durchgedrungen.<br />
Ich kann dein Beisbiel voll und ganz so stehen lassen! Daß jedoch niemand auf die Idee kommt einfache Datensätze anzunehmen wo standard Datenbanken Anwendung fänden, müsste man noch auf die dynamischen Datensätze hinweisen.</p>
</blockquote>
<p>Und meinst du nicht dass das ein ziemliches Standard Problem ist? Ich meine: wieviele Datenbanksysteme sind in C++ geschrieben? eine Menge. Du bist also bei weitem nicht der erste der vor so einem Typ Problem steht.</p>
<p>Schau dir doch die APIs an die anderen RDBMS anbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655861</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 01 Feb 2009 11:41:16 GMT</pubDate></item></channel></rss>