2016-11-30 6 views
1

У меня есть эта странная проблема при попытке использовать этот код для реализации алгоритма быстрого выбора группы. Я использую двумерный динамически выделенный массив для хранения отдельных элементов в группах случайно созданного несортированного массива из 10 чисел. Когда я запускаю код с размером группы 2, 5 или 10, он отлично работает. Но когда я изменяю размер группы на число, которое оставило бы одну группу меньшей, чем другие, она ломается, когда я пытаюсь инициализировать содержимое массива на некоторые контрольные цифры. Спасибо за любой совет.динамическое нарушение доступа к массиву 2d с остатками

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <random> 
#include <array> 

using namespace std; 

int groupSize = 0; 
int groupSelect(int *, int, int, int); 

int main() 
{ 

    // randomize array of size 10 with entries between 1 and 20. 

    random_device rd; 
    mt19937 eng(rd()); 
    uniform_int_distribution<> distr(1, 20); 

    int max = 10; 

    int * Array; 
    Array = new int[max]; 

    for (int i = 0; i < max; i++) 
    { 
     Array[i] = distr(eng); 
    } 

    // display array contents (unsorted) 

    cout << "Array contents are:\n"; 
    for (int i = 0; i < max; i++) 
    { 
     cout << Array[i] << ", "; 
    } 

    cout << endl; 

    /*------------------------------------------------------------------------------*/ 

    groupSize = 3; 

    int poo = groupSelect(Array, 0, 9, 5); 

    return 0; 

    /*------------------------------------------------------------------------------*/ 


    delete[] Array; 
} 


int groupSelect(int* arr, int start, int end, int k) 
{ 
    bool remainder = false; 
    int size = 10; 

    if ((size % groupSize) != 0) 
    { 
     remainder = true; 

    } 

    //size = amount of groups of 5 (and remainder group) 
    size = size - (size % groupSize); 
    size = size/groupSize; 

    if(remainder) 
     size++; 


    cout << "Size = " << size << endl; 

    int** groups = new int*[size]; 
    for (int i = 0; i < size; ++i) 
    { 
     if (remainder == true) 
     { 
      if (size - i == 1) 
       groups[i] = new int[((size) % (groupSize))]; 
     } 
     else 
     groups[i] = new int[groupSize]; 
    } 


    int testV = 0; 
    for (int i = 0; i < size; i++) 
    { 

     int temp = groupSize; 
     if (size - i == 1) 
     { 
      if (remainder) 
       temp = size % groupSize; 
     } 
     for (int j = 0; j < temp; j++) 
     { 
      groups[i][j] = testV; // codes break here 
      testV++; 
     } 
    } 

    cout << "\nGroup arrays' contents\n" << endl; 
    for (int i = 0; i < size; i++) 
    { 
     for (int j = 0; j < groupSize; j++) 
     { 
      cout << "groups[" << i << "]["<<j<<"] contents = " << groups[i][j] << endl; 
     } 
    } 

    delete[] groups; 

    return 0; 
} 
+0

И нет, это ISN! 't закончен еще до реализации всего алгоритма, мне просто нужно помочь преодолеть этот камень преткновения Нарушения доступа –

ответ

0

У Вас есть ошибка в этой части: если остаток верно, но размер - 1 = 1 вы никогда бы не инициализировать массивы, а затем вы пытаетесь получить доступ к ним

for (int i = 0; i < size; ++i) 
{ 
    if (remainder == true) 
    { 
     if (size - i == 1) 
      groups[i] = new int[((size) % (groupSize))]; 
    } 
    else 
    groups[i] = new int[groupSize]; 
} 
+1

Ahh wow, классическая ошибка. Спасибо, что указали это. –

 Смежные вопросы

  • Нет связанных вопросов^_^