Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ apua?

Sivun loppuun

DjAS [07.09.2005 22:18:44]

#

Eli, c++ on minulle vielä tuntematonta. Hankin DEV-C++ kääntäjän. Nyt kuitenkin, mistä aloitan? Jos otan täältä jonkun c++ koodin, niin mitä minun pitää tehdä? Lisään sen sinne kääntäjään? Mitä sitten. Jos laitan laskimen koodin, miten voin vaikka käynnistää laskimen ja muuta?
Kiitän.

hunajavohveli [07.09.2005 22:22:43]

#

Suosittelen, että lähdet aloittelemaan ensin C:n kanssa. Tästä oppaasta voisi olla hyvä lähteä liikkeelle: https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=cohj_1

squid [08.09.2005 06:58:00]

#

C++ on ihan hyvä myös aloittelijalle, jos vain jaksaa miettiä asioita. Mielestäni hyvä opas on esimerkiksi http://www.nic.funet.fi/c opas/ jonka avulla minäkin olen päässyt hyvään alkuun.

hunajavohveli [08.09.2005 08:13:39]

#

Kyllä C:ssä on aloittelijalle ihan riittävästi oppimista. C++:aan voi laajentaa sitten, kun alkaa oikeasti kaivata sen lisäominaisuuksia, ja kun on saanut jonkinlaisen peruskäsityksen ohjelmoinnista yleensä.

Linkku [08.09.2005 08:32:20]

#

Kyllä siitä C++:sta on hyvä alottaa niin ei heti ensimmäisenä lyödä päätä seinään merkkitaulukkojen kanssa kun voi käyttää kätevää string-luokkaa.

Ja kyllä ne alkeet oppii lähes millä kielellä tahansa. Ohjelmointi kannattaa ehkä aloittaa "helpommilla" kielillä kuten PHP:llä tai Perlillä niin ei saa ohjelmaa heti kaatumaan ensimmäisestä memcpy:stä.

Jos on jo ohjelmoinnin perusteet hallussa niin sitten vaan tutkimaan C++:n luokkia, pointtereita, viittauksia ja kaikkea muuta.

DjAS [10.09.2005 16:19:47]

#

örrh.. No joo. Tässä hieman tekstinpätkää jostain "oppaasta".

"Tässä määritellään pääfunktio. Jokaisessa C++-ohjelmassa pitää olla main()-osio. void tarkoittaa että main() osa ei palauta arvoa, mistä meidän ei vielä tarvitse välittää sen enemmän kuin suluistakaan. Tässä esitetty tapa on kuitenkin aivan oikea, tosin "oikeissa" ohjelmissa olisi kiltti tapa palauttaa paluuarvo."

Mitä ovat funktiot, pääfunktiot, arvo, paluuarvo?! Voi jeesus.. Ja sitten vielä. Otanko täältä jonkun koodin ja lyön kääntäjään? Toimiiko se sitten ja saan iloita? Miksi tämä on niin vaikeaa. Tuolta etsin jonkun hirsipuun koodin. Mitäs sitte. Laitanko suoraan exeen. Niin muuten tein. Ei tapahtunu mitään. Kertokaa, kiitän.

remontti-reiska [10.09.2005 16:32:10]

#

Alota nyt tuosta hunajavohvelin antamasta oppaasta. Siinä kerrotaan ohjelman kirjoitus- ja käännösvaiheesta kaikki tarvittavat tiedot. On siinä jopa ensimmäisen ohjelman koodikin jo valmiina.

Blaze [10.09.2005 16:39:39]

#

DjAS kirjoitti:

"Tässä määritellään pääfunktio. Jokaisessa C++-ohjelmassa pitää olla main()-osio. void tarkoittaa että main() osa ei palauta arvoa, mistä meidän ei vielä tarvitse välittää sen enemmän kuin suluistakaan. Tässä esitetty tapa on kuitenkin aivan oikea, tosin "oikeissa" ohjelmissa olisi kiltti tapa palauttaa paluuarvo."

Mitä ovat funktiot, pääfunktiot, arvo, paluuarvo?!

Hyvän oppaan kirjoittaminen on taitolaji. Tässä ei ilmeisesti olla oikein onnistuttu.

