2016-02-15 3 views
0

Я довольно новичок в C++, однако, я пытаюсь создать соль и перечный шум. Это почти закончено, только промежуточный я хочу перетасовать массив ints и независимо от того, что я делаю, и независимо от того, какую функцию тасования я использую, я всегда получаю отвратительное «требуемое отсюда», которое ничего мне не говорит. Вот мой код:C++ - shuffle: требуется отсюда

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 
#include <stdio.h> 
#include <random> 
#include <algorithm> 
#include <iterator> 



using namespace std; 
using namespace cv; 



int main(int argc, char** argv) 
{ 
cv::Mat m(256, 256, CV_8UC1, cv::Scalar(255)); 

     // Print it 
     // int counter = 0; 



     unsigned int range = 255 - 0 + 1; 
     int num = rand() % range ; 



     int x[256]; 
     for (int i = 0; i<256; i++){ 
      x[i]= i; 

     } 


     srand(17); 
     auto engine = std::default_random_engine{}; 
     shuffle(x[0], x[255], engine); 
     int coord[256][256]; 
     for (int t= 0; t<256; t++){ 
      coord[t][t] = x[t]; 
     } 

     for (int j = 0; j<256; j++){ 
      for (int k = 0; 0<256; k++) 
      {if (coord[j][k]<=num){ 
       cv::Mat black(m, cv::Rect(j, k, 1, 1)); 
       black = cv::Scalar(0, 0, 0); 
      } 

      } 
     } 

// Create a named window 
      cv::namedWindow("Test", cv::WINDOW_AUTOSIZE); 

      // Display 
      imshow("Test", m); 

      // Wait until a key is pressed 
      cv::waitKey(0); 

       return 0; 
     }; 

Ошибку я, кажется, вызвано этой линии:

shuffle(x[0], x[255], engine); 

Теперь я счастлив дать полный текст компилятора, но некоторые линии так долго, что невозможно сделать необходимые отступы, я пробовал. У кого-нибудь есть обходной путь?

+1

В будущем, пожалуйста, предоставьте [mcve], с подчеркнуть, на * минимальный *. Проблема полностью не связана с opencv и этими циклами и т. Д. –

+1

Также 'srand' не будет засеять ваш' std :: default_random_engine', который, как вам кажется, ожидается. Прочтите [doc] (http://en.cppreference.com/w/cpp/numeric/random). –

ответ

1

Вы должны передать итератор, а не значение.

Это должно быть

shuffle(std::begin(x), std::end(x), engine); 

или

shuffle(x, x + 256, engine);