Programiranje u C++-u - pitanja i odgovori izdvojena tema

poruka: 7.283
|
čitano: 1.513.413
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Xyloto kaže...

Za šta se koristi static u programiranju kakv utjecaj ima na varijablu i funkciju?

 

Static je višeznačan. Primjerice, ako je riječ o statičkoj varijabli funkcije onda takva varijabla djeluje kao globalna tj. ne gubi svoju vrijednost nakon poziva funkcije.

 

void funkcija(){
    static int i = 0;
    cout << ++i << " ";
}
int main(){
    for(int k = 1; k <= 10; k++)
       funkcija(); // 1 2 3 ... 10
       return 0;
}

 

Slično, statička varijabla-članica neke klase je varijabla koja je dijeljenja među svih instancama neke klase.

 

class A{
    public:
       static int n;
};
int A::n = 0; // inicijalizacija statičkog člana

int main(){
    A obj1, obj2;

    cout << obj1.n << " " << obj2.n << endl; // 0 0
    obj1.n = 1;
    cout << obj1.n << " " << obj2.n << endl; // 1 1
    obj1.n = 2;
    cout << obj1.n << " " << obj2.n << endl; // 2 2
    return 0;
}

 

Statička varijabla-članica mora biti inicijalizirana prije upotrebe.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Poruka je uređivana zadnji put pon 14.10.2013 19:58 (TracerCPP).
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

Ne trebaš pretvarati 2D niz u 1D niz za riješiti ovaj zadatak, to bi bilo overkill. Dovoljno je deklarirati 1D niz veličine broja stupaca 2D niza i u jednostrukoj petlji strpati elemente traženog reda 2D niza u 1D niz.

 

 

#include <iostream>
#define red 3
#define stupac 3
using namespace std;

int main()
{
   
    int A[red][stupac] = {{5, 4, 3}, {2, 8, 1}, {9, 5, 4}};
    int B[stupac];
    for(int i = 0; i < stupac; i++)
       B[i] = A[red-1][i];
    for(int i = 0; i < stupac; i++)
       cout<< B[i] << " ";
    return 0;
}

 

A ako baš hoćeš pretvoriti 2D niz A[i][j]  u 1D niz izraz za izračun indexa 1D niza je ovaj:

 

index = (j + stupac * i)

 

gdje je j index stupca 2D niza, i index retka 2D niza, a stupac broj kolona 2D niza, odnosno njegova širina.

 

 

Hvala puno! radi jako dobro kod {#}

14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
C je programski jezik kaže...

Vjerujem da mi i double buffering neće puno pomoći, jer kada iscrtavam i samo jedan objekt flick je velik.

Evo brljotine. Kompliciranije je nego što sam planirao zato što se nisam mogao suzdržati ubacivanja svega i svačega.

 

#include <stdlib.h>
#include <time.h>
#include <windows.h>

typedef struct
{
    int x;
    int y;
} VECTOR, *PVECTOR;

typedef struct
{
    COLORREF color;
    VECTOR size;
    VECTOR position;
    VECTOR oldPosition;
    VECTOR speed;
} OBJECT, *POBJECT;

typedef struct
{
    int count;
    POBJECT list;
} OBJECTS, *POBJECTS;

typedef struct
{
    HWND hwnd;
    int doubleBuffering;
    int runThread;
    HDC hdcBack;
} ARGUMENTS, *PARGUMENTS;

#define IDM_SINGLE  500
#define IDM_DOUBLE  501
#define IDM_CLOSE   502

#define GetWidth(x) (x.right - x.left)
#define GetHeight(x) (x.bottom - x.top)

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI AnimationFunction(void *param);
void DrawCircles(HWND hwnd, POBJECTS objects, float delta, HDC hdcBack, int doubleBuffer);
void CreateBackBuffer(HWND hwnd, HDC *hdcBack, HBITMAP *backBufferBitmap);
void DestroyBackBuffer(HDC hdcBack, HBITMAP backBufferBitmap);

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
    HWND hwnd;
    MSG message;
    WNDCLASS wc = {0};
    HMENU mainMenu = CreateMenu(),
          applicationMenu = CreateMenu();

    wc.hInstance      = hThisInstance;
    wc.lpszClassName  = "GDIAnimationAppClass";
    wc.lpfnWndProc    = WindowProcedure;
    wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground  = COLOR_SCROLLBAR + 1;

    if (!RegisterClass(&wc))
        return 0;

    AppendMenu(mainMenu, MF_POPUP | MF_STRING, (UINT_PTR)applicationMenu, "Application");
    AppendMenu(applicationMenu, MF_STRING, IDM_SINGLE, "Use single buffering");
    AppendMenu(applicationMenu, MF_STRING | MF_CHECKED, IDM_DOUBLE, "Use double buffering");
    AppendMenu(applicationMenu, MF_SEPARATOR, IDM_SINGLE, " ");
    AppendMenu(applicationMenu, MF_STRING, IDM_CLOSE, "Close");

    hwnd = CreateWindow("GDIAnimationAppClass", "GDI animation test",
                        WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,
                        CW_USEDEFAULT, CW_USEDEFAULT, 500, 500,
                        NULL, NULL, hThisInstance, NULL);

    SetMenu(hwnd, mainMenu);

    while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    return message.wParam;
}

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static ARGUMENTS arguments;
    static HANDLE thread;
    HMENU mainMenu, applicationMenu;
    RECT windowRect;

    switch (message)
    {
        case WM_CREATE:
            arguments.hwnd            = hwnd;
            arguments.doubleBuffering = TRUE;
            arguments.runThread       = TRUE;
            thread = CreateThread(NULL, 0, AnimationFunction, (void*)&arguments, 0, NULL);
            break;

        case WM_DESTROY:
            arguments.runThread = FALSE;
            WaitForSingleObject(thread, 100);
            PostQuitMessage(0);
            break;

        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDM_SINGLE:
                    arguments.doubleBuffering = FALSE;

                    mainMenu = GetMenu(hwnd);
                    applicationMenu = GetSubMenu(mainMenu, 0);

                    ModifyMenu(applicationMenu, 0,
                               MF_CHECKED | MF_BYPOSITION | MF_STRING,
                               IDM_SINGLE, "Use single buffering");
                    ModifyMenu(applicationMenu, 1,
                               MF_UNCHECKED | MF_BYPOSITION | MF_STRING,
                               IDM_DOUBLE, "Use double buffering");
                    break;

                case IDM_DOUBLE:
                    arguments.doubleBuffering = TRUE;

                    mainMenu = GetMenu(hwnd);
                    applicationMenu = GetSubMenu(mainMenu, 0);

                    ModifyMenu(applicationMenu, 0,
                               MF_UNCHECKED | MF_BYPOSITION | MF_STRING,
                               IDM_SINGLE, "Use single buffering");
                    ModifyMenu(applicationMenu, 1,
                               MF_CHECKED | MF_BYPOSITION | MF_STRING,
                               IDM_DOUBLE, "Use double buffering");

                    GetClientRect(hwnd, &windowRect);
                    FillRect(arguments.hdcBack, &windowRect, COLOR_SCROLLBAR + 1);
                    break;

                case IDM_CLOSE:
                    arguments.runThread = FALSE;
                    WaitForSingleObject(thread, 100);
                    PostQuitMessage(0);
                    break;
            }
            break;

        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }

    return 0;
}

DWORD WINAPI AnimationFunction(void *arguments)
{
    HWND hwnd = ((PARGUMENTS)arguments)->hwnd;
    int *doubleBuffering = &((PARGUMENTS)arguments)->doubleBuffering;
    RECT windowRect;
    const int updatesPerSecond = 25;
    const int skipTicks = 1000 / updatesPerSecond;
    const int numberOfCircles = 20;
    float delta;
    DWORD nextTick = GetTickCount();
    OBJECTS objects;
    HDC hdcBack;
    HBITMAP backBufferBitmap;

    srand(time(NULL));
    GetClientRect(hwnd, &windowRect);

    CreateBackBuffer(hwnd, &hdcBack, &backBufferBitmap);
    ((PARGUMENTS)arguments)->hdcBack = hdcBack;

    objects.list = LocalAlloc(LMEM_FIXED, sizeof(OBJECT) * numberOfCircles);
    objects.count = numberOfCircles;

    // stvori kružnice nasumične veličine, boje, smijera i brzine
    for (int n = 0; n < objects.count; n++)
    {
        objects.list[n].color = RGB(rand() % 255, rand() % 255, rand() % 255);

        objects.list[n].position.x    = 10;
        objects.list[n].position.y    = 10;
        objects.list[n].oldPosition.x = 10;
        objects.list[n].oldPosition.y = 10;
        objects.list[n].speed.x       = rand() % 10 + 1;
        objects.list[n].speed.y       = rand() % 10 + 1;
        objects.list[n].size.x        = rand() % 100 + 1;
        objects.list[n].size.y        = objects.list[n].size.x;
    }

    while (((PARGUMENTS)arguments)->runThread)
    {
        // procesiraj kružnice
        if (GetTickCount() > nextTick)
        {
            for (int n = 0; n < objects.count; n++)
            {
                // provjeri je li trenutna kružnica udarila u jedan od 4 ruba
                // prozora i promijeni joj smijer ako jest
                if (objects.list[n].position.x +
                    objects.list[n].speed.x +
                    objects.list[n].size.x > GetWidth(windowRect))
                {
                    objects.list[n].speed.x *= -1;
                }

                if (objects.list[n].position.y +
                    objects.list[n].speed.y +
                    objects.list[n].size.y > GetHeight(windowRect))
                {
                    objects.list[n].speed.y *= -1;
                }

                if (objects.list[n].position.x +
                    objects.list[n].speed.x < 0)
                {
                    objects.list[n].speed.x *= -1;
                }

                if (objects.list[n].position.y +
                    objects.list[n].speed.y  < 0)
                {
                    objects.list[n].speed.y *= -1;
                }

                // pomakni kružnicu
                objects.list[n].position.x += objects.list[n].speed.x;
                objects.list[n].position.y += objects.list[n].speed.y;
            }

            nextTick += skipTicks;
        }

        // nacrtaj sve kružnice
        delta = (GetTickCount() - (nextTick - skipTicks)) / (float)skipTicks;
        DrawCircles(hwnd, &objects, delta, hdcBack, *doubleBuffering);

        // pauziraj glavnu petlju na 15 milisekundi
        // kako bi ograničili količinu crtanja na nešto više od 60
        // sličica u sekundi i rasteretili procesor
        Sleep(15);
    }

    // thread završava, oslobodi resurse...
    LocalFree(objects.list);
    DestroyBackBuffer(hdcBack, backBufferBitmap);

    return 0;
}

void DrawCircles(HWND hwnd, POBJECTS objects, float delta, HDC hdcBack, int doubleBuffer)
{
    HDC hdcFront = GetDC(hwnd),
        hdcTarget = doubleBuffer ? hdcBack : hdcFront;

    HBRUSH eraseBrush = CreateSolidBrush(GetSysColor(COLOR_SCROLLBAR)),
           colorBrush,
           oldBrush;

    HPEN erasePen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_SCROLLBAR)),
         colorPen = CreatePen(PS_SOLID, 0, RGB(0, 0, 0)),
         oldPen;

    int xStep, yStep;
    RECT windowRect;

    GetClientRect(hwnd, &windowRect);

    // odaberi pen i brush koji čemo koristiti za brisanje
    // i sačuvaj originalni pen i brush
    oldPen = SelectObject(hdcTarget, erasePen);
    oldBrush = SelectObject(hdcTarget, eraseBrush);

    // izbriši sve kružnice
    for (int n = 0; n < objects->count; n++)
    {
        Ellipse(hdcTarget,
                objects->list[n].oldPosition.x, objects->list[n].oldPosition.y,
                objects->list[n].oldPosition.x + objects->list[n].size.x,
                objects->list[n].oldPosition.y + objects->list[n].size.y);
    }

    // nacrtaj kružnice na novim pozicijama
    SelectObject(hdcTarget, colorPen);
    for (int n = 0; n < objects->count; n++)
    {
        colorBrush = CreateSolidBrush(objects->list[n].color);
        SelectObject(hdcTarget, colorBrush);

        // interpoliraj fini pomak između dva updatea kako bi
        // animacija bila glađa
        xStep = objects->list[n].speed.x * delta;
        yStep = objects->list[n].speed.y * delta;

        Ellipse(hdcTarget,
                objects->list[n].position.x + xStep,
                objects->list[n].position.y + yStep,
                objects->list[n].position.x + objects->list[n].size.x + xStep,
                objects->list[n].position.y + objects->list[n].size.y + yStep);

        objects->list[n].oldPosition.x = objects->list[n].position.x + xStep;
        objects->list[n].oldPosition.y = objects->list[n].position.y + yStep;

        DeleteObject(colorBrush);
    }

    // kopiraj back buffer u front buffer
    if (doubleBuffer)
    {
        BitBlt(hdcFront, 0, 0, GetWidth(windowRect), GetHeight(windowRect),
               hdcBack, 0, 0, SRCCOPY);
    }

    // oslobodi sve GDI objekte i odaberi stari pen i brush
    DeleteObject(erasePen);
    DeleteObject(colorPen);
    DeleteObject(eraseBrush);

    SelectObject(hdcTarget, oldPen);
    SelectObject(hdcTarget, oldBrush);
    ReleaseDC(hwnd, hdcFront);
}

void CreateBackBuffer(HWND hwnd, HDC *hdcBack, HBITMAP *backBufferBitmap)
{
    RECT windowRect;

    GetClientRect(hwnd, &windowRect);
    HDC hdcFront = GetDC(hwnd);

    *backBufferBitmap = CreateCompatibleBitmap(hdcFront, GetWidth(windowRect),
                                               GetHeight(windowRect));
    *hdcBack = CreateCompatibleDC(hdcFront);

    SelectObject(*hdcBack, *backBufferBitmap);
    FillRect(*hdcBack, &windowRect, COLOR_SCROLLBAR + 1);

    ReleaseDC(hwnd, hdcFront);
}

void DestroyBackBuffer(HDC hdcBack, HBITMAP backBufferBitmap)
{
    DeleteObject(backBufferBitmap);
    DeleteDC(hdcBack);
}

 

Nema GDI leakova i ja više nego zadovoljan za prvi put. Kratio sam linije što više kako bi izgledalo koliko-toliko pristojno na forumu pa zato neke stvari izgledaju malo čudno. Ali toplo preporučam kopiranje u IDE i analiziranje koda odatle...

 

Nije za one slabih živaca {#}

What Andy giveth, Bill taketh away.
Poruka je uređivana zadnji put uto 15.10.2013 4:55 (rustweaver).
10 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

prekrasno :D puno ti hvala

pokrenuo sam i izgleda amazing :D

ali već vidim da će mi trebat par dana da uopće skužim kod :P

jel mogu pitat gdje si ti tako naučio programirat?

 

i BTW koje promjene su potrebne da bi mogao crtati po prozoru od drugog programa (directX)?

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
C je programski jezik kaže...

prekrasno :D puno ti hvala

pokrenuo sam i izgleda amazing :D

ali već vidim da će mi trebat par dana da uopće skužim kod :P

Najbitnija stvar je da imaš dvije bitmape u dva device contexta.

 

Prvi (nazovimo ga front buffer) je u biti površina prozora i sve što po njemu crtaš je odmah vidljivo.

Drugi (nazovimo ga back buffer) nije vidiljiv nigdje na ekranu, u njega crtaš sve što trebaš kao da crtaš na ekran, i onda kada si gotov sa crtanjem samo kopiraš cijeli BackBuffer u FrontBuffer u jednom potezu pozivom na BitBlt. I tako frame po frame crtaš, svaki puta pozoveš BitBlt kada je frame spreman za prikazivanje na ekran.

 

Najbitnije stvari su ti u funkciji CreateBackBuffer gdje možeš vidjeti kako se stvara dodatni device context i u funkciji DrawCircles gdje možeš vidjeti kako izgleda crtanje kada radiš double buffering.

 

Pa onda ova linija:

hdcTarget = doubleBuffer ? hdcBack : hdcFront;

 

U kojoj se ovisno o vrijednosti doubleBuffer varijable selektira hdcBack ili hdcFront za crtanje. Tako je implementirano prebacivanje između single i double bufferinga u meniju. Odabereš recimo single buffering i "doubleBuffer" varijabla poprimi vrijednost 0 (False) i onda uvjet nije zadovoljen pa se koristi hdcFront za crtanje. U biti cijeli taj konstrukt je ternarni operator pa si možeš to pogledati ako te zbunjuje.

 

u biti to ti je isto kao da piše ovo:

if (doubleBuffer)
    hdcTarget = hdcBack;
else
    hdcTarget = hdcFront;

 

i onda kada smo odredili što će biti "meta" po kojoj ćemo crtati (hdcFront ako koristimo single buffering, ili hdcBack ako koristimo double buffering) samo dalje crtamo po tome sve dok ne dođemo do:

 

if (doubleBuffer)
{
    BitBlt(hdcFront, 0, 0, GetWidth(windowRect), GetHeight(windowRect),
           hdcBack, 0, 0, SRCCOPY);
}

 

Ovo se izvršava samo ako je aktiviran double buffering, i time cijeli sadržaj back buffera (hdcBack) kopiramo u front buffer (hdcFront) čime frame postaje vidljiv na ekranu. Obrati pozornost da to nije potrebno ako koristimo single buffering jer onda već crtamo po front bufferu pa je sve odmah vidljivo.

 

C je programski jezik kaže...
jel mogu pitat gdje si ti tako naučio programirat?

Doma xD. Nije ti ovo ništa komplicirano, samo ti tako izgleda zato što se koristi puno API funkcija koje nisi još vidio a i zato što nisi napisao taj kod pa ne znaš gdje je što. Nema nikakvih kompliciranih algoritama ili nešto (doslovno samo linearne iteracije po elementima polja), i korištenje dodatnog threada za animirano crtanje.

 

A i vjerojatno moja "vještina" pridonosi nečitkosti programa {#}

 

Uzmeš liniju po liniju i pratiš program kako se izvršava i sve će ti sjesti na svoje mjesto. Mijenjaj kod, igraj se. Stavi neke dijelove pod komentar i vidi kako se program ponaša bez njih.

 

C je programski jezik kaže...
i BTW koje promjene su potrebne da bi mogao crtati po prozoru od drugog programa (directX)?

Treba ti handle od prozora, kada imaš handle onda možeš jednostavno dohvatiti Device Context sa GetDC.

What Andy giveth, Bill taketh away.
Poruka je uređivana zadnji put uto 15.10.2013 2:27 (rustweaver).
10 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Ajde neki hacker koji zna radit oko tih hack toolova i tih hack gluposti nek mi se javi na private treba mi :)

Anony
Moj PC  
0 6 hvala 0
10 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Ajde neki hacker neka mi se javi ili bilo tko ko zna oko hack toolova i tih gluposti :)

Anony
Moj PC  
0 6 hvala 0
10 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori
izadite program koji ce ucitat skup od desetak brojeva.Iz zadanog skupa nadite svebrojeve dijeljive s dva,pa ih zbrojite. Tiskajte redom sve učitane brojeve,pa zatim sve brojeve dijeljive s dva,i njihov zbroj..može pomoć,kako ovo zapceti?
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Treba ti polje od 10 cijelih brojeva u koje ćeš spremiti taj svoj skup od deset brojeva, i onda koristeći petlju i neku funkciju za unos sa tipkovnice svakom članu polja dodijeliš neku vrijednost koju će korisnik upisati na tipkovnici.

 

Dalje, također samo dereš kroz to polje sa petljama i radiš ono što se dalje traži u zadatku. Provjeriti je li neki broj djeljiv sa nekim drugim brojem možeš pomoću modulo operatora koji ti daje ostatak dijeljenja s nekim brojem, pa ako je taj ostatak 0 onda znači da je broj djeljiv.

What Andy giveth, Bill taketh away.
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
moni_156 kaže...
izadite program koji ce ucitat skup od desetak brojeva.Iz zadanog skupa nadite svebrojeve dijeljive s dva,pa ih zbrojite. Tiskajte redom sve učitane brojeve,pa zatim sve brojeve dijeljive s dva,i njihov zbroj..može pomoć,kako ovo zapceti?

 

Btw, a u kojem jeziku, ako je to nešto bitno, jer je isti post bio za c sharp.

Što znači tiskajte redom brojeve, jel to ispišite brojeve.

 

1. deklariraj int niz[10], int varijablu broj i varijablu zbroj koju inicjaliziraš na 0

2. kroz for petlju upiši 10 brojeva u taj niz

3. dok ih upisuješ sa if(broj % 2 == 0) provjeri je li broj paran

4. ako je paran u int varijablu zbroj dodaj taj broj zbroj += broj

5. kroz for petlju ispiši niz cout<< broj << " ";

7. opali cout<< endl; iza petlje

6. kroz for petlju ispiši samo parne sa if uvjetom if(broj % 2 == 0) cout << broj << " ";

7. opali cout<< endl; iza petlje

8. ispiši varijablu zbroj cout<< zbroj << endl;

 

 

Poruka je uređivana zadnji put uto 15.10.2013 18:07 (Floki).
10 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...

Sad sam već malo pohvatao program :D

 

No kad crtam po DirectX programu koristeći double buffering filcker je još gori nego u slučaju single. :( tak da izgleda ništa od GDI-a

10 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Bok svima, ja sam tu novi na forumu....{#} pa nezz dal je ovo pravo mjesto za pitati, u vezi običnog C-a, bez ++,  gdje mi je greska u kodu

 

Znači, trebam program koji će znamenke unesenog troznamenkastog  broja pomnožiti i ispisati rezultat. Ja sam slozio ovo

 

# include<stdio.h>

int main(void) {

int broj, aa, bb, cc, umno;

printf("upisi broj\n");

scanf("%d", &broj);

aa=broj/100;

bb=(broj%100)/10;

cc=broj%10;

umno=aa*bb*cc;

printf("umnozak znamenaka broja %d je %d ", &broj, &umno);

return 0;

}

 

 

 

i kao rezultat mi ispadaju neki čudni brojevi npr. 2688800 ili tako nešto....

vječno sam zahvalan onome tko mi pomogne {#}

Poruka je uređivana zadnji put uto 15.10.2013 21:49 (Domili).
 
0 0 hvala 0
12 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Domili kaže...

printf("umnozak znamenaka broja %d je %d ", &broj, &umno);

 

i kao rezultat mi ispadaju neki čudni brojevi npr. 2688800 ili tako nešto....

Ispisuješ adrese varijabli broj i umno.

 

& znači adresa varijable, kod scanf-a se koristi da se ta vrijednost pohrani na tu adresu, dok kod printf-a, se ispisuje vrijednost varijable, dakle ne treba ti adresa (&).

11 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Probaj liniju za ispis promijeniti u

 

printf("umnozak znamenaka broja %d je %d ", broj, umno);

10 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
hahah faka sam debilček.... fala puno 
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
C je programski jezik kaže...
No kad crtam po DirectX programu koristeći double buffering filcker je još gori nego u slučaju single. :( tak da izgleda ništa od GDI-a

Jel ti to radiš nekakav trainer/wallhack/aimbot? xD

Za DirectX trebaš rješenje prilagođeno DirectX-u. Tu ti stvarno ne mogu pomoći, DirectX nije moje područje. Ali vjerojatno možeš nešto zgooglati.

What Andy giveth, Bill taketh away.
Poruka je uređivana zadnji put uto 15.10.2013 23:11 (rustweaver).
10 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...
C je programski jezik kaže...
No kad crtam po DirectX programu koristeći double buffering filcker je još gori nego u slučaju single. :( tak da izgleda ništa od GDI-a

Jel ti to radiš nekakav trainer/wallhack/aimbot? xD

Za DirectX trebaš rješenje prilagođeno DirectX-u. Tu ti stvarno ne mogu pomoći, DirectX nije moje područje. Ali vjerojatno možeš nešto zgooglati.

Ne :) zašto bi mi za to trebao GDI. A i ne volim uništavati igrice koje volim.

 

Radi se o posve legitimnom addonu koji pokazuje neke dodatne informacije, kao chat history, neke skripte, etc. Pitao sam i developere, nemaju ništa protiv mog programa.

10 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

jel ima neko slobodan oko pola 6 danas brzo odgovori na par c+ zadataka? spasavajte me ljudiii!!  {#}

 
0 1 hvala 0
12 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
melvudin kaže...

jel ima neko slobodan oko pola 6 danas brzo odgovori na par c+ zadataka? spasavajte me ljudiii!! {#}

Ima, ali ti neće niko htjeti to raditi, zašto nisi učio? A da, sad ćeš reći da je profesor munjen i da ne zna objašnjavati.

10 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Ako hoce neko,bio bih mu zahvalan ;)

10 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Tražim neku jednostavnu funkciju tipa

 

int broj=CreateDialogForEnteringInt("Upišite cijeli broj");

 

znači program već ima svoj parent window, no neznam kako handlati dodatan prozor. Znači kad se pozove funkcija otvori se novi prozor s tekstom "Upište cijeli broj", ispod toga polje u koje se upisuje broj i gumb OK, koji se stisne po završetku unosa. Kad se stisne OK, prozor nestane, funkcija završava i vraća mi unešeni int broj.

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
C je programski jezik kaže...
znači program već ima svoj parent window, no neznam kako handlati dodatan prozor. Znači kad se pozove funkcija otvori se novi prozor s tekstom "Upište cijeli broj", ispod toga polje u koje se upisuje broj i gumb OK, koji se stisne po završetku unosa. Kad se stisne OK, prozor nestane, funkcija završava i vraća mi unešeni int broj.

Funkcija koju tražiš zove se DialogBox (ili CreateDialog ako ti treba modeless prozor)

 

resource.rc

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG1 DIALOG 0, 0, 186, 28
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Upišite cijeli broj"
FONT 8, "Ms Shell Dlg"
{
    DEFPUSHBUTTON   "OK", ID_OK, 129, 7, 50, 14
    EDITTEXT        IDC_EDIT1, 7, 7, 115, 14, ES_AUTOHSCROLL | ES_NUMBER
}

 

resource.h

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDD_DIALOG1                             100
#define IDC_EDIT1                               1002
#define ID_OK                                   1003

 

main.c

#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <commctrl.h>
#include "resource.h"

#define IDC_BROJ 999

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK DialogProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
    HWND hwnd;
    WNDCLASS wc = {0};
    MSG message;

    wc.hInstance      = hThisInstance;
    wc.lpszClassName  = "TestDialogAppClass";
    wc.lpfnWndProc    = WindowProcedure;
    wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground  = (HBRUSH)COLOR_BACKGROUND;

    if (!RegisterClass(&wc))
        return 0;

    hwnd = CreateWindow("TestDialogAppClass", "Dialog test application",
                        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                        CW_USEDEFAULT, CW_USEDEFAULT, 300, 150,
                        NULL, NULL, hThisInstance, NULL);

    while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    return message.wParam;
}

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int broj;
    char text[64];
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
        case WM_CREATE:
            CreateWindow(WC_BUTTON, "Klikni me",
                         WS_CHILD | WS_VISIBLE,
                         10, 10, 75, 23,
                         hwnd, (HMENU)IDC_BROJ, GetModuleHandle(NULL), NULL);
            HANDLE DefaultFont = GetStockObject(DEFAULT_GUI_FONT);
            SendMessage(GetDlgItem(hwnd, IDC_BROJ), WM_SETFONT, DefaultFont, TRUE);
            break;

        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
                case IDC_BROJ:
                    broj = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1),
                                     hwnd, DialogProcedure);
                    InvalidateRect(hwnd, NULL, TRUE);
                    break;
            }
            break;

        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            if (broj)
            {
                snprintf(text, sizeof(text), "Korisnik je upisao broj: %d", broj);
                TextOut(hdc, 10, 60, text, strlen(text));
            }
            EndPaint(hwnd, &ps);
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }

    return 0;
}

INT_PTR CALLBACK DialogProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    char text[32];

    switch (message)
    {
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
                case ID_OK:
                    GetWindowText(GetDlgItem(hwnd, IDC_EDIT1), text, sizeof(text));
                    EndDialog(hwnd, atoi(text));
                    return TRUE;
            }
            break;

        case WM_CLOSE:
            EndDialog(hwnd, 0);
            return TRUE;
    }

    return FALSE;
}

 

Toplo preporučam ovu knjigu ako se misliš time baviti.

What Andy giveth, Bill taketh away.
16 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Čovječe koliko posla za jednu formu, što dobijem sa jednom linijom koda u C#, odnosno VS-u Form1 novaForma = new Forrm1(this)

Sad kužim zašto je onaj C++ builder onako skup.

Poruka je uređivana zadnji put čet 17.10.2013 12:17 (Floki).
 
1 1 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

Čovječe koliko posla za jednu formu

To je nikakav posao. Taj kod je u 99% slučajeva isti i samo radiš copy/paste. Samo što ga je puno pa izgleda zastrašujuće nekome tko nije navikao na to. Kad se privikneš, bauljanje po tome postaje najprirodnija stvar na svijetu, točno znaš gdje je što i zašto je baš tamo...

What Andy giveth, Bill taketh away.
Poruka je uređivana zadnji put čet 17.10.2013 17:39 (rustweaver).
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...
Floki kaže...

Čovječe koliko posla za jednu formu

To je nikakav posao. Taj kod je u 99% slučajeva isti i samo radiš copy/paste. Samo što ga je puno pa izgleda zastrašujuće nekome tko nije navikao na to. Kad se privikneš, bauljanje po tome postaje najprirodnija stvar na svijetu, točno znaš gdje je što i zašto je baš tamo...

Slažem se, a i kôd je 90% isti bez obzira o kojem se jeziku radilo, tako da je lako dalje prevesti u BASIC, pascal i ostale .NET neovisne jezike.