Kannattaa myös huomata, että vasta-alkajille ja toista kieltä opettelevalle suunnatut oppaat ovat tyystin erilaisia, kannattaa tarkistaa, että oman oppaan kohderyhmä on se oikea.

DjAS kirjoitti:

Otanko täältä jonkun koodin ja lyön kääntäjään?

Valmista koodia tutkimalla ja muuttelemalla voi oppia, mutta muista, että pelkästään copypasteamalla ei opi mitään.

DjAS [10.09.2005 17:25:15]

#

"Ensimmäisen C-ohjelman nimi on testi.c, ja se tulostaa näytölle tekstin "C-ohjelmointi on kivaa!"

Vai niin. Siinä oli se koodi perässä. Lisään sen siis kääntäjään (ja tallennan nimellä testi.c ?). No.. mutta joo.
Jos tallennan sen tiedostonimellä testi.c, ja sitten menen kansioon mihin olen sen tallentanut, ja avaan sen, niin se testi.c avautuu tuossa kääntäjässä. Mielellään näkyisi jossain ikkunassa? On tämä vaan vaikeaa...

Blaze, olen juuri html:n oppinut koodia tutkimalla, mutta c++ on vaikeampaa, siksi olen nyt näin nyyppä.

Heikki [10.09.2005 17:54:55]

#

Kannattaa lukaista Antin opas näin pääset alkuun ohjelmoinnissa.

Sinun on käännettävä se C-kielinen koodi (.c tiedosto) konekielelle kääntäjällä. Dev-C++:ssa on compile-toiminto valikossa. Myös compile&run toiminto löytyy, joka kääntää ohjelman ja ajaa sitten käännetyn ohjelman.

DjAS [10.09.2005 18:04:39]

#

Näin joo... Ei ei ei... kokeilin molempia vaihtoehtoja (compile-toiminto/compile&run toiminto), ja ruutu
vaan välkähti.

"Pahimmassa tapauksessa hommasta menee maku heti kättelyssä." Tämä on jo lähellä... jos saisi edes pienen kipinän, niin voisi tästä jotain tulla.

Metabolix [10.09.2005 18:11:32]

#

Ohjelman saa pysymään, kun lisää ennen return 0; -riviä kerran tai pari koodin fgetc(stdin); joka odottaa enteriä. Kaksi tarvitaan ainakin sitten, kun ohjelma lukee käyttäjältä muutenkin jotakin.

DjAS [10.09.2005 18:15:56]

#

Jesjesjes, "plaaplaa\testi.exe NT:n näennäinen DOS-kone kohtasi laittoman käskyn. CS:plaaplaa" Hyvin alkaa tämäkin taival.

Metabolix [10.09.2005 18:22:32]

#

Millä oikein käännät sitä? Ei tässä hommassa mitään DOS-näennäiskonetta kuuluisi olla edes mukana.

Jos tuo kerran tuli viimeisen muutoksen jälkeen, niin kokeile sitten, toimiiko, jos laitat fgetc(stdin); paikalle system("pause"); (En voi kuitenkaan suositella tätä tapaa)

DjAS [10.09.2005 18:29:16]

#

DEV-C++. No, sain sen toimimaan molemmilla tavoilla (fgetc(stdin); , ("pause");), kun painoin "Run" - ohjelmassa.
Sitten. Miten koko homman saisi siten, että tallentaa johonkin kansioon, ja sieltä sitten käynnistää tämän ikkunan (esim.exe?)?

Metabolix [10.09.2005 18:41:41]

#

Kun olet sen kääntänyt, niin se exe kyllä on jossakin. Hyvin mahdollisesti siellä, minne tuon koodinkin tallensit. Jos teet Dev-C++:lla uuden projektin, niin voit sitten sen asetuksista määrätä, minne sen exe käännettäessä ilmestyy.

Dev-C++ ei muuten ole kääntäjä vaan kehitysympäristö. Kääntäjäsi on siis ilmeisesti MinGW. Ihmettelin vain tuota DOS-näennäiskonetta, kun se yleensä viittaa johonkin DOS ohjelmaan ja -kääntäjään.

DjAS [10.09.2005 19:05:52]

#

Okei, en löytänyt mistään mitään .exe tiedostoa, vaikka mistä etsin, ja olen myös koodin kääntänyt. Joku varmaan kädestä pitäen sanoo, miten saan sinne sen toimivan .exe tiedoston, niin sitten varmaan alkaisi kulkea :).

Ja näitä projektejakin on enemmän kuin monta. Minkä niistä valitsen

Metabolix [10.09.2005 19:15:47]

#

Minne olet tallentanut koodin? Kun tein pikaisesti tiedoston C:\Dev-Cpp\Release\Untitled1.cpp ja käänsin, ilmestyi C:\Dev-Cpp\Release\Untitled1.exe.

Voit myös katsoa alareunasta kohdasta Compile Log. Sieltä pitäisi löytyä rivi, joka alkaa g++.exe tai gcc.exe. Samalta riviltä löytyy jostakin kohti -o "C:\jne_jne\jotakin.exe" eli exe-tiedoston sijainti.

DjAS [10.09.2005 19:49:56]

#

Jesjesjes. Kiitäkiitän. Nyt sain sen toimimaan. Ehhe, nyt tuleekin se kysymys, "mitäs sitte" :D. Jaa-a. Hmm. Rupean varmaaan tutkimaan koodeja ja sitä myötä sitten jotain tekemään.

EDIT:

Niin joo! Tuohan avaa se ainakin XP:llä tuommoisessa dossin tapaisessa ikkunassa. Saisiko sen avautumaan ihan perinteiseen ikkunaan?

Meitsi [10.09.2005 20:23:05]

#

Kyllä ja ei. Sinun pitää opetella käyttämään Windows API:a, jonka opettelu ei ilmeisesti ole vielä ajankohtaista, jos ensimmäistä ohjelmaasi käänsit.

Metabolix [10.09.2005 20:23:49]

#

Tuota kutsutaan konsoliohjelmaksi :) Windows-ohjelmat ovat sata kertaa mutkikkaampia, kun niissä on sellaistakin pohdittavaa kuin tekstin koko ja fontti sekä tekstin sijainti ikkunassa, puhumattakaan viestinkäsittelystä. Jos kiinnostaa, niin voit luoda Dev-C++:lla uuden projektin ja valita vaihtoehdon Windows Application. Muistaakseni esimerkki vain luo ikkunan, ja jo siinä on koodia vaikka millä mitalla (aloittelijan näkökulmasta).

Harjoittele nyt ensin vähän perusteita ihan konsoliohjelmilla, jotta varmasti osaat. Sitä seuraavaksi askeleeksi voin vihjata, että opasalueelta löytyy SDL-opas, jolla pääsee mukavasti alkuun visuaalisemmassa puolessa, vaikka SDL on kyllä enemmän peliohjelmointiin soveltuva kirjasto. Sitten on kaikenlaisia muitakin kirjastoja, kuten wxWidgets ja GTK. Windows-ohjelmointiin noin ihan WinAPIlla löytyy vain muutama koodivinkki, mutta siinä kyllä pääsee pitkälle kokeilemalla (ja Googlella). Kysyä saa tietenkin aina.

Juice [10.09.2005 20:35:34]

#

Dossin tapaisessa ikkunassa? Eli konsolissa? "Tavallinen" ikkuna on sitten WinAPI:n/wxWidgetsin/jonkin muun kirjaston aikaansaannosta. Tässä ikkunakoodi WinAPIlla:

#include <windows.h>

// Function prototypes.
LRESULT WINAPI WndProc(HWND hWnd, UINT msg,
    WPARAM wParam, LPARAM lParam);
void RegisterWindowClass(HINSTANCE hInstance);
void CreateAppWindow(HINSTANCE hInstance);
WPARAM StartMessageLoop();

// Global variables.
HWND g_hWnd;

//////////////////////////////////////////////////////
// WinMain()
//////////////////////////////////////////////////////
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, INT)
{
    RegisterWindowClass(hInstance);
    CreateAppWindow(hInstance);
    ShowWindow(g_hWnd, SW_SHOWDEFAULT);
    UpdateWindow(g_hWnd);
    INT result = StartMessageLoop();
    return result;
}

//////////////////////////////////////////////////////
// WndProc()
//////////////////////////////////////////////////////
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_CREATE:
        return 0;

    case WM_DESTROY:
        PostQuitMessage( 0 );
        return 0;

    case WM_PAINT:
        ValidateRect(g_hWnd, NULL);
        return 0;
    case WM_KEYDOWN:
        switch(wParam)
        {
            case VK_ESCAPE:
                PostQuitMessage(WM_QUIT);
                break;
        }
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

