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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

06.11.2007, 15:43

syntax

ich hab so meine probleme wenn ich zeilen finde wie:

C-/C++-Quelltext

1
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;


was macht das '&' bzw. das '?'
kann mir jemand diese anweisung erklären?

edit:

hab da noch was gefunden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct
{
     int     iIndex ;
     TCHAR * szLabel ;
     TCHAR * szDesc ;
}

sysmetrics [] =
{
     SM_CXSCREEN,             TEXT ("SM_CXSCREEN"),              
                              TEXT ("Screen width in pixels"),
     SM_CYSCREEN,             TEXT ("SM_CYSCREEN"),              
                              TEXT ("Screen height in pixels"),
     // ...

};


ich versteh nicht so ganz wieso der compiler es akzeptiert das ein struct keinen namen bekommt... und dann versteh ich nicht so ganz wieso das klar geht wenn ich einfach so irgendwo ein array definieren anfange ohne es vorher zu deklarieren.. oder macht der code genau das? ich leuchte da nicht so ganz durch.. O_o
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

2

06.11.2007, 15:57

Zu 1:

das is so ähnlich wie ne if - Abfrage:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2; 

// = 


if( tm.tmPitchAndFamily )
  cxCaps = 1 * cxChar / 2;
else
  cxCaps = 2 * cxChar / 2;

Es ist einfach nur eine entscheidung zwischen 2 werten
Dabei kommt vor dem "&" die Bedingung und danach
welcher wert genommen werden soll wenn die B. wahr is.
Nach ":" kommt die alternative.

Zu 2:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct 
{ 
     int     iIndex ; 
     TCHAR * szLabel ; 
     TCHAR * szDesc ; 
} 

sysmetrics [] = 
{ 
     SM_CXSCREEN,             TEXT ("SM_CXSCREEN"),              
                              TEXT ("Screen width in pixels"), 
     SM_CYSCREEN,             TEXT ("SM_CYSCREEN"),              
                              TEXT ("Screen height in pixels"), 
     // ... 

}; 


Da nach dem Ende der Struktur kein ";" steht
ist sie selber sofort der type.
Man kann sie dann aber halt nur einmal verwenden.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

06.11.2007, 16:14

Zitat von »"Databyte"«

Zu 1:

das is so ähnlich wie ne if - Abfrage:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2; 

// = 


if( tm.tmPitchAndFamily )
  cxCaps = 1 * cxChar / 2;
else
  cxCaps = 2 * cxChar / 2;

Es ist einfach nur eine entscheidung zwischen 2 werten
Dabei kommt vor dem "&" die Bedingung und danach
welcher wert genommen werden soll wenn die B. wahr is.
Nach ":" kommt die alternative.


Fast richtig! :) Aber eher:

C-/C++-Quelltext

1
2
3
4
if  ( tm.tmPitchAndFamily & 1 )
  cxCaps = 3 * cxChar / 2;
else
  cxCaps = 2 * cxChar / 2;
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

4

06.11.2007, 16:41

also das erste hab ich kapiert, danke für die antwort..#

beim zweiten muss ich nochmal nachfragen:

wie meinst du das mit

Zitat


Da nach dem Ende der Struktur kein ";" steht
ist sie selber sofort der type.


? ist der name der struktur jetzt "sysmetrics"? und ist diese nun ein type?
versteh ich das richtig das der name der struktur der darauf folgende name des arrays ist? und wenn ich mich nicht täusche wird in meinem beispiel da die struktur auch gleich definiert (also mit werten gefüllt), und jene werte müssen anscheinend in der richtigen reihenfolge geschrieben werden, kann das sein?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct
{
     int     iIndex ;
     TCHAR * szLabel ;
     TCHAR * szDesc ;
}

sysmetrics [] =
{
     SM_CXSCREEN,             // int iIndex

     TEXT ("SM_CXSCREEN"),   // szLabel

     TEXT ("Screen width in pixels"), // szDesc


     SM_CYSCREEN,  // int iIndex

     TEXT ("SM_CYSCREEN"),     // szLabel

     TEXT ("Screen height in pixels"),    // szDesc

     // ...

};


also wenn das so ist, dann ist es ja gar nicht so kompliziert! aber gleichzeitig hoffe ich das mir irgendjemand sagt dass das eine methode ist die veraltet ist, und dass es "schönere" methoden gibt.. das sieht ja grausig aus :lol:


EDIT
wenn ich schon da bin..

mit #define funktioniert das.. da ist es dem compiler 'egal' dass er sysmetrics eigentlich noch gar nicht kennt..
wenn ich NUMLINES aber klar als 'const long' deklariere, dann beklagt sich der compiler dass sysmetrics ein unbekannter bezeichner ist..

warum ist das so?

C-/C++-Quelltext

1
2
#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))
const long NUMLINES = static_cast<long>((sizeof(sysmetrics) / sizeof(sysmetrics[0])));
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

06.11.2007, 16:46

Strukturen können Namenlos sein. Das hat allerdings nur dann einen Sinn, wenn man direkt ein Objekt der Struktur erzeugt. Und das passiert hier in Form eines Arrays.
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

6

06.11.2007, 16:48

ok, ich denke es verstanden zu haben :)
weisst du vielleicht noch ne antwort zu dem edit meines vorigen posts?

danke!
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

06.11.2007, 17:00

Zitat von »"$nooc"«

warum ist das so?
Weil der Compiler das Objekt an der Stelle noch nicht kennt?! :shock: Lass doch das Macro.
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

8

06.11.2007, 17:12

ja schon.. aber wieso meckert er bei

C-/C++-Quelltext

1
const long NUMLINES = static_cast<long>((sizeof(sysmetrics) / sizeof(sysmetrics[0])));

herum, aber compiliert bei

C-/C++-Quelltext

1
#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))

ganz normal und startet das programm..
dabei sollte der compiler das objekt auch bei #define noch nicht kennen.. trotzdem gehts...
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Sheddex

unregistriert

9

06.11.2007, 17:18

Zitat von »"$nooc"«


dabei sollte der compiler das objekt auch bei #define noch nicht kennen.. trotzdem gehts...


Kennt er auch nicht. #define fügt einfach vor dem Kompilieren den Text ein, ohne zu "wissen" um was es sich handelt. Erst beim eigentlichen Kompilieren stellt sich heraus, ob alles korrekt ist.
Das ist wie, wenn du vor dem Kompilieren mit Suchen & Ersetzen nach NUMLINES suchst und durch ((int) (sizeof sysmetrics / sizeof sysmetrics [0])) ersetzt.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

10

06.11.2007, 17:23

ajaaa... völlig vergessen ^^ mein fehler *g*

danke für die antwort!

sorry dass ich euch jetz nochmal wegen des ersten problems nerve..
hab aber was übersehn was ich noch nicht gaaanz verstanden hab..

und zwar der & operator

Databyte meinte dass vor dem & die bedingung steht und danach welcher wert genommen werden soll.. David meinte dann dass das äquivalent zu meinem problem folgender code ist:

C-/C++-Quelltext

1
2
3
4
if  ( tm.tmPitchAndFamily & 1 )
  cxCaps = 3 * cxChar / 2;
else
  cxCaps = 2 * cxChar / 2;


in dem zusammenhang versteh ich jetzt leider das & nicht mehr.. :oops:
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige