[C++] Wat doet deze if

Pagina: 1
Acties:

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
DWORD WINAPI waveInProc(LPVOID arg)
{
    MSG     msg;

    /* Wait for a message sent to me by the audio driver */
    while (GetMessage(&msg, 0, 0, 0) == 1)
    {
                 /* Figure out which message was sent */
                switch (msg.message)
                {
    /* A buffer has been filled by the driver */
    case MM_WIM_DATA:
    {
    /* msg.lParam contains a pointer to the WAVEHDR structure for the filled buffer.
    * NOTE: The WAVEHDR's dwBytesRecorded field specifies how many bytes of
    * audio data are in the buffer. It may not be full, as would be the case
    * if recording was stopped *while* this buffer was being filled. (ie, A
    * final, partial block of audio data may be returned)
    */
        if (((WAVEHDR *)msg.lParam)->dwBytesRecorded)
        {
        /* Let's write out this next block of data to our already open file.  
                           NOTE: The main
        * thread opened this file prior to starting recording, and stored 
                           its handle in
        * 'WaveFileHandle'
        */
        if (!WriteFile(WaveFileHandle, ((WAVEHDR *)msg.lParam)->lpData,  
                          ((WAVEHDR *)msg.lParam)->dwBytesRecorded, &msg.time, 0) ||
                 /* Check for an error */
         msg.time != ((WAVEHDR *)msg.lParam)->dwBytesRecorded)


kan iemand mij de volgende regel uit bovenstaande code uitleggen?

if (((WAVEHDR *)msg.lParam)->dwBytesRecorded)

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Dat ding is 'True' als die waarde ongelijk aan 0 is. Als dwBytesRecorded 0 is, is er geen geluid in de buffer gezet, en dus hoef je de procedure niet in te duiken. Ik denk dat dat het idee is.

Siditamentis astuentis pactum.


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
oke.
dat msg.lParam een pointer is naar de WAVEHDR kan ik nog wel inkomen, maar wat doet dat eerste gedeelte dan.
(WAVEHDR *) (het komt over als het declareren van een nieuwe pointer naar een WAVEHDR, maar dan zonder een naam)

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Da's nou een CStyle cast :) Opzich wel vies, aangezien C++ een static_cast of dynamic_cast voorschrijft (naar ik mij meen te herrinderen)

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
oke bedankt

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Glimi schreef op 23 April 2003 @ 21:03:
Da's nou een CStyle cast :) Opzich wel vies, aangezien C++ een static_cast of dynamic_cast voorschrijft (naar ik mij meen te herrinderen)
reinterpret_cast<> is hier de goede cast, aangezien msg.lParam een integral value is, wat je wilt casten naar een pointer

Dat gaat niet met static_cast, en dus al helemaal niet met dynamic_cast :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Glimi schreef op 23 April 2003 @ 21:03:
Da's nou een CStyle cast :) Opzich wel vies, aangezien C++ een static_cast of dynamic_cast voorschrijft (naar ik mij meen te herrinderen)
Dynamic cast is nogal irrelevant voor een struct (is voor via RTTI upcasten van base classes). En iedere C++ programmeur die ik ken gebruikt alleen de C-style cast en dynamic casts omdat reinterpret_cast en static_cast een onleesbare troep van je code maken en niet realistisch uit mekaar te houden zijn. :z

(ja ik negeer de const_cast even omdat ik dat als een design-fout beschouw ;) )

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684: Ook een struct kan ge-dynamic_cast<> worden ;)
De voorwaarde is dat de class of struct een vtable heeft

(en nee dat heeft een WAVEHDR niet, om je maar even voor te zijn :Y))

[ Voor 24% gewijzigd door .oisyn op 23-04-2003 23:22 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 23 April 2003 @ 23:21:
curry684: Ook een struct kan ge-dynamic_cast<> worden ;)
De voorwaarde is dat de class of struct een vtable heeft

(en nee dat heeft een WAVEHDR niet, om je maar even voor te zijn :Y))
Een struct is hetzelfde als een class in C++ met als enige verschil dat de default visibility public is, daarom wordt in de reguliere spreektaal de term struct alleen nog gebezigd voor classes die enkel public variabelen hebben, geen methods en vooral geen base of derived classes. Zeg maar een klassieke C struct, en nee daar boeit een dynamic_cast niet voor :P

* curry684 vindt dat oisyn niet moet mierenneuken O-)

[ Voor 3% gewijzigd door curry684 op 23-04-2003 23:48 ]

Professionele website nodig?


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
in de regel er onder staat trouwens de writeFile. in die regel staat msg.time.

if (!WriteFile(WaveFileHandle, ((WAVEHDR *)msg.lParam)->lpData,
((WAVEHDR *)msg.lParam)->dwBytesRecorded, &msg.time, 0) ||

Hier toch een waarde komen die aangeeft hoeveel er al naar de file is geschreven? wat heeft de tijd daar dan te zoeken? die waarde is waarschijnlijk toch anders dan de hoeveelheid data die al eerder is weggeschreven? Of vergis ik mij hier nou sterk. Zo nee, wat had daar dan voor iets moeten staan / kunnen staan.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684 schreef op 23 April 2003 @ 23:46:
[...]

Een struct is hetzelfde als een class in C++ met als enige verschil dat de default visibility public is, daarom wordt in de reguliere spreektaal de term struct alleen nog gebezigd voor classes die enkel public variabelen hebben, geen methods en vooral geen base of derived classes. Zeg maar een klassieke C struct, en nee daar boeit een dynamic_cast niet voor :P
daar hebben ze de term POD voor :P

Plain Old Datatype dus ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • drZymo
  • Registratie: Augustus 2000
  • Laatst online: 09-08 22:22
dexter07051982 schreef op 24 april 2003 @ 10:20:
in de regel er onder staat trouwens de writeFile. in die regel staat msg.time.

if (!WriteFile(WaveFileHandle, ((WAVEHDR *)msg.lParam)->lpData,
((WAVEHDR *)msg.lParam)->dwBytesRecorded, &msg.time, 0) ||

Hier toch een waarde komen die aangeeft hoeveel er al naar de file is geschreven? wat heeft de tijd daar dan te zoeken? die waarde is waarschijnlijk toch anders dan de hoeveelheid data die al eerder is weggeschreven? Of vergis ik mij hier nou sterk. Zo nee, wat had daar dan voor iets moeten staan / kunnen staan.
Ik denk dat deze beslissing genomen is om geheugen te besparen. Aangezien deze time variabele niet gebruikt zal worden en ze geen zin hadden om een nieuwe variabele te gebruiken hebben ze deze msg.time maar gebruikt. Denk ik.

"There are three stages in scientific discovery: first, people deny that it is true; then they deny that it is important; finally they credit the wrong person."

Pagina: 1