JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=fd5a3e745ad8f5a2a88508c6041aca5aMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Der "Windows-Programmierung"- Thread
Gehe zu Seite 1, 2, 3, 4, 5  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 16:11    Titel: Der "Windows-Programmierung"- Thread Antworten mit Zitat

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 Crying or Very sad . 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 17:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 17:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 18:47    Titel: Antworten mit Zitat

Eher so:

CPP:
#define NUMLINES ( sizeof( sysmetrics ) / sizeof( sysmetrics[ 0 ] ) )


Und was für eine Struktur meinst du?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 18:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 19:27    Titel: Antworten mit Zitat

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. Smile

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
Benutzer-Profile anzeigen Private Nachricht senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 19:48    Titel: Antworten mit Zitat

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 Wink
Habs nur so vom Buch abgeschrieben
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 20:36    Titel: Antworten mit Zitat

hehe 2 Sachen:

1. Die Programmbeispiele: Schau mal auf die Rückseite des Buches das Fettgedruckte Schwarze und dann lies mal Razz 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 20:42    Titel: Antworten mit Zitat

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++! Smile Wenn auch nicht unbedingt gutes C++! Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 21:03    Titel: Antworten mit Zitat

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++! Smile Wenn auch nicht unbedingt gutes C++! Wink

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 Very Happy

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 21:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 29.07.2007, 21:53    Titel: Antworten mit Zitat

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? Razz
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 30.07.2007, 04:10    Titel: Antworten mit Zitat

Achso, du bezogst das auf deinen Post?! Dachte du meinst meinen! Smile

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
Benutzer-Profile anzeigen Private Nachricht senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 30.07.2007, 10:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 30.07.2007, 11:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3, 4, 5  Weiter
Seite 1 von 5

 
Gehe zu:  
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

Impressum