Jump to content

S.L.C

Active Members
  • Posts

    100
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by S.L.C

  1. Problema este ca textul atunci cand este trimis in mod literal (daca ma exprim corect) catre functia ta, este const. Chiar daca functia ta il primeste non-const. Si cred ca este normal sa primesti "segmentation fault" atunci cand incerci sa modifici un text declarat const.

    Motivul pentru care trebuie textul trebuie salvat intr-o variabila pe care o poti modifica. Exemplu:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    /* Preferably use unsigned integers as index arrays since arrays don't have negative indexes. */
    void removeString(char * str, unsigned int pos, unsigned int num)
    {
    unsigned int len = 0; /* <- NOTE: Calculate the string length after testing against NULL! */

    if ((str == NULL) || ((len = strlen(str)) == 0) || /* <- Is there even a string to parse? */
    ((pos + num) > len)) /* <- Are we in string bounds? */
    {
    return; /* <- Nothing to parse / Nothing to print */
    }

    /* Shift values back and leave room for the compiler to optimize */
    strncpy(str + (pos), str + (pos+num), len - (pos+num)+1);
    /* memcpy(str + (pos), str + (pos+num), (len - (pos+num)+1) * sizeof(char)); */

    /* Print result */
    printf("-- %s\n", str);
    }


    int main (void)
    {
    void removeString(char * str, unsigned int pos, unsigned int num);

    /* This fails because the string is constant. And a constant cannot be modified! */
    /* removeString("the wrong son", 4, 6); */

    printf("Test valid arguments\n");

    char str[] = "the wrong son";
    removeString(str, 4, 6);

    printf("Test empty string\n");

    char empty_str[] = "";
    removeString(empty_str, 4, 6);

    printf("Test null string\n");
    removeString(NULL, 4, 6);

    printf("Test out of bounds\n");

    char bounds_str[] = "the wrong son";
    removeString(bounds_str, 27, 5);

    printf("Test a single character\n");

    char single_str[] = "the wrong son";
    removeString(single_str, 5, 1);

    printf("Test no character\n");

    char none_str[] = "the wrong son";
    removeString(none_str, 5, 0);

    printf("Test the last character\n");

    char last_str[] = "the wrong son";
    removeString(last_str, 12, 1);

    printf("Test one past the last character\n");

    char past_str[] = "the wrong son";
    removeString(past_str, 13, 1);

    return EXIT_SUCCESS;
    }

    @MrGrj se refera la:


    int main (void)
    {
    void removeString(char * str, unsigned int pos, unsigned int num);

    printf("Test valid arguments\n");

    char * str = (char *)malloc(14 * sizeof(char)); /* Allocate memory for 14 characters (including null) */

    /* Check the allocated memory */
    if (str == NULL)
    {
    printf("No more memory!");
    return EXIT_FAILURE;
    }

    strcpy(str, "the wrong son"); /* Copy the string into the allocated memory */

    removeString(str, 4, 6); /* Deal with it */

    free(str); /* Remember to release manually allocated memory */

    return EXIT_SUCCESS;
    }

    Imi cer scuze ca am intervenit si am adaugat exemplul pe care l-ai promis tu.

  2. ... fatza ...
    ... potzi ...

    Omule si eu sunt retard la romana dar nu pot sa te iau in serios cu asa ceva. De ce "complicatii" si nu "complicatzii"? sau de ce "oportunitati" si nu "oportunitatzi"? Daca tot incepi un lucru atunci tine-te de el.

    Oricum nu prea inteleg FB. Am cont dar nu prea inteleg ce atata bataie de cap si de ce se omoara toata lumea pentru ce se intampla FB.

    Toata ziua "De ce mi-ai dat like?", "De ce nu mi-ai dat like?", "De ce nu ti-ai schimbat statusul?". Pentru mine este doar amuzament. Adica --> link

    Poate ca este mai bine la aia fara internet. Asta daca internetul pe care il va oferii FB se aplica doar pentru FB si partenerii (adica alte siteuri de socializare).

    EDIT: Si chiar nu vad ce treaba are asta cu programarea :-/

  3. Pai iti spun eu parerea mea.

    Nu este practic pentru aplicatii cotidiene. Si este si greu de programat. Doar daca ai lucrat numai in el ti se va parea simplu.

    Adevarat :D Si pe langa asta mai este problema cu diferentele dintre platforme, compilere, arhitecturi. Sa nu mentionez bibliotecile (am vazut ca se face mofturi pentru "librarii") Si cu cat doresti sa lucrezi cat mai aproape de hardware cu atat devine mai dificil.

    Bineinteles, daca te limitezi la programe simple (consola) si folosesti C++ doar de dragul <iostream> (nici macar lucrurile utile gen <vector>, <memory>), esti de parere ca extensia .cpp face fisierele sa arate mai sexy. Si cand auzi la cineva cuvantul "templates" te duci cu gandul la proiecte predefinite in MSVC. Atunci normal ca nu ti se pare complicat.

    Dar noile imbunatatiri aduse fac viata putin mai usoara. Parerea mea.

  4. If you want a cleaner way of doing things and your compiler supports the majority of C++11 concepts. I suppose you could use the allocator that comes with it. Here's an example:

    #include <iostream>
    #include <memory>

    int main(int argc, char **argv)
    {
    // Instantiate some allocators
    std::allocator<char> allocator1;
    std::allocator<int> allocator2;

    // See how many you can afford
    std::cout << "Can allocate a max of " << allocator1.max_size() << " chars \n";
    std::cout << "Can allocate a max of " << allocator2.max_size() << " ints \n";

    // Allocate the desired number of specified types
    char * a = allocator1.allocate(35);
    int * b = allocator2.allocate(20);

    // Work with your memory
    // ...

    // Deallocate/Release it!
    allocator1.deallocate(a, 35);
    allocator2.deallocate(b, 20);

    return 0;
    }

    Safer (for you) because you'll get exceptions on failure and no more sizeof calculations or other stuff. You just say how many elements of the specified type you need memory for.

    Tested with MinGW GCC 4.9.3 but should work with 5.1.0 as well or 5.2.0 for that matter. Not sure about which VS version though :D

  5. Posibil sa fie ceva legat de caching? Zic si eu :-/

    EDIT: Inca o chestie. Daca folosesti un shared host si mai ales unul gratis. Dupa un anumit numar de pagini incarcate de un client, serverul va trimite o pagina goala pentru o perioada scurta de timp. Depinde cat de frecvent este executat acel cron job.

  6. Ceva nou pentru mine, nu stiam ca o structura poate avea constructori. Asta este chiar nou. Stiu ca ma cam fac de ras dar pur si simplu nu scrie in nici o carte pe care o am eu de asa ceva. :">

    O structura se comporta exact ca o clasa. Defapt, chiar este o clasa. Singura diferenta este ca o structura are membri publici in mod implicit pe cand o clasa are membri privati in mod implicit.

    Exemplu:

    #include <cstdlib>
    #include <cstdio>

    struct A
    {
    int Member;
    };

    class B
    {
    int Member; // error: 'int B::Member' is private
    };

    class C
    {
    public:
    int Member;
    };

    int main(int argc, char **argv)
    {
    A a;
    B b;
    C c;

    printf("A %d \n", a.Member);
    //printf("B %d \n", b.Member); // error: within this context
    printf("C %d \n", c.Member);

    return EXIT_SUCCESS;
    }

    Am comentat liniile care produc eroare.

    Dar cred ca tu intrebi de initializer lists (nu stiu cum se numesc in romana). Mai exact portiunea dupa constructor:

    : bits(""), frequency(0.0f)

    Probabil esti obisnuit sa le vezi asa:

    MyStruct()
    {
    bits = "";
    frequency = 0.0f;
    };

    Dar acum incearca sa-ti imaginezi ca "frequency" este const. Cum il vei initializa acum?

    Daca incerci metoda clasica te asigur ca vei avea probleme:

    #include <cstdlib>
    #include <cstdio>

    struct A
    {
    const int Member;
    A() // error: uninitialized const member in 'const int' [-fpermissive]
    {
    Member = 0; // error: assignment of read-only member 'A::Member'
    }
    };

    int main(int argc, char **argv)
    {
    A a;

    printf("A %d \n", a.Member);

    return EXIT_SUCCESS;
    }

    Motivul pentru care se foloseste initializer lists:

    #include <cstdlib>
    #include <cstdio>

    struct A
    {
    const int Member;
    A() : Member(0)
    {

    }
    };

    int main(int argc, char **argv)
    {
    A a;

    printf("A %d \n", a.Member);

    return EXIT_SUCCESS;
    }

    Bineinteles, mai sunt si alte beneficii dar nu voi intra prea mult in detalii. Rareori initializez membrii unei classe in corpul constructorului.

    • Upvote 1
  7. Sincer, cred ca intrebarea este putin inutila. Si incep sa o intalnesc foarte des in ultimul timp. De ce toata lumea este este asa de fixata pe invatarea unui limbaj de programare? Parerea mea este ca limbajul de programare este doar un concept cu multe forme in functie de necesitati.

    Trebuie sa iti imaginezi un limbaj de programare ca fiind of piesa dintr-un puzzle. Si daca doresti sa faci un simplu text editor (sa zicem). Tot trebuie sa invezi cum sa structurezi textul, cum sa identifici anumite cuvinte cheie (daca este necesar), cum sa-l afisezi pe ecran, cum sa implementezi un sistem de undo/redo etc. Ele fiind restul pieselor din puzzle.

    Pot sa obtin acelasi lucru folosind mai multe limbaje de programare. Unele fiind mai bine echipate pentru acest lucru decat altele.

    Dute si invata C++ pana nu mai poti. Apoi apucate sa faci un proiect doar cu limbajul invatat. In foarte scurt timp vei realiza ca doar limbajul nu te ajuta. Parerea mea :-/

  8. Din cate am inteles eu tu vrei sa declari o clasa (adica un nou tip) la run-time in functie de ce date primesti. Daca am inteles bine atunci pot spune ca nu este posibil. Deci sa fie clar. Nu poti declara o clasa, functie sau ce vrei tu, dupa ce programul a fost asamblat. Poti sa creezi instante din clase/tipuri deja declarate. Daca am inteles gresit atunci imi cer scuze.

    Poate daca incorporezi o limba dinamica precum Lua, Squirrel etc. in programul tau principal. Te poti folosii de dinamismul acelor limbi de programare pentru a obtine cea ce vrei tu. (am destula exprienta cu Squirrel si pot spune ca este foarte usor de folosit si suporta OOP)

  9. Putin complex din cate vad (imi cer scuze daca intr-adevar este). Dar cred ca rezultatul este cea ce cauti.

    Atentie: Necesita un compiler recent. GCC 4.7+ sau VS 2013+ (posibil sa functioneze si pe un compiler mai vehi dar nu garantez)

    Testat pe MinGW GCC 4.9.2 x32

    #include <map>
    #include <string>
    #include <cstdlib>
    #include <iostream>
    #include <functional>

    class Menu
    {
    protected:
    typedef std::function<int (Menu &)> Callback;
    typedef std::map<int, Menu> SubMenus;
    public:
    Menu()
    : m_Id(0), m_Name(""), m_Handler(nullptr)
    {

    }

    Menu(int id, const std::string & name, Callback clbk)
    : m_Id(id), m_Name(name), m_Handler(clbk)
    {

    }

    Menu & operator [] (int id)
    {
    return m_Childrens.at(id);
    }

    int Enter()
    {
    int result = 0;

    if (m_Handler)
    result = m_Handler(*this);

    return result;
    }

    void Insert(const Menu & menu)
    {
    m_Childrens[menu.m_Id] = menu;
    }

    void Insert(int id, const std::string & name, Callback clbk)
    {
    m_Childrens[id] = Menu(id, name, clbk);
    }

    void Remove(int id)
    {
    m_Childrens.erase(id);
    }

    int GetId() const
    {
    return m_Id;
    }

    const std::string & GetName() const
    {
    return m_Name;
    }

    const Callback & GetHandler() const
    {
    return m_Handler;
    }

    bool IsChildren(int id) const
    {
    return (m_Childrens.find(id) != m_Childrens.cend());
    }

    Menu & GetChildren(int id)
    {
    return m_Childrens.at(id);
    }

    const SubMenus & GetChildrens() const
    {
    return m_Childrens;
    }
    private:
    int m_Id;
    std::string m_Name;
    Callback m_Handler;
    SubMenus m_Childrens;
    };

    void ClearScreen()
    {
    system("cls");
    }

    int SharedMenuDisplay(const Menu & menu)
    {
    ClearScreen();

    std::cout << "Welcome to " << menu.GetName() << std::endl;

    for (const auto & m : menu.GetChildrens())
    {
    std::cout << "> " << m.second.GetId() << " - " << m.second.GetName() << std::endl;
    }

    std::cout << "> 0 - Go Back" << std::endl;

    std::cout << "Please select a sub menu: ";

    int choice;

    std::cin >> choice;

    return choice;
    }

    int Menu_Home(Menu & menu)
    {
    int choice;
    int result = 0;

    do {
    ClearScreen();

    std::cout << "Welcome to " << menu.GetName() << std::endl;

    for (const auto & m : menu.GetChildrens())
    {
    std::cout << "> " << m.second.GetId() << " - " << m.second.GetName() << std::endl;
    }

    std::cout << "> 0 - To Leave" << std::endl;

    std::cout << "Please select a sub menu: ";

    std::cin >> choice;

    if (choice != 0 && menu.IsChildren(choice))
    result = menu.GetChildren(choice).Enter();

    } while (choice != 0);

    return result;
    }

    int Menu_A(Menu & menu)
    {
    int choice;
    int result = 0;

    do {
    choice = SharedMenuDisplay(menu);

    if (choice != 0 && menu.IsChildren(choice))
    result = menu.GetChildren(choice).Enter();

    } while (choice != 0);

    return result;
    }

    int Menu_A_SubMenu_X(Menu & menu)
    {
    ClearScreen();
    std::cout << "You have selected " << menu.GetName() << std::endl;
    std::cout << "> Type something and press Enter to go back..." << std::endl;

    std::string str;
    std::cin >> str;

    return 0;
    }

    int Menu_A_SubMenu_Y(Menu & menu)
    {
    ClearScreen();
    std::cout << "You have selected " << menu.GetName() << std::endl;
    std::cout << "> Type something and press Enter to go back..." << std::endl;

    std::string str;
    std::cin >> str;

    return 0;
    }

    int Menu_A_SubMenu_Z(Menu & menu)
    {
    ClearScreen();
    std::cout << "You have selected " << menu.GetName() << std::endl;
    std::cout << "> Type something and press Enter to go back..." << std::endl;

    std::string str;
    std::cin >> str;

    return 0;
    }

    int Menu_B(Menu & menu)
    {
    int choice;
    int result = 0;

    do {
    choice = SharedMenuDisplay(menu);

    if (choice != 0 && menu.IsChildren(choice))
    result = menu.GetChildren(choice).Enter();

    } while (choice != 0);

    return result;
    }

    int Menu_B_SubMenu_X(Menu & menu)
    {
    ClearScreen();
    std::cout << "You have selected " << menu.GetName() << std::endl;
    std::cout << "> Type something and press Enter to go back..." << std::endl;

    std::string str;
    std::cin >> str;

    return 0;
    }

    int Menu_B_SubMenu_Y(Menu & menu)
    {
    ClearScreen();
    std::cout << "You have selected " << menu.GetName() << std::endl;
    std::cout << "> Type something and press Enter to go back..." << std::endl;

    std::string str;
    std::cin >> str;

    return 0;
    }

    int Menu_B_SubMenu_Z(Menu & menu)
    {
    ClearScreen();
    std::cout << "You have selected " << menu.GetName() << std::endl;
    std::cout << "> Type something and press Enter to go back..." << std::endl;

    std::string str;
    std::cin >> str;

    return 0;
    }

    int Menu_C(Menu & menu)
    {
    ClearScreen();
    std::cout << "You have selected " << menu.GetName() << std::endl;
    std::cout << "> Type something and press Enter to go back..." << std::endl;

    std::string str;
    std::cin >> str;

    return 0;
    }

    int main(int argc, char **argv)
    {
    Menu home(-1, "Home", &Menu_Home);

    home.Insert(1, "Menu Item A", &Menu_A);
    home.Insert(2, "Menu Item B", &Menu_;
    home.Insert(3, "Menu Item C", &Menu_C);

    home.GetChildren(1).Insert(1, "Sub Menu Item X", &Menu_A_SubMenu_X);
    home.GetChildren(1).Insert(2, "Sub Menu Item Y", &Menu_A_SubMenu_Y);
    home.GetChildren(1).Insert(3, "Sub Menu Item Z", &Menu_A_SubMenu_Z);

    home[2].Insert(1, "Sub Menu Item X", &Menu_B_SubMenu_X);
    home[2].Insert(2, "Sub Menu Item Y", &Menu_B_SubMenu_Y);
    home[2].Insert(3, "Sub Menu Item Z", &Menu_B_SubMenu_Z);

    return home.Enter();
    }

  10. Foarte sigur nu este de la monitor (dar este o foarte mica probabilitate sa ma insel). Fenomenul asta este intalnit atunci cand placa video este pe duca. Daca vrei sa-ti faci o idee atunci cauta pe youtube "video card reflow" sau "video card monitor lines". Unele simptome, precum felul in care liniile sunt afisate, difera in majoritatea cazuriluor. Deci sa nu crezi ca daca la altul arata alt fel de linii atunci nu este placa video problema. Uite un

    .
  11. E grele a vorbi limba romania. Cand te dai cocos, macar nu scoate capul afara, cand stii ca il ai plin de handel.

    Altul care vaneaza soareci intr-o turma de oi cand ii este foame.

    Nu am pretins niciodata ca sunt mare destept mare scolit mare "smecher"... semizeu. Dar hai ca poate reusesc sa explic pe intelesul tau. Daca eu, asa idiot, prost, retardat sau cum vrei tu sa ma numesti. Reusesc totusi sa ma descurc singur intr-o limba de programare. Atunci ce suntei voi astia cu scoli care mai de care, facultati si ce draq mai pretindeti voi ca aveti sau urmati? Acum nu ma intelege gresit (din nou). Nu spun ca esti prost. Doar lenes.

    Oricum, acesta va fi ultimul post facut de mine in acest topic. Nu-mi place sa fac off-topic aiurea.

  12. Intrebarile sunt bine venite pe acest forum caci ajuta la seo.

    Desigur, hai sa intrebam cum se porneste un PC. Daca tot ajuta la SEO.

    Am vazut ca tu esti arogant cu toti si iti recomand sa te lasi de sportul asta caci nu esti vreun semizeu.

    M-ai inteles gresit. Pur si simplu reactionez exagerat la intrebari stupide.

  13. Imi imaginez ca este ceva similar cu redirectele. Doar ca imita un client care doar se conecteaza si scuipa un link sau ceva asemanator in chat. Probabil nu va dura prea mult pana bot-ul va primi kick/ban dar reclama a fost facuta deja :D

  14. Daca libCurl este prea overkill atunci poate vei considera FTP Client Class.

    void TestFTP()
    {
    nsFTP::CFTPClient ftpClient;
    nsFTP::CLogonInfo logonInfo(_T("localhost"), 21, _T("anonymous"), _T("<a href="mailto:anonymous@user.com">anonymous@user.com"));

    // connect to server
    ftpClient.Login(logonInfo);

    // get directory listing
    nsFTP::TFTPFileStatusShPtrVec list;
    ftpClient.List(_T("/"), list);

    // iterate listing
    for( nsFTP::TFTPFileStatusShPtrVec::iterator it=list.begin();
    it!=list.end(); ++it )
    TRACE(_T("\n%s"), (*it)->Name().c_str());

    // do file operations
    ftpClient.DownloadFile(_T("/pub/test.txt"), _T("c:\\temp\\test.txt"));

    ftpClient.UploadFile(_T("c:\\temp\\test.txt"), _T("/upload/test.txt"));

    ftpClient.Rename(_T("/upload/test.txt"), _T("/upload/NewName.txt"));

    ftpClient.Delete(_T("/upload/NewName.txt"));

    // disconnect
    ftpClient.Logout();
    }

×
×
  • Create New...