Uživatelské nástroje

Nástroje pro tento web


navody:cpp

C++

Instalace překladače fedora

yum install gcc-c++

Překlad

přeloží soubor.cpp na soubor.o s podporou ISO C++ standardu a dalšími parametry

g++ -Wall -Wextra -std=c++0x -pedantic -c <soubor.cpp>

vytvoří spustitelný soubor ze souborů *.o

g++ -Wall -Wextra -std=c++0x -pedantic <soubory *.o> -o <spustitelný soubor>

další parametry

  • -g3 - ladící informace pro debugování
  • -O3 - optimalizace

linkování knihoven

  • -lm - knihovna cmath
  • -pthread - knihovna pro podporu vláken

Příklady kódu

exception

ukázka použití výjimek

#include <iostream>
#include <stdexcept>
 
using namespace std;
 
int main ()
{
    try
    {
        throw runtime_error("nějaká chyba");
    }
    catch (runtime_error &e)
    {
        cerr << e.what() << endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

socket

ukázka TCP serveru, který obslouží každého clienta v samostatném vlákně

#include <string>
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
 
#define PORT 8000
#define BUFFER_SIZE 1024
 
using namespace std;
 
/**
 * enum for actions
 */
enum e_actions
{
    E_SOCKET,
    E_SOCKET_NAME,
    E_QUEUE,
    E_CLIENT,
    E_THREAD
};
 
/**
 * function receive message from client
 */
string receive_message(int client)
{
    char buffer[BUFFER_SIZE] = {0};
    string message = "";
 
    if(recv(client, &buffer, BUFFER_SIZE-1, 0)) // parse header
    {
        message = buffer;
    }
 
    return message;
}
 
/**
 * function for serving of client
 */
void *serve_client(void *param)
{
    int client = *((int *) param);
    cout << receive_message(client) << endl;
 
    return NULL;
}
 
/**
 *  run server
 */
void run()
{
    int s = -1; // number of socket
    // creat socket
    if ((s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
    {
        throw E_SOCKET;
    }
 
    sockaddr_in sock_name;
    sockaddr_in client_info;
    socklen_t addr_len;
 
    sock_name.sin_family = AF_INET;
    sock_name.sin_port = htons(PORT);
    sock_name.sin_addr.s_addr = INADDR_ANY;
    // asign socket name
    if (bind(s, (sockaddr *)&sock_name, sizeof(sock_name)) == -1)
    {
      throw E_SOCKET_NAME;
    }
 
    // create queue
    if (listen(s, 0) == -1)
    {
      throw E_QUEUE;
    }
 
    addr_len = sizeof(client_info);
 
    while(true)
    {
        int client_num = accept(s, (sockaddr*)&client_info, &addr_len);
 
        if (client_num == -1)
        {
            throw E_CLIENT;
        }
        else
        {
            pthread_t thr;
            pthread_attr_t attr;
 
            pthread_attr_init(&attr);
            pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
            if(pthread_create(&thr, &attr, serve_client, (void *) &client_num))
            {
                throw E_THREAD;
            }
            pthread_attr_destroy(&attr);
        }
    }
}
 
/**
 *  main function
 */
int main(int argc, char **argv)
{
    try
    {
        run();
    }
    catch (int e)
    {
        cerr << "Error number: " << e << endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

stream

přečte text ze souboru, který je předán jako první argument

#include <iostream>
#include <fstream>
#include <sstream>
 
using namespace std;
 
int main(int argc, char **argv)
{
    if(argc != 2)
    {
        cerr << "Chyba v argumentech!" << endl;
        return EXIT_FAILURE;
    }
 
    ifstream file(argv[1]);
 
    if (!file)
    {
        cerr << "Soubor nelze otevřít!" << std::endl;
        return EXIT_FAILURE;
    }
 
    stringstream buffer;
    buffer << file.rdbuf();
    file.close();
 
    return EXIT_SUCCESS;
}

zapíše text do souboru

#include <string>
#include <iostream>
#include <fstream>
 
using namespace std;
 
ofstream output("<soubor>");
 
if (!output)
{
    cerr << "Do souboru nelze zapsat!" << endl;
}
else
{
    string text = "nějaký text";
    output << text;
    output.close();
}

vector

aritmetický průmer z hodnot vektoru

#include <vector>
#include <numeric>
 
using namespace std;
 
vector<double> values = {0.1, 0.5, 0.8};
double avg = accumulate(values.begin(), values.end(), 0.0)/values.size();

iterator vektoru

#include <vector>
#include <iostream>
 
using namespace std;
 
vector<int> values = {5, 3, 8};
for (vector<int>::iterator it = values.begin(); it!=values.end(); ++it)
{
    cout << *it << endl;
}

přidá na konec prvního vektoru druhý vektor

#include <vector>
 
using namespace std;
 
vector<int> vector1 = {1, 2, 3};
vector<int> vector2 = {4, 5, 6};
vector1.insert(vector1.end(), vector2.begin(), vector2.end());

funkce, která rozhodne, jestli vector v obsahuje číslo x

#include <algorithm>
#include <vector>
 
using namespace std;
 
bool contain_number(vector<int> &v, int x)
{
    return (find(v.begin(), v.end(), x) != v.end());
}
navody/cpp.txt · Poslední úprava: 2013/03/19 20:32 autor: jules