Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 22

0
votes
answers
41 views
+10

如何啓動一個運行類函數的boost線程?

1

即時做一個C++類在內部,我想創建一個線程來執行類的功能,我該怎麼做?我給你看一些代碼。如何啓動一個運行類函數的boost線程?

成員函數我想在一個線程中運行:

void SocketServer::runServer(){ 
    bool connected; 
    tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), puerto)); 
    std::string data; 

    while(seguirFuncionando()){ 
     miSocket = new tcp::socket(io_service); 
     std::cout << "Waiting for connection...
"; 
     a.accept(*miSocket); 
     std::cout << "Connected
"; 
     connected = true; 
     try{ 
      while (connected){ 
       data = readStr(); 
       if (data.compare("")==0){ 
        std::cout << "End of connection.
"; 
       } 
       else{ 
        std::cout << data << "
"; 
       } 
      } 
     } 
     catch (std::exception& e){ 
     std::cerr << "Exception in thread: " << e.what() << "
"; 
     } 
    } 
} 

什麼我嘗試做:

void SocketServer::runThreadServer(){ 
    asio::thread t(runServer); 
} 

但它不編譯。錯誤:

沒有匹配函數調用'asio :: thread :: thread() 注意:候選是:asio :: thread :: thread(Function)[with Function = void(SocketServer :: *)( )]

我該怎麼做?

Thanx。

+1

你可能想嘗試用[boost.bind(http://www.boost.org/doc/libs/1_48_0/libs/bind/bind.html) – 2012-02-10 17:27:43

+0

@JoachimPileborg你能舉個例子嗎?即時通訊新的提振,而我有點失落:P – Alex 2012-02-10 17:29:25

沙发
0
4

像Joachim Pileborg說的,標準的做法是使用boost::bindboost::bind專門從C++對象及其成員函數構造一個名爲boost::function(可能在boost::thread的c'tor中傳遞)的構造。

事情是這樣的:

boost::thread t(boost::bind(&SocketServer::runServer, this)); 
+0

Thanx,這工作得很好:) Thanx valdo和Joachim。另一件事,我可以在哪裏學習如何提升Threads和Asio?我開發了一個客戶端 - 服務器應用程序,我需要處理得很好,但官方文檔不是很廣泛。我在哪裏可以得到很好的例子? Thanx – Alex 2012-02-10 17:41:30

+0

準確地說,'boost :: bind'不會創建'boost :: function'對象,它會創建* unknown *(無文檔,可以隨時更改)類型的對象,該類型可以分配給'boost ::功能「的適當簽名。 – 2012-02-10 17:45:46

0
votes
answers
10 views
+10

mq_notify只啓動一個線程

2

我想用mq_notify調用來啓動一個POSIX消息隊列的線程。一切似乎都正確,但我只能得到一個線程,它處理所有消息,但它永遠不會終止。我的印象是我會得到新線程來處理,這看起來不正確。mq_notify只啓動一個線程

沙发
0
3

首先,mq_notify()一次只能啓動一個線程。其次,每次將消息放入隊列時線程都不會啓動;它們只在空隊列獲取新消息時才啓動。第三,mq_notify()是一次性交易。一旦一個線程被觸發,如果你想在下一次空隊列收到消息時觸發一個新線程,你需要用mq_notify()重新註冊。通常你的threadfunc應該做的第一件事就是重新註冊。

由於您正在啓動一個線程並處理消息,我的猜測是您沒有像O_NONBLOCK那樣打開隊列,或者使用mq_setattr()重置它。當一個線程觸發時,您希望排除所有消息的隊列,以便下一次啓動另一個線程。如果隊列處於阻塞模式,您將在收到最後一條消息後阻塞,線程將永遠不會結束。在非阻塞模式下,您希望繼續閱讀,直到獲得errno == EAGAIN,然後結束該線程。你應該很樂意用新的線程去下一批消息。

+0

非常感謝Duck。非阻塞做到了。回想起來似乎很明顯。 – 2011-06-07 01:42:47

0
votes
answers
10 views
+10

C++ boost ::線程,如何啓動線程內的線程

6

如何在對象內啓動線程?例如,C++ boost ::線程,如何啓動線程內的線程

class ABC 
{ 
public: 
void Start(); 
double x; 
boost::thread m_thread; 
}; 

ABC abc; 
... do something here ... 
... how can I start the thread with Start() function?, ... 
... e.g., abc.m_thread = boost::thread(&abc.Start()); ... 

這樣,以後我可以這樣做,

abc.thread.interrupt(); 
abc.thread.join(); 

感謝。

沙发
0
6

使用boost.bind:

boost::thread(boost::bind(&ABC::Start, abc)); 

你可能需要一個指針(或一個shared_ptr):

boost::thread* m_thread; 
m_thread = new boost::thread(boost::bind(&ABC::Start, abc)); 
+0

謝謝蓋伊,它工作得很好。 – 2607 2012-02-26 23:50:26

板凳
0
15

你既不需要綁定,也不指針。

boost::thread m_thread; 
//... 
m_thread = boost::thread(&ABC::Start, abc); 
+0

+1:你說得對。有一個參數相當於使用綁定的構造函數。我更喜歡綁定,因爲我發現它更具可讀性。還有支持移動線程,我想我喜歡指針,因爲我知道發生了什麼(複製與移動),但希望一切都朝着移動... – 2012-02-27 21:26:59

+0

這應該是接受的答案 – user463035818 2017-06-01 14:08:43

0
votes
answers
10 views
+10

訪問嵌套類變量的問題

0

我想訪問我在嵌套類中聲明的變量,但是我無法在控制檯上得到我想要的答案。我想要的結果是100,但我得到的只是一個很長的數字。我似乎無法找到錯誤。這就是我寫的:訪問嵌套類變量的問題

#include <iostream> 

using namespace std; 

class shpia { 
public: 
    int tot; 

    class dhoma1 { 
    public: 
     int gjatesi; 

     int di() { 
      return gjatesi * gjatesi; 
     } 
    }; 

    dhoma1 dh1; 

    void redi(){ 
     cout<<dh1.di(); 
    } 
}; 

int main() 
{ 
    shpia::dhoma1 k; 
    k.gjatesi = 10; 
    shpia r; 
    r.redi(); 

    return 0; 
} 
沙发
0
4

沒有什麼讓你驚訝的結果。你似乎認爲

shpia::dhoma1 k; 
k.gjatesi=10; 

將定義一個dhoma1爲您將創建的所有shpia對象。這是錯誤的。您只定義了與shpia對象無關的shpia::dhoma1對象。

當你再定義

shpia r; 

這將在r另一dhoma1創建,無關的第一個,這是未初始化。因此,當你打印正方形時,你會感覺到無意義。

板凳
0
1

您正在訪問未初始化的內存。 在這裏,您創建嵌套類的實例,並初始化它的成員:

shpia::dhoma1 k; 
k.gjatesi=10; 

在這裏你創建主類,無關與k的一個實例。它已經有一個嵌套類的成員變量定義本身(r.dh1)

shpia r; 
r.redi(); 
return 0; 

由於這種新的聲明中,嵌套類的r沒有定義的值,當你調用redi(),你將訪問未定義的內存中,因此得到一些隨機數。根據應用程序的實際運行時佈局,此值可能會更改。它是未定義的,您必須在使用它之前對其進行定義。

爲了解決這個問題,你應該使用的主類的嵌套類成員,而不是像這樣:

shpia r; 
r.dh1.gjatesi = 10; 
r.redi(); 
return 0; 
+0

謝謝。它解決了 –

+1

@SalvadoreRina如果這個答案解決了你的問題,然後接受它。歡迎來到這裏:) –

0
votes
answers
10 views
+10

C++複製分配和移動分配不被稱爲

-1

我想實現複製和移動任務,但我不明白我應該如何使用它們。我已閱讀以下主題
When did copy assignment operator called?
但它沒有爲我工作。C++複製分配和移動分配不被稱爲

類:

class Directory{ 

    string name; 
public: 
     Directory(string name):name(name) { 

     } 
     ~Directory() { 
      cout << "Deleting was called" <<endl; 

      } 

     Directory& operator=(Directory& other){ 
      cout << "cp assigment" <<endl; 
      return *this; 
     } 
     Directory& operator=(Directory&& other){ 
      cout << "move assigment" <<endl; 
      return *this; 
     } 
}; 

主要

int main() 
{ 

    Directory* dir = new Directory("alex"); 
    Directory* dir2; 
    dir = dir2; 

    cout<<"done"<<endl; 
}; 

我想知道拷貝賦值和分配移動時調用。提前致謝。

+0

賦值是針對您的案例中的指針('Directory *')完成的。刪除'*'和'new',它會起作用。 – Scheff

+1

你正在使用指針,你會如何期望副本被稱爲? – user0042

+1

'dir = dir2;'調用內置的指針複製賦值運算符,而不是您的類複製賦值運算符。 – VTT

沙发
0
1

我的第一個評論,我建議刪除所有* s和new

因此,主要功能變成:

int main() 
{ 
    Directory dir = Directory("alex"); 
    Directory dir2; 
    dir2 = dir; // <-- fixed, original was: dir = dir2; 

    cout<<"done"<<endl; 
    return 0; // <-- fixed, return is strictly recommended for every non-void function 
} 

編譯...

錯誤:東西是錯誤的Directory dir = Directory("alex");(刪除拷貝構造函數的使用)。使用由Directory("alex")創建的臨時實例初始化dir

這是很容易改變:

int main() 
{ 
    Directory dir("alex"); // <-- fixed: direct construction 
    Directory dir2; 
    dir2 = dir; 

    cout<<"done"<<endl; 
    return 0; 
} 

編譯...

錯誤:東西是錯誤的Directory dir2;

A yepp。您定義了構造函數Directory(string name);。這將禁止在此處需要的默認構造函數的自動創建。

我們要麼可以在默認的構造函數添加到class Directory

Directory() = default; 

,或者我們可以改善現有的非默認的構造函數,以便它可以被使用的默認構造函數:

Directory(string name = string()): name(name) { } 

整個來源:

#include <iostream> 
#include <string> 
using namespace std; 

class Directory{ 

    string name; 
public: 
     Directory(string name = string()):name(name) { 

     } 
     ~Directory() { 
      cout << "Deleting was called" <<endl; 

      } 

     Directory& operator=(Directory& other){ 
      cout << "cp assigment" <<endl; 
      return *this; 
     } 
     Directory& operator=(Directory&& other){ 
      cout << "move assigment" <<endl; 
      return *this; 
     } 
}; 

int main() { 
    //Directory dir = Directory("alex"); 
    Directory dir("alex"); 
    Directory dir2; 
    dir2 = dir; 

    cout<<"done"<<endl; 
    // your code goes here 
    return 0; 
} 

現在,它編譯es和作品。

輸出:

cp assigment 
done 
Deleting was called 
Deleting was called 

你可以看到它住在ideone

板凳
0
1

也許嘗試這樣的:

#include <iostream> 
#include <string> 

using namespace std; 

class Directory{ 
public: 
     string name; 

     Directory() { 
      cout << "Constructor 1 was called" <<endl;    
     } 

     Directory(string name):name(name) { 
      cout << "Constructor 2 was called" <<endl;    
     } 

     ~Directory() { 
      cout << "Deleting was called" <<endl; 
     } 

     Directory(const Directory& other){ 
      cout << "cp cons" <<endl; 
     } 

     Directory& operator=(const Directory& other){ 
      cout << "cp assigment" <<endl; 
      return *this; 
     } 

     Directory& operator=(Directory&& other){ 
      cout << "move assigment" <<endl; 
      return *this; 
     } 
}; 


int main() 
{ 

    Directory dir = Directory("alex"); 
    Directory dir2; 
    dir2 = dir; 

    cout << "done " << dir.name << dir2.name << endl; 
}; 

我改變了代碼,以便它不使用指針,增加額外的構造函數(注意拷貝構造函數),並增加了一些額外的印刷。

我得到這樣的輸出:

Constructor 2 was called 
Constructor 1 was called 
cp assigment 
done alex 
Deleting was called 
Deleting was called 

從這裏就可以看到你的拷貝賦值是不正確的,它仍然打印「亞歷克斯」,但我猜你是隻在功能感興趣被調用,而不是他做。

+0

謝謝你的努力。真的行。我試圖從這個例子中學習。我不明白爲什麼你的代碼有效,而且我的工作不正常。編輯後的主要部分是相同的。 –

+0

@AlexLavriv - 你是否像我一樣添加了一個拷貝構造函數? – 4386427

+0

@AlexLavriv - 此鏈接可能會對您有所幫助:https://stackoverflow.com/a/9945598/4386427 – 4386427

0
votes
answers
10 views
+10

沒有意思的標準偏差C++

-2

我有一個功能強大的程序來查找許多整數的標準偏差。但是,我想找到一種方法來獲得沒有平均值的標準偏差。沒有意思的標準偏差C++

我理解的公式爲: 標準偏差= SQRT [(B - A^2/N)/ N]

其中

A是數據值的總和;

B是平方數據值的總和;

N是數據值的數量。

但我怎麼會寫在代碼? 這是我對偏差的功能,但它使用的意思是:

float calculateSD(int arr[]) 
{ 
float sum = 0.0, mean, standardDeviation = 0.0; 

int i; 

for(i = 0; i < SIZE; ++i) 
{ 
    sum += arr[i]; 
} 

mean = sum/SIZE; 

for(i = 0; i < SIZE; ++i) 
    //convert standardDeviation to float 
    standardDeviation += static_cast<float>(pow(arr[i] - mean, 2)); 
//return standard deviation 
return sqrt(standardDeviation/SIZE); 

}  
+0

'得到標準差不mean'我可以問爲什麼? – DimChtz

+0

家庭作業也許? – twoleggedhorse

+1

你有總和和數量。劃分.....來吧。 –

沙发
0
0
#include <iostream> 
#include <vector> 
#include <numeric> 
#include <math.h> 

double stddev(std::vector<int> const& data) 
{ 
    auto stats = std::make_pair(0.0,0.0); 
    stats = std::accumulate(data.begin(), data.end(), stats, 
          [](std::pair<double,double> stats, double x) { 
           stats.first += x; 
           stats.second += x * x; 
           return stats; 
          }); 
    return sqrt((stats.second - pow(stats.first, 2.0)/data.size())/data.size()); 
} 

int main(int argc, const char *argv[]) 
{ 
    std::cout << stddev({1,1,1,1}) << std::endl; 
    std::cout << stddev({1,2,1,2}) << std::endl; 
    std::cout << stddev({1,10,1,10}) << std::endl; 
} 
0
votes
answers
9 views
+10

多輸出指針指向C++中的文件

-4

我想要兩個指向C++中相同文件的指針。多輸出指針指向C++中的文件

#include <fstream> 

int main() 
{ 
    double a; 
    std::ofstream fout1("out.txt"); 
    fout1 << "CASE A:"<<std::endl; 

    std::ofstream fout2("out.txt", std::fstream::app); 
    fout2 << "CASE B:" <<std::endl; 

    for (int i=0; i < 3; i++){ 
     a = i*i; 
     fout1 << a << std::endl; 
     fout2 << 10+a <<std::endl; 
    } 
    return 0; 
} 

此代碼給我:

CASE A: 
0 
1 
4 


11 
14 

但我想:

CASE A: 
0 
1 
4 
CASE B: 
10 
11 
14 

在我真正的代碼變量 「a」 是一個龐大的計算,所以不會做一個雙是一個好的解決方案。我想到了兩種解決方案:

  1. 使用double在矢量中保存「a」
  2. 使用兩個指針指向同一個文件(當前問題);

我覺得2是最好的,所以我怎樣才能使用兩個指針到同一個文件?

+0

你想「0」之前寫的「情況B」中,但之後出現*。*「0」的文件,是正確的? – Beta

沙发
0
0

使用兩個流寫入同一個文件會變成一場噩夢,您必須在任何一個流發生變化的位置刷新和重新同步,以確保其他人看到這些更改。更好地消除這種想法並使用單一輸出來解決問題。

如果你想堅持的想法,你要切換到不同的流調用每個時間:

firstStrm.flush(); 
secondStrm.tie(firstStrm); 
secondStrm.seekp(firstStrm.tellp()) 

其中firstStrm是你完成的流與寫作和secondStrm是流你想要開始寫作。

+0

這不會做OP所需要的,因爲在你將所有數據寫入'fout1'之前,你不知道文件中的哪個位置開始用'fout2'寫入。 – 1201ProgramAlarm

板凳
0
0

您所遇到的根本問題是寫入fout1以前寫入fout2。由於您不知道文件中的哪個位置需要開始寫出「CASE B」數據,因此您必須等到所有「CASE A」數據在「CASE B」開始之前寫入。

您可以將CASE B數據寫入不同的(臨時)文件,然後在完成CASE A(並刪除臨時文件)時複製該數據,累積要寫入字符串的數據緩衝區,然後寫出來。

或者做你的選擇1,即將所有a值保存到vector,然後在最後處理這些值。這可能是最快的方法,但是如果你有大量的數據內存可能是一個問題,你必須採用兩種文件方法。

地板
0
0

如果你想要兩個指針到同一個文件,然後創建它們:

std::ofstream fout("out.txt"); 
std::ofstream * fout1(&fout); 
std::ofstream * fout2(&fout); 

的問題,有一個以上的指針輸出流,你可以有數據輸出隨機順序,取決於執行情況。多線程或多任務更糟糕。

另一種解決方案是通過引用將輸出流傳遞給構造函數或函數。一個類可以有一個副本流:

class Hello 
{ 
    public: 
    Hello(std::ostream& output) 
    : m_output(output) 
    { } 
    private: 
    std::ostream& m_output; 
}; 
0
votes
answers
8 views
+10

爲什麼這個引用綁定不合格?

5

考慮以下代碼:爲什麼這個引用綁定不合格?

int **p = 0; 

class S { 
public: 
    explicit operator int**&() { 
     return p; 
    } 
}; 

int main() { 
    S a; 
    int *const*&b (a); // error in both g++-7 and clang-5.0 with "-std=c++17" 
    return 0; 
} 

你們會同意

  • int**資格轉換爲int*const*是可能的,
  • int *const*&b (a)直接初始化

首先,我們參考來自n4700的11.6.3段落[dcl.init.ref]。

的參考輸入「CV1T1 (= int*const*)」是由一種類型的表達式初始化「CV2T2 (= S)」如下:

  • 如果參考是一個左值參考和初始化表達式
    • ...
    • 具有類類型(即,T2是一個類型),其中T1不引用相關於T2,並且可以被轉換成類型的左值「CV3T3」,其中「CV1T1」是參考兼容「CV3T3」(這種轉換通過枚舉適用轉換函數(16.3.1.6)和通過重載解析(16.3)選擇最好的一個所選擇的),

然後的引用綁定到在第一種情況下的初始化表達式左值和到在第二種情況下轉換的左值結果...

這裏,我們預計T3int*const*如上所述,是否可能轉換是根據16.3.1.6第1段[over.match.ref]確定的。

...假設「參照CV1T」是基準是 初始化的類型,和「CVS」是初始值設定表達式的類型,與S類類型,候選功能選擇如下:

  • ...對於直接初始化,那些顯式轉換函數該 沒有內S和產量類型隱藏的「左值參考CV2T2」或「CV2T2」或「右值參照CV2T2」,分別其中T2T相同,或者可以轉換爲T類型,並且資格轉換也是候選功能

這裏,S::operator int**&產量「左值參照T2 (= int**)」,它可以通過一個資格轉換被轉換爲T (= int*const*)在這裏,我們可以說轉換是可能的,但是程序在g ++ - 7和clang-5.0中都不被接受。這是爲什麼?

+1

完全出於同樣的原因,爲什麼'int&a = 1;'無法編譯,但我不知道足夠引用任何特定段落的標準。 – Rakete1111

+0

@ Rakete1111這是爲什麼?在我的情況下,轉換產生一個左值。 – b1sub

+0

但是,左值的類型是'int **',但是你需要'int * const *',所以發生了轉換。 – Rakete1111

沙发
0
7

我們正在尋找的參考初始化規則是[dcl.init.ref]

的參考輸入「CV1T1」是由一種類型的表達式「CV2T2」初始化如下:

我們有cv1T1 as int* const* and cv2T2 as S。然後,我們經過仔細下一節:

如果引用是一個左值引用和初始化表達式

  • 是一個左值(但不是位域),以及「CV1 T1」是參考兼容「CV2 T2」,或
  • 具有類類型(即,T2是一個類型),其中,T1是不能引用相關於T2,並且可以被轉換爲左值類型的「 cv3 T3「,其中」cv1 T1「與」cv3 T3「參考兼容(this轉換是通過枚舉適用轉換功能中選擇([over.match.ref])和選擇最佳的一個通過載分辨率),

那麼參考結合到初始化表達式左值在第一種情況下,並在第二種情況下(或者在任何情況下)轉換爲對象的適當基類子對象的左值結果。

我們的參考是一個左值參考。初始化表達式是一個左值,但這兩種類型不是reference-compatible,所以第一個項目符號不適用。

初始值設定項表達式具有非參考相關的類類型,但不能轉換爲參考兼容類型。參考兼容部分很重要。 int**不是參考兼容int* const*,而前者可以轉換爲後者,結果不會是一個左值 - 這也是必需的。

所以,本節不適用,我們move on

否則,引用應該是對非易失性常量類型的左值引用(即cv1應該是const),或者引用應該是右值引用。

我們的參考資料不符合這些標準,因此初始化不合格。


這種失敗的一個簡化版本是:

int* pi; 
int const*& r = pi; // error 

我們無法通過資格轉換去的時候,我們有一個左參考非const類型。

+0

我認爲**此用戶定義的轉換序列**的第二個標準轉換序列僅包含限定轉換,因此左值依然存在。爲什麼這是不可能的? – b1sub

+1

@ b1sub這些類型的問題對提問者的滿意度總是基本無法回答。直接的答案是資格轉換是根據[轉換價值](http://eel.is/c++draft/conv#qual-3)來定義的。 – Barry

+0

您的評論足夠了。我已經忽略了你提到的「prvalue」部分。 – b1sub

0
votes
answers
8 views
+10

錯誤53:文件未找到,而是所有的DLL都存在於路徑中

0

我創建了一個DLL(使用C++),它依賴於sqlite3.dll(用於數據庫訪問& sqlcipher),我試圖使用VBA來訪問它。在VBA我使用以下聲明:錯誤53:文件未找到,而是所有的DLL都存在於路徑中

Declare Function GetData_VBA Lib "xyz.dll" (ByVal path As String, ByVal id As String, ByRef inputArr() As String, ByRef output() As String) As Boolean 

早些時候當DLL是不依賴於sqlite3.dll它工作正常,但是當我介紹sqlite3.dll它開始嘔吐錯誤

錯誤53:xyz.dll沒有找到

我試圖改變聲明

Declare Function GetData_VBA Lib "C:documentsuser...projectsxyz.dll" (ByVal path As String, ByVal id As String, ByRef inputArr() As String, ByRef output() As String) As Boolean 

但仍顯示相同的事情。我用dependency walker來檢查對xyz.dll的所有依賴。我嘗試將所有xyz.dll & sqlite3.dll放在同一位置,但仍然是相同的錯誤。

+0

你的dll是否在C++環境中測試過? –

+0

sqlite3.dll在您的PATH環境變量中的位置,如果不是,則考慮添加它。或者,如果您正在控制其安裝位置,則可以使用特定位置的LoadLibrary手動加載它。 –

+0

您確定您的* .dll *和* sqlite3.dll *之間沒有架構不匹配(32/64位)嗎? – CristiFati

沙发
0
0

cryptlib.lib缺少sqlite3.dll從屬關係。我已經提供了.lib文件,它工作。

0
votes
answers
8 views
+10

在C++中生成六位數字

-2

我有問題,應該生成六位數字的函數。這似乎是程序生成的數字,但他們總是以1 Six digit numbers在C++中生成六位數字

開始和多數民衆,使問題的一部分:

void generateNumbers(int &len, int arr[]) { 
    srand(time(0)); 

    cout << "How many numbers to generate: "; 
    cin >> len; 

    if (len <= 0 || len > 100) { 
     cout << "
 Chose number between 1 - 100
"; 
     generateNumbers(len, arr); 
    } else { 
     cout << "

The numbers: 
"; 

     for (int i = 0; i < len; i++) { 
      arr[i] = (rand() % 999999) + 100000; 
      cout << endl << arr[i]; 

     } 
    } 
} 

我pobably知道蘭特()%999999 + 100000是錯誤的但我嘗試了不同的方式,並沒有一個工作。提前致謝!

+1

你只需要因'蘭特()%90萬+ 100000' –

+1

爲000000一個六位數字?或者是第一個六位數字100000?在後一種情況下,您需要一個介於0和899999之間的隨機數並將偏移量添加到該數字中。 –

+0

@MartinBonner由於它包含的事實,它錯誤的是'900000' –

沙发
0
0

等式rand() % 900000 + 100000會給你正確的值,但是rand is considered harmful

相反,我建議你使用vectormt19937。既然你已抓獲你在len尋找數,你可以這樣做:

vector<int> arr(len); 

generate(begin(arr), end(arr), [g = std::mt19937{std::random_device{}()}]() mutable { return g() % 900000 + 100000; }); 

Live Example