GNU/Linux >> Znalost Linux >  >> Linux

Chyba C++:Režim spánku nebyl v tomto rozsahu deklarován

V mém případě pomohlo napsat S skok a NE s leep – velmi zvláštní, ale fungovalo to!


Sleep je funkce Windows.

Pro Unix se podívejte na použití nanosleep (POSIX) nebo usleep (BSD; zastaralé).

A nanosleep příklad:

void my_sleep(unsigned msec) {
    struct timespec req, rem;
    int err;
    req.tv_sec = msec / 1000;
    req.tv_nsec = (msec % 1000) * 1000000;
    while ((req.tv_sec != 0) || (req.tv_nsec != 0)) {
        if (nanosleep(&req, &rem) == 0)
            break;
        err = errno;
        // Interrupted; continue
        if (err == EINTR) {
            req.tv_sec = rem.tv_sec;
            req.tv_nsec = rem.tv_nsec;
        }
        // Unhandleable error (EFAULT (bad pointer), EINVAL (bad timeval in tv_nsec), or ENOSYS (function not supported))
        break;
    }
}

Budete potřebovat <time.h> a <errno.h> , dostupný v C++ jako <ctime> a <cerrno> .

usleep je jednodušší na použití (stačí vynásobit 1000, takže je to funkce inline). Není však možné zaručit, že k tomuto spánku dojde po určitou dobu, je zastaralý a musíte extern "C" { } -include <unistd.h> .

Třetí možností je použít select a struct timeval , jak je vidět na http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 (takto víno emuluje Sleep , což je samo o sobě jen obal pro SleepEx ).

Poznámka :sleep (malé 's'), jehož deklarace je v <unistd.h> , není přijatelná náhrada, protože její zrnitost je sekundová, hrubší než u Windows' Sleep (velké 's'), které má přesnost v milisekundách.

Pokud jde o vaši druhou chybu, ___XXXcall je token specifický pro MSVC++ (stejně jako __dllXXX , __naked , __inline , atd.). Pokud opravdu potřebujete stdcall, použijte __attribute__((stdcall)) nebo podobně, abyste jej emulovali v gcc.

Poznámka :pokud váš cíl kompilace není binární soubor Windows a používáte Win32 API, použití nebo požadavek na stdcall je A Bad Sign™.


#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
    const long a=1000000;
    long j;
    cin >> j;
    usleep(a*j);
    puts("exit");
}

použijte usleep() Místo spánku a Nezapomeňte zahrnout unistd.h (Ne cunistd )


Jak používat usleep v programu C++ na linuxu:

Vložte to do souboru s názvem s.cpp

#include <iostream>
#include <unistd.h>
using namespace std;
int main() { 
  cout << "nitrate";
  cout << flush;
  usleep(1000000);
  cout << "firtilizers";
  return 0;
}

Zkompilujte jej a spusťte:

[email protected] ~/foo4/40_usleep $ g++ -o s s.cpp
[email protected] ~/foo4/40_usleep $ ./s
nitratefirtilizers

Vytiskl 'dusičnan', počkal 1 sekundu a pak vytiskl 'firtilizers'


Linux
  1. Můj příběh o Linuxu:Vyrostl jsem na PC Magazine, nikoli na cukroví

  2. [Opravena] chyba:„balík“ nebyl nalezen

  3. Opravit chybu ZipArchiv třídy nenalezen [PHP 7]

  1. Chyba tvrzení mutexu Pthread

  2. Chyba ldconfig:není symbolický odkaz

  3. Chyba libevent nenalezena v tmux

  1. Chyba kompilace RSAKeyFind (Make):rsakeyfind.cpp – „memcmp, read, close“ nebylo deklarováno v tomto rozsahu [Vyřešeno]

  2. Příkaz yum-config-manager nenalezen [Opravit]

  3. c_rehash :Chyba příkazu nenalezena – Řešení