[ C / C++ ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by begin_end, 28 Apr 2015.

  1. Семён

    Семён New Member

    Joined:
    9 May 2015
    Messages:
    10
    Likes Received:
    1
    Reputations:
    0
    А что пишет-то, когда вылетает? Кто делает wsprintfA() ?
     
  2. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    636
    Likes Received:
    246
    Reputations:
    42
    Если использовать NativeApi, то
    lstrcatA(str1,str2);
    lstrcpyA(str1,str2);
    или же сишные прототипы
    strcat(str1,str2);
    strcpy(str1,str2);
    которые по сути являются оберткой для тех же NativeApi
     
    #22 #colorblind, 23 May 2015
    Last edited: 23 May 2015
  3. aladin1

    aladin1 Member

    Joined:
    16 Sep 2009
    Messages:
    330
    Likes Received:
    29
    Reputations:
    7
    я знал про lstrcatA() и lstrcpyA(), они из той же поэмы примерно что и wsprintfA, но зато теперь не компилируется, а показывает хоть в чем проблема - cannot convert parameter 1 from 'std::string' to 'LPSTR', как я и предполагал проблема в стрингах=), надо либо обрубать строку без string примочек, либо переводить полученную переменную string в char, а с фантиками типа strcat и strcpy, полагаю, будет тоже самое.
     
  4. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    636
    Likes Received:
    246
    Reputations:
    42
    Могу предложить, при использовании lstrcpyA, в параметрах передавать не переменные, а указатели на эти переменные. Уж прости, не знаю как это будет в кодесе на сях, т.к. не знаком с синтаксисом и никогда на них не писал, не считая вчерашнего примера)
     
  5. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Могу предложить выбрать уже: либо C++, либо C. Если C++, то lstrcat, wsprintf для склеивания строк и strchr - нафиг не нужны.
     
    _________________________
  6. aladin1

    aladin1 Member

    Joined:
    16 Sep 2009
    Messages:
    330
    Likes Received:
    29
    Reputations:
    7
    уже решил проблему, благодарю
     
  7. aladin1

    aladin1 Member

    Joined:
    16 Sep 2009
    Messages:
    330
    Likes Received:
    29
    Reputations:
    7
    Можно ли с помощью select() организовать цикл и выход из него по истечении определенного времени? Например:
    Code:
    fd_set rfds1;
    timeval tv1;
    FD_ZERO(&rfds1);
    FD_SET(0, &rfds1);
    tv1.tv_sec = 30;
    tv1.tv_usec = 0;
    
    While (timeout != 0)
    {
        ... // в течении 30 сек длится цикл
    }
    И как это должно выглядеть, если возможно вообще.
     
  8. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    636
    Likes Received:
    246
    Reputations:
    42
    Вообще, задержку обычно делают при помощи Sleep.
    Если тебе нужно в течении 30 секунд, выполнять некие манипуляции в цикле, то можно создать отдельный поток, а по истечении Sleep(30000), просто убить его.
     
  9. aladin1

    aladin1 Member

    Joined:
    16 Sep 2009
    Messages:
    330
    Likes Received:
    29
    Reputations:
    7
    со Sleep всё очевидно, на счет доп. потока тоже идея была, отложил пока, думал мб select'ом решается, не хотелось бы плодить кучу кода, ладненько, разберёмся)
     
  10. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,489
    Reputations:
    25
    С потоком который прихлопывается насильственно надежнее, а кода там не будет куча. Сделай обертку на получение и она верой и правдой прослужит тебе в куче кодесов где пригодится и не придется заново все писать. Со временем к ней добавится возможность юзать GET и POST запросы и все хорошо. Есть еще boost::asio, но ИМХО неудобная штука. Мне вообще ближе всего прямая работа с TDI. Куда приятнее чем winsock.
     
  11. aladin1

    aladin1 Member

    Joined:
    16 Sep 2009
    Messages:
    330
    Likes Received:
    29
    Reputations:
    7
    Code:
    void Myfunc()
    {
        while (!IP.eof()) // пока не достигнут конец файла
        {
            //... делаем определенные действия
        }
    }
    
    int main()
    {
        fstream IP;
        IP.open("ips.txt");
        Myfunc();
        IP.close();
    }
    Подскажите, как передать в Myfunc(), массив адресов IP полученный в main()
     
  12. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    Code:
    void Myfunc(std::fstream &ips) {...}
    ...
    Myfunc(IP);
     
    aladin1 likes this.
  13. aladin1

    aladin1 Member

    Joined:
    16 Sep 2009
    Messages:
    330
    Likes Received:
    29
    Reputations:
    7
    Благодарю, всё оказалось так просто, лишь немного поправил, авось кому пригодится тоже:
    Code:
    void Myfunc(fstream &IP)
    {
        while (!IP.eof()) // пока не достигнут конец файла
        {
            //... делаем определенные действия
        }
    }
    
    int main()
    {
        fstream IP;
        IP.open("ips.txt");
        Myfunc(IP);
        IP.close();
    }
     
  14. aladin1

    aladin1 Member

    Joined:
    16 Sep 2009
    Messages:
    330
    Likes Received:
    29
    Reputations:
    7
    А если в несколько потоков хочу запустить? пробую так:
    Code:
    void Myfunc(fstream &IP)
    {
        while (!IP.eof()) // пока не достигнут конец файла
        {
            //... делаем определенные действия
        }
    }
    
    int main()
    {
        fstream IP;
        IP.open("ips.txt");
        for (int counter = 0; counter < 2; counter ++ ){
        Thread = _beginthreadex(NULL, 0, Myfunc(IP), NULL, 0, NULL);
        }
        IP.close();
    }
    Получаю:
    error C2664: '_beginthreadex' : cannot convert parameter 3 from 'void' to 'unsigned int (__stdcall *)(void *)'

    пробовал менять "void Myfunc(fstream &IP)" на "unsigned __stdcall Myfunc(fstream &IP)", получил:
    error C2664: '_beginthreadex' : cannot convert parameter 3 from 'unsigned int' to 'unsigned int (__stdcall *)(void *)
     
  15. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    функция, которая передается в _beginthreadex должна иметь следующий прототип:
    Code:
    void( __cdecl *start_address )( void * )
    то есть возвращать uintptr_t, принимать в качестве параметра указатель на войд и иметь соглашение вызова stdcall.

    в твоем случае код должен выглядеть примерно так:

    Code:
    #include <fstream>
    #include <process.h>
    
    uintptr_t __stdcall Myfunc(void *data)
    {
        std::fstream *IP = reinterpret_cast<std::fstream*>(data);
    
        while (!IP->eof())
        {
        }
    
        return 0;
    }
    
    int main()
    {
        std::fstream IP;
        IP.open("ips.txt");
    
        for (int counter = 0; counter < 2; counter++)
        {
            uintptr_t Thread = _beginthreadex(NULL, 0, Myfunc, NULL, 0, NULL);
        }
        IP.close();
    }
    но лучше вместо этого трешака юзать std::thread и не парить себе мозги.
     
  16. aladin1

    aladin1 Member

    Joined:
    16 Sep 2009
    Messages:
    330
    Likes Received:
    29
    Reputations:
    7
    а если применить thread, как тогда будет выглядеть всё это дело? я ж не против, но масса людей сетует, что лучше юзать _beginthreadex из самой VS.
     
  17. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    как то так

    Code:
    #include <fstream>
    #include <thread>
    #include <vector>
    
    int main()
    {
        std::fstream ip_list;
        ip_list.open("ips.txt");
    
        std::vector<std::thread> threads;
    
        for (auto thread_index = 0; thread_index < 2; ++thread_index)
        {
            threads.push_back(std::thread([&]()
            {
                ip_list.clear(); // do something
            }));
        }
      
        for (auto current_thread = 0; current_thread < threads.size(); ++current_thread)
            threads[current_thread].join();
    
        ip_list.close();
    }
     
  18. aladin1

    aladin1 Member

    Joined:
    16 Sep 2009
    Messages:
    330
    Likes Received:
    29
    Reputations:
    7
    эхх, у меня VS 2008, забыл уточнить...
     
  19. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    тогда либо обновляйся, либо используй boost.
     
  20. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Подскажите универсальный справочник где можно почитать о классах, функциях и библиотеках C++. Не удобно читать о <string> в википедии... К примеру php.net можно полностью язык выучить сидя тупо на нем.