0100001001101111011010100110000101101110
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...
Floki kaže...

Čovječe koliko posla za jednu formu

To je nikakav posao. Taj kod je u 99% slučajeva isti i samo radiš copy/paste. Samo što ga je puno pa izgleda zastrašujuće nekome tko nije navikao na to. Kad se privikneš, bauljanje po tome postaje najprirodnija stvar na svijetu, točno znaš gdje je što i zašto je baš tamo...

OK, htio sam nešto drugo reći, baš trenutno radim nekakve metode za razbiti sliku na dijelove, pa shuffle, pa tajmeri, pa dizanje slike drag i dropom, stvarno da sad radim još ručno formu za opcije, bilo bi puno, to sam mislio reći.

Nije da ne bi mogao napraviti tu formu, imam kod u mapi designer, ali kad ne kužim zašto mi timer ne mijenja vrijednost kod promjene opcije pa debugiram 5 puta, još bi mi samo trebala ručna forma. Na to sam mislio.

U stvari, ionako dosta kontrola moram ručno napraviti, jer su dinamičke.

Poruka je uređivana zadnji put čet 17.10.2013 18:33 (Floki).
13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...
Floki kaže...

Čovječe koliko posla za jednu formu

To je nikakav posao. Taj kod je u 99% slučajeva isti i samo radiš copy/paste. ...

Oko 5 godina sam programirao u dvije ovakve biblioteke a to su Borlandov OWL i MS MFC i ne mogu se složiti da je to nikakav posao. Pogotovo kada se uzmu u obzir malo veći projekti koji se sastoje od 10ak i više prozora to postane jednostavno ogromna količina koda u kojoj se s vremenom sve teže snaći, dok je i samom compileru to sve teže "sažvakati". Sjećam se da smo na fakultetu jedan MFC projekt od 27 prozora pustili da se compilira kroz cijelu noć, dok bi ga testirali tek kroz zasebne module i dll-ove.

 

Obje tvrtke (Borland i MS) su se odrekli ovakvih pristupa programiranju. MS je razvio .NET i "zaboravio" MFC, a Borland umjesto OWL-a razvio VCL. Nema više identifikatora za objekte, objektih mapa za praćenje događaja, već unikatno i .NET i VCL koriste event-e. Rezultat je puno manje koda i puno brže compiliranje. Također je i sam razvoj brži jer programer ne mora ručno deklarirati objekte unutar dijalog klasa, indentifikatore za njih, povezivati identifikatore s funkcijama za događaje i sl., već je to sve automatizirano samim IDE-om.

 

EDIT:

Činjenica je da tehnologija konstantno napreduje i trebalo bi biti u toku s njom. Primjerice, čak i VCL polako pada u zaborav. Iako je trenutno još uvijek jako zastupljen u Delphiju i C++ Buileru Embarcadero se trudi developere prebacivati na novu FireMonkey biblioteku koja podržava win, mac, ios, android, a uskoro i linux, dok VCL tek win platformu. Tako da, za par godina VCL će također biti depricated...

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Poruka je uređivana zadnji put čet 17.10.2013 19:29 (TracerCPP).
16 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Da, onda će taj FireMonkey ozbiljno zaprijetiti .Netu, zamisli, svi mogući OS-ovi u jednom IDE-u.

Poruka je uređivana zadnji put čet 17.10.2013 20:16 (Floki).
 
0 0 hvala 0
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

Da, onda će taj FireMonkey ozbiljno zaprijetiti .Netu, zamisli, svi mogući OS-ovi u jednom IDE-u.

Qt i Qt Creator?

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
Poruka je uređivana zadnji put čet 17.10.2013 20:25 (1domagoj1).
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
1domagoj1 kaže...
Floki kaže...

Da, onda će taj FireMonkey ozbiljno zaprijetiti .Netu, zamisli, svi mogući OS-ovi u jednom IDE-u.

Qt i Qt Creator?

 

Nisam ni to znao, znam samo da je VCL dobar za rad, sličan .Netu po efikasnosti. Ipak sam što se tiče GUI u .Netu, bar za sad, pa ne pratim detaljno stvari na sceni.

Ali sad si mi dao misliti, zašto ne bi na besplatnom IDE-u nešto za Android i napisao, Javu nisam nikad radio, a u C++ bi mogao.

Poruka je uređivana zadnji put čet 17.10.2013 20:34 (Floki).
E-mail:
Lozinka:
 
vrh stranice