C++ Tips&Tricks

poruka: 8
|
čitano: 3.279
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
protjeran
offline
C++ Tips&Tricks - otvori/zatvori CD-ROM

Evo jednog topica gdje možete stavljati neke zanimljive source codove vezane za C++ programski jezik tj. nešto što bi svakome eventualno moglo koristiti.

 

Pa da krenem... Sljedeći program će otvoriti i zatvoriti vratašca CD-ROMa:

 

#include <iostream>
#include <windows.h>
#include <mmsystem.h>

using namespace std;
int main(){
    cout << "Otvaram CD-ROM..." << endl;
    mciSendString("set CDAudio door open", NULL, 0, NULL);

    Sleep(1500);
    cout << "Zatvaram CD-ROM..." << endl;
    mciSendString("set CDAudio door closed", NULL, 0, NULL);

    cin.get();
    return 0;
}

 

Ovo u većini slučajeva će raditi. Međutim, ukoliko ne bude radilo pokušajte linkati (dodati) u program biblioteku winmm.lib. Ako je riječ o DevC++u onda treba dodati libwinmm.a (Project->Project Options->Parameters->Add Lib->libwinmm.a).

 

Poruka je uređivana zadnji put čet 23.4.2009 9:45 (Tracer).
Moj PC  
1 0 hvala 1
17 godina
protjeran
offline
C++ Tips&Tricks

Ne znam zašto al' jednostavno volim ovaj komad koda, to je iz jednog DLL-a i kao što ime funkcije kaže vrača CPU Type

 

extern "C" __declspec(dllexport) char* __stdcall getCPUType() {
    static char pszCPUType[13];
    memset(pszCPUType, 0, 13);

    _asm {
        mov eax, 0
        cpuid

        // getting information from EBX
        mov pszCPUType[0], bl
        mov pszCPUType[1], bh

        ror  ebx, 16
        mov pszCPUType[2], bl
        mov pszCPUType[3], bh

        // getting information from EDX
        mov pszCPUType[4], dl
        mov pszCPUType[5], dh

        ror  edx, 16
        mov pszCPUType[6], dl
        mov pszCPUType[7], dh

        // getting information from ECX
        mov pszCPUType[8], cl
        mov pszCPUType[9], ch

        ror  ecx, 16
        mov pszCPUType[10], cl
        mov pszCPUType[11], ch
    }

    pszCPUType[12] = '\0';

    return pszCPUType;
}

Programko http://programko.bloger.hr
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: C++ Tips&Tricks - otvori/zatvori CD-ROM

Pozivanje funkcije ti i nije neki trik. ;-)

No program bar testira brzinu stavljanja diska u ladicu. Zas nisi stavio cin.get(); umjesto Sleep?

p.s.

Inače kad koristiš pojedinu biblioteku moraš ju linkat..

17 godina
protjeran
offline
RE: C++ Tips&Tricks - otvori/zatvori CD-ROM

Ovo niti nije trik već "tip" ;)  I program ne testira brzinu već samo pokazuje kako otvoriti i zatvoriti CD-ROM. Dalje, Sleep zato da program pričeka da se vratašca otvore. Moglo se i cin.get ali tad korisnik može usljed operacije otvaranja krenuti s zatvaranjem. No, to je svejedno. Također, linkanje je automatsko. Tu nema problema ukoliko je biblioteka pravilno dodana u projekt (aplikaciju).

Poruka je uređivana zadnji put uto 28.4.2009 18:40 (Tracer).
17 godina
offline
C++ Tips&Tricks

Wrapper funkcije za pretvaranje tipova koristeći stringstream:

 

#include <sstream>

#include <string>

 

template <class T>
std::string ToString(T object)
{
    stringstream ss;
    ss << object;
    return ss.str();
}

template <class T>
T StringTo(string str)
{
    stringstream ss; T ret;
    ss << str;
    ss >> ret;
    return ret;
}

 

Primjer:

string a = ToString(50.556);
double b = StringTo<double>(a);

 

Radit će za sve tipove za koje su overloadani input i ouput operatori (bitshift lijevo i desno, << i >>).

Poruka je uređivana zadnji put pet 1.5.2009 20:16 (itf4n).
 
0 0 hvala 0
17 godina
protjeran
offline
C++ Tips&Tricks

Funkcija koja pri pokretanju mijenja rezoluciju windowsa:

 

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    DEVMODE dm;
    dm.dmSize = sizeof(DEVMODE);

    int index = 0;
    while ( EnumDisplaySettings ( NULL, index, &dm ) )
    {
        if ( dm.dmPelsWidth == 1280 && dm.dmPelsHeight == 1024)
        {
            dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
            LONG const result = ChangeDisplaySettings( &dm, CDS_TEST );
            if ( result == DISP_CHANGE_SUCCESSFUL )
            {
                ChangeDisplaySettings( &dm, CDS_UPDATEREGISTRY );
                break;
            }
            else if ( result == DISP_CHANGE_RESTART )
            {
                ShowMessage( "Potreban je restart!" );
                break;
            }
            else
            {
                ShowMessage( "Nepromjenjeno." );
                break;
            }
        }
        index++;
    }
}

 

U ovom slučaju mijenja u 1280x1024 (ako monitor podržava).

 

Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
RE: C++ Tips&Tricks - otvori/zatvori CD-ROM

E evo jednog pravog C++ trika:

 

int _tmain(int argc, _TCHAR* argv[])
{
    int niz[10];
    cin>>niz[9];
   
    cout<< 9 [niz] ; //zanimljivo indexiranje niza koje radi :-)
   
    return 0;
}

16 godina
neaktivan
offline
RE: C++ Tips&Tricks - otvori/zatvori CD-ROM
Coa kaže...

E evo jednog pravog C++ trika:

 

int _tmain(int argc, _TCHAR* argv[])
{
    int niz[10];
    cin>>niz[9];
   
    cout<< 9 [niz] ; //zanimljivo indexiranje niza koje radi :-)
   
    return 0;
}

Blah. Naravno da radi - i nije C++ trik nego prastari C "trik". :)

niz[9] <==> *(niz+9) <==> *(9+niz) <==> 9[niz]

Naravno, na vectorima i slicnim spremnicima to ne radi jer je za njih preopterecen operator[]. 

 

Ponekad scanf/cin nisu dovoljno brzi za ucitavanje gomile brojeva, pa smo prisiljeni koristiti nesto brze. Za to se obicno napise ovakva nekakva funkcija:

 

inline char daj_char( void ) {

  static const int broj = 1024*1024;

  static int x = broj;

  static char buffer[ broj ];

 

  if( x == broj ) {

    fread( buffer, sizeof( buffer ), 1, stdin );

    x = 0;

  }

 

  return buffer[ x++ ];

}

 

inline int daj_int( void ) {

  register int x = 0;

  register char c = daj_char();

 

  while( !isdigit(c) ) c = daj_char();

  for( ; isdigit(c); c = daj_char() )

    x = x * 10 + c - '0';

 

  return x;

}

 

EDIT: eh da. Ovaj kod ne deteketira negativne brojeve, no to se lako sredi sa par ifova.

 

Sa štovanjem, brahle!
Poruka je uređivana zadnji put uto 25.8.2009 17:32 (brahle).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice