|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 29.07.2007, 16:11 Titel: Der "Windows-Programmierung"- Thread |
|
|
Hi,
ich habe mir überlegt, dass ich ein extra Thema für das Buch "Windows-Programmierung von Charles Petztold", weil ich dafür sicher noch viele Fragen habe und andere evtl auch.
Hier ist schon meine erste Frage (für diejenigen die das Buch haben):
In Kapitel 4, Abbildung 4.4 kommt mir der Code irgendwie eigenatig vor,
Was heißt:
Code: | #define NUMLINES (sizeof sysmetrics / sizeof sysmetrics[]) |
Und wie funktioniert diese Structur ?
Da wird anscheinend eine Structur angelegt mit einem int Wert und zwei TCHAR-Zeigern und gleich daraufhin werden 75 oda mehr Werte der Struktur zugewiesen??
Das geht doch nicht? Das sprengt doch den Rahmen?? Oder ist das wieder eine spezial Funktion von C ?
Ich würde gern den Source dazu posten aba ich habe die CD dazu nicht -.-
Irgendwie spricht er im Buch die ganze Zeit von einer CD dazu, aber ich habe keine bekommen . Naja ist wohl auch besser so, dann schreibe ich wenigstens alles ab anstadt alles einfach zu kopieren, soll ja beim lernen helfen.
Aber das will ich jetzt nicht abschreiben , weil da so komische sachen dabei sind die wahrscheinlich zu C gehören und dann gewöhn ich mir noch ohne etwas zu merken den falschen Still an XD. _________________ Besucht meine Seite:
www.cpparchiv.dl.am
Zuletzt bearbeitet von RebornX am 03.08.2007, 13:51, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 29.07.2007, 17:05 Titel: |
|
|
Bist du sicher, dass es nicht andersrum ist?
CPP: | #define NUMLINES (sizeof sysmetrics[] / sizeof sysmetrics)
|
In diesem Fall würde das bedeuten, dass NUMLINES im Code durch sizeof sysmetrics[] / sizeof sysmetrics ersetzt wird. Das ist eine normale Division und errechnet in diesem Fall die Anzahl der Elemente in dem Feld sysmetrics[]. |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 29.07.2007, 17:10 Titel: |
|
|
jop also mom
Code: | #define NUMLINES (sizeof sysmetrics / sizeof sysmetrics[0]) |
die 0 habe ich vergessen aber sonst ist das gleich,
Ach das hat sich wohl geklärt, NUMLINES wird in der cpp datei verwendet, deklariert aber in der header datei.
ich denk mal das habe ich jetzt verstanden, aber was ist mit der Structur ? _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 29.07.2007, 18:47 Titel: |
|
|
Eher so:
CPP: | #define NUMLINES ( sizeof( sysmetrics ) / sizeof( sysmetrics[ 0 ] ) )
|
Und was für eine Struktur meinst du? |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 29.07.2007, 18:59 Titel: |
|
|
Ok ich schreibe mal ab :
Code: |
#define NUMLINES (sizeof sysmetrics / sizeof sysmetrics[0])
struct
{ int iIndex;
TCHAR *szLabel;
TCHAR *szDesc;
}sysmetrics[] =
{
SM_CXSCREEN, TEXT("SM_CXSCREEN"),
TEXT("Bildschirmbreite in Pixeln"),
SM_CYSCREEN, TEXT("SM_CYSCREEN"),
TEXT("Bildschirmhöhe in Pixeln"),
SM_CXVSCROLL, TEXT("SM_CXVSCROLL"),
TEXT("Breiter vertikaler Rollpfeil"),
//......
//.........
//Und noch weitere 72 von diesen ^^ ehm dingern da^^.
};
|
Sowas habe ich noch nie gesehen^^
Habe es GANZ genau abgeschrieben. _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 29.07.2007, 19:27 Titel: |
|
|
Zunächst wird eine Namenlose Struktur erzeugt und mit drei Membervariablen, einem int und zwei TCHAR Zeigern. Von dieser Struktur wird ein Array erzeugt das direkt initialisiert wird.
CPP: | struct // Namenlose Struktur (=> kein Name angegeben)
{
int iIndex;
TCHAR* szLabel;
TCHAR* szDesc;
} sysmetrics[] // Array der Struktur erzeugen mit Namen Sysmetrics ...
= // ... und direkt Initialisieren ...
{
// ... mit den Werten
};
|
Nun hast du also ein Array dessen Größe du mit sizeof( Array ) rausfinden kannst.
CPP: | std::cout << ( sizeof( sysmetrics ) ) << std::endl;
|
Gibt also genau zurück wieviel Byte das Array im Speicher belegt. Wenn du jetzt die Anzahl der Einträge des Arrays haben willst musst du das Ergebnis noch durch die Größe der Struktur (Namenlos) oder der Größe irgendeines Eintrags des Arrays teilen:
CPP: | std::cout << ( sizeof( sysmetrics ) / sizeof( sysmetrics[ 0 ] ) ) << std:endl;
|
Hier wird also die Anzahl der Einträge von sysmetrics Zurückgegeben. Das ganze kann man natürlich als Macro schreiben:
CPP: | #define NUMLINES ( sizeof( sysmetrics ) / sizeof( sysmetrics[ 0 ] ) )
// ...
std::cout << NUMLINES << std::endl;
|
Der Code hat den selben Effekt wie der Code davor! Nur das halt der Präprozessor belastet wird.
Nun zwingt dich der sizeof-Operator nicht Klammern zu verwenden wenn du ein Objekt an ihn übergibst, also einfach die Klammern weglassen:
CPP: | #define NUMLINES ( sizeof sysmetrics / sizeof sysmetrics[ 0 ] )
|
Ist ebenfalls korrekt und führt wieder zur selben Ausgabe wie die beiden letzten Codes. Ob das nun so toll ist die Klammern wegzulassen ist eine andere Frage, ich finds irgendwie nich so schön.
Und da Macros sich an keine Einschränkungen (namespaces etcpp) halten kann es irgendwo Definiert werden und ist überall (wo sichtbar => entsprechende Datei inkludiert wurde) verfügbar und anwendbar!
grüße |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 29.07.2007, 19:48 Titel: |
|
|
Ok, jetzt habe ich das verstanden.
Und in C++ müsste das dann so aussehen oder?:
CPP: | #define NUMLINES (sizeof(sysmetrics) / sizeof(sysmet[0]))
struct sysmet
{ int iIndex;
TCHAR *szLabel;
TCHAR *szDesc;
};
sysmet sysmetrics[] ={
SM_CXSCREEN, TEXT("SM_CXSCREEN"),
TEXT("Bildschirmbreite in Pixeln"),
SM_CYSCREEN, TEXT("SM_CYSCREEN"),
TEXT("Bildschirmhöhe in Pixeln"),
SM_CXVSCROLL, TEXT("SM_CXVSCROLL"),
TEXT("Breiter vertikaler Rollpfeil"),
//......
//.........
//Und noch weitere 72 von diesen Werten
};
|
Ich finds auch besser mit den Klammern
Habs nur so vom Buch abgeschrieben _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 29.07.2007, 20:36 Titel: |
|
|
hehe 2 Sachen:
1. Die Programmbeispiele: Schau mal auf die Rückseite des Buches das Fettgedruckte Schwarze und dann lies mal Na gut, ich habs auch nur durch Zufall gefunden, ist wirklich etwas versteckt, aber naja...
2. RebornX hat Folgendes geschrieben: | Und in C++ müsste das dann so aussehen oder?:
[...] | nein, in c++ müsste das so aussehen: CPP: | struct Sysmets
{ int index;
std::wstring label; // oder die t_string Variante aus dem anderen Thread
std::wstring szDesc;
} sysmetrics[] =
{
SM_CXSCREEN, TEXT("SM_CXSCREEN"),
TEXT("Bildschirmbreite in Pixeln"),
SM_CYSCREEN, TEXT("SM_CYSCREEN"),
TEXT("Bildschirmhöhe in Pixeln"),
SM_CXVSCROLL, TEXT("SM_CXVSCROLL"),
TEXT("Breiter vertikaler Rollpfeil"),
//......
//.........
//Und noch weitere 72 von diesen ^^ ehm dingern da^^.
};
// oder auch mit Klammern
const unsigned int numLines = sizeof sysmetrics / sizeof Sysmets; |
Die Initialisierung direkt nach der Struktur sowie die namenlose Struktur ist erlaubt in C++, aber TCHAR* als String und #define ist kein richtiges C++. Auch die Klammern bei sizeof sind optional (wenn es auch öfter der Leserlichkeit hilft)
Gruß DXer |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 29.07.2007, 20:42 Titel: |
|
|
DirectXer hat Folgendes geschrieben: | aber TCHAR* als String und #define ist kein richtiges C++. Auch die Klammern bei sizeof sind optional (wenn es auch öfter der Leserlichkeit hilft) |
Klar ist das richtiges C++. Alles im C++ Standard enthalten und somit sowas von richtigem C++! Wenn auch nicht unbedingt gutes C++! |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 29.07.2007, 21:03 Titel: |
|
|
David hat Folgendes geschrieben: | DirectXer hat Folgendes geschrieben: | aber TCHAR* als String und #define ist kein richtiges C++. Auch die Klammern bei sizeof sind optional (wenn es auch öfter der Leserlichkeit hilft) |
Klar ist das richtiges C++. Alles im C++ Standard enthalten und somit sowas von richtigem C++! Wenn auch nicht unbedingt gutes C++! |
ja stimmt, es ist C++, und es kann auch gutes sein, wenn es nicht als String(was ich oben geschrieben hab) benutzt wird. C-Strings in Form von Zeichenarrays werden durch die Strings der STL vollkommen ersetzt. Ok, ersetz einfach "richtiges" durch "schönes" in meinem Post
Gruß DXer |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 29.07.2007, 21:42 Titel: |
|
|
Nö, wieso? C-Strings sind genau wie das Template basic_string Teil von C++. Es ist also richtiges C++ und in diesem Fall ist es sogar schöner C-Strings zu verwenden statt std::string-Objekte. |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 29.07.2007, 21:53 Titel: |
|
|
David hat Folgendes geschrieben: | Nö, wieso? C-Strings sind genau wie das Template basic_string Teil von C++. Es ist also richtiges C++ und in diesem Fall ist es sogar schöner C-Strings zu verwenden statt std::string-Objekte. |
ok, ich habe eingesehen das "richtiges" falsch war. Aber gut, was man nun verwendet ist jetzt Geschmackssache, BTT k? |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 30.07.2007, 04:10 Titel: |
|
|
Achso, du bezogst das auf deinen Post?! Dachte du meinst meinen!
Wegen Geschmackssache, hier werden Stringliterale benötigt ohne das Änderungen an diesen vorgenommen werden müssen. Es macht kein Sinn 75 string Objekte zu erstellen zum einen weil man die Stringliterale im statischen Speicher- und somit alle Zeichenketten doppelt hat (std::string legt die nochmal dynamisch auf dem Heap an) und zum anderen weil man egtl keine der Vorzüge, die std::string (stringcopy, dynamische Erweiterung, Vergleich, etcpp) bietet, braucht und sich somit den Overhead schlichtweg sparen kann.
Was ganz wichtig ist: Es wird sowohl Anfängern als auch Fortgeschrittenen immer gesagt man solle in c++ immer std::string verwenden, egal in welcher Lebenlage man sich gerade befindet! Das ist aber eben nicht ganz korrekt. Es gibt durchaus Situationen (und eine solche ist das hier) die überhaupt kein string Objekt forderun und bei denen ein string Objekt sogar Nachteilig wäre!
grüße |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 30.07.2007, 10:59 Titel: |
|
|
Also Array Zeichenketten soll ich bei Strings verwenden die konstant bleiben und sich nicht im Laufe des Programms verändern.
Und std::strings soll ich bei strings verwenden die sich im Laufe des Programms verändern hab ich recht??
Weil std::string mehr Leistung braucht als Array zeichenketten ? _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 30.07.2007, 11:03 Titel: |
|
|
Das kann man so global nicht sagen. Hängt immer von der Situation an. Aber gerade diese Situation macht string-Objekte total unnötig, zum einen weil man eben wirklich garnichts der Vorteile von basic_string<> nutzt und zum anderen weil es einen (wenn auch geringen) Overhead pro Objekt gibt den man vermeiden kann. Kleinvieh macht auch Mist. Und bei ~75 Objekten sind das schon wieder einige Byte mehr.
Ich würde z.B. bei so Lookuptabellen, wie hier, auf Stringobjekte verzichten. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|