//////////////////////////////////////////////////////
// RegisterWindowClass()
//////////////////////////////////////////////////////
void RegisterWindowClass(HINSTANCE hInstance)
{
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "WinApp";
    wc.hIconSm = NULL;

    RegisterClassEx(&wc);
}

//////////////////////////////////////////////////////
// CreateAppWindow()
//////////////////////////////////////////////////////
void CreateAppWindow(HINSTANCE hInstance)
{
    g_hWnd = CreateWindowEx(
        NULL,
        "WinApp",
        "Hellou Wöörld WINAPIlla",
        WS_OVERLAPPEDWINDOW,
        100,
        100,
        648,
        514,
        GetDesktopWindow(),
        NULL,
        hInstance,
        NULL);
}

//////////////////////////////////////////////////////
// StartMessageLoop()
//////////////////////////////////////////////////////
WPARAM StartMessageLoop()
{
    MSG msg;
    while(1)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            // Use idle time here.
        }
    }
    return msg.wParam;
}

Ja tässä wxWidgetsillä:

#include <wx/wx.h>

class
wxWidgets_harjoitteluapp : public wxApp
{
    public:
        virtual bool OnInit();
};

class
        wxWidgets_harjoitteluFrame : public wxFrame
{
    public:
        wxWidgets_harjoitteluFrame( const wxString& title, const wxPoint& pos,
                                    const wxSize& pos );
        void OnQuit( wxCommandEvent& event );
    private:
        DECLARE_EVENT_TABLE()
};

enum
{
    Menu_File_Quit = 100
};

BEGIN_EVENT_TABLE( wxWidgets_harjoitteluFrame, wxFrame )
	EVT_MENU( Menu_File_Quit, wxWidgets_harjoitteluFrame::OnQuit )
END_EVENT_TABLE()

IMPLEMENT_APP(wxWidgets_harjoitteluapp)


bool
wxWidgets_harjoitteluapp::OnInit()
{
	wxWidgets_harjoitteluFrame *frame = new wxWidgets_harjoitteluFrame( wxT( "Hello World" ), wxPoint(50,50), wxSize(450,340) );

	frame->Show(TRUE);
	SetTopWindow(frame);
	return TRUE;
}

wxWidgets_harjoitteluFrame::wxWidgets_harjoitteluFrame( const wxString& title, const wxPoint& pos, const wxSize& size )
	: wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
	wxMenu *menuFile = new wxMenu;

	menuFile->Append( Menu_File_Quit, wxT( "E&xit" ) );
   wxMenuBar *menuBar = new wxMenuBar;
	menuBar->Append( menuFile, wxT( "&File" ) );

	SetMenuBar( menuBar );

	CreateStatusBar();
	SetStatusText( wxT( "Welcome to Kdevelop wxWidgets app!" ) );
}

void
wxWidgets_harjoitteluFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) )
{
	Close(TRUE);
}

Koodi saattaa sisältää maapähkinää. wxWidgetsillä sama koodi toimii monella alustalla, winapi vain windowsilla. Lisäksi wxWidgets on IMO selkeämpää. Alkuun se näyttää puurolta, mutta kun sitä oppii, se selkenee nopeasti. Suosittelen kirjaa "Cross-Platform GUI Progamming with wxWidgets (ISBN 0-13-147381-6, kirjoittanut Dr. Julian Smart, Kevin Hock ja Stefan Csomor). Mutta joo, ehkä ne alkeet kannattaa opetella ihan konsolissa ;)

EDIT: Hih. Tätä romaania vääntäessä kaksi ennätti edelle.
EDIT2: Ja sitten tuo wxWidgets-koodi on joitakin muinaisia harjoitteluohjelmiani, mutta näyttipä tuo toimivan.

DjAS [10.09.2005 21:38:27]

#

:D. Niin aivan. Nyt en yhtään tiedä mitä tässä tekisi, kun ei mitään ymmärrä, ja koodeista ei saa mitään selkoa. Ja voin vaan kuvitella kun te repeilette siellä ruutujen äärellä kun luette tätä keskustelua :D. Kannattaisi minun aloittaa jostain
legendaarisesta love calculatorista? :D.

Metabolix [10.09.2005 21:48:39]

#

Kivoja pikkuohjelmia ovat esimerkiksi laskin, keskiarvolaskuri, laivanupotus tai vaikka pieni tekstiseikkailu (mielellään laajennettava eli tiedostosta ladattava). Mitä nyt voit kuvitella konsoliin tekeväsi ilman apukirjastoja? Oikeastaan yllättävän paljon :)

DjAS [10.09.2005 22:35:40]

#

Niinkuin ymmärrätte, en voi nyt tyhjästä aloittaa. Tuntuu oudolta katsoa koodeja ja ihmetellä, mitä tuo ja tuo tarkoittaa. Ja jos hieman sekoittelen koodeja, niin siitä ei tule kuin harmaita hiuksia ja ripaus erroreita.

EDIT: Ai niin joo! Aloitin Dev-C++:ssa uuden Windows .. projektin. Sitten tein siihen projektiin semmosen tyhjän jutun, ja laitoin toimivan
koodin siihen. Kun sitten tein noiden ohjeiden mukaan, ja painoin exe ikkunaa, niin tuli tiimalasi vähäksi aikaa, ja sen jälkeen mitään ei tapahtunut. :(

Megant [11.09.2005 12:23:10]

#

Ei se ole nuin yksinkertaista.Opettele nyt kunnolla tekemään konsoliohjelmia.Windows-ohjelmia et tee vielä pitkään aikaan.Luulisin ;)

Zach [11.09.2005 14:10:44]

#

Pienestä kannattaa lähteä. Lainaa jokin hyvä kirja, opettele kieltä vähitellen ja sovella oppimaasi pieniin ohjelmiin. Ensimmäinen oma "toimiva" ohjelmani oli painoindeksilaskuri, josta olin silloin aika ylpeä (se jopa arvioi tulosta: "Olet normaalipainoinen" tms.). Nykyään silloinen koodi näyttää niin hirveältä, että melkein itkettää. ;D

peran [12.09.2005 00:02:19]

#

Juice kirjoitti:

Dossin tapaisessa ikkunassa? Eli konsolissa? "Tavallinen" ikkuna on sitten WinAPI:n/wxWidgetsin/jonkin muun kirjaston aikaansaannosta.
Ja tässä wxWidgetsillä:

BEGIN_EVENT_TABLE( wxWidgets_harjoitteluFrame, wxFrame )
	EVT_MENU( Menu_File_Quit, wxWidgets_harjoitteluFrame::OnQuit )
END_EVENT_TABLE()

IMPLEMENT_APP(wxWidgets_harjoitteluapp)

Öh, en ole mikään C++ guru, mutta onkohan seuraavat rivit joitain makroja, kun en ymmärrä. Ts. Voisitko selventää mitä ko. rivit tekevät.
Näyttäisi käsittelevän windows-viestejä, mutta kun en ymmärrä.
(Ei se nyt suoraan auennut muutenkaan, mutta win-api oli ennestään hiukan tuttua.)

Linkku [12.09.2005 08:51:13]

#

IMPLEMENT_APP määrittää ohjelman "main-funktion".

Event-tableilla taas määritellään makroilla tapahtumat ja niiden käsittelijät. Tässä annetaan valikkoelementille "Menu_File_Quit" käsittelijäksi funktio wxWidgets_harjoitteluFrame::OnQuit.

Tapahtumankäsittelijöitä voidaan asettaa myös ohjelman ajon aikana dynaamisesti (kuten QT:ssä) wxEvtHandler::Connect-funktiolla.

squid [12.09.2005 09:03:50]

#

Lueskelin tuota keskustelua, ja hiukan mietiskelin. Ensinäkin, tuo minun aikaisemmin antama opas on aloittelijalle suunnattu, ja se jopa on suht ajantasalla.

Ai niin, minäkään en osaa vielä kunnolla tehdä(tosin en oo oikein opetellu) noita ikkunaohjelmia, vaikka jo vuoden verran on tullot "koodattua" c++:aa

rutkis [13.09.2005 11:57:11]

#

BEGIN_EVENT_TABLE ja IMPLEMENT_APP yms ovat makroja. Vaikka en ole koskaan wxwidgetiä ikinä käyttänytkään. Itse suosin WTL:n makroja windows-viestien käsittelyyn.